5.4. 为项目配置出口防火墙
作为集群管理员,您可以为项目创建一个出口防火墙,用于限制离开 OpenShift Container Platform 集群的出口流量。
5.4.1. 出口防火墙在一个项目中的工作原理 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用一个出口防火墙来限制集群内的一些 pod 或所有 pod 可以访问的外部主机。出口防火墙适用于以下情况:
- pod 只能连接到内部主机,且无法启动到公共互联网的连接。
 - pod 只能连接到公共互联网,且无法启动到 OpenShift Container Platform 集群以外的内部主机的连接。
 - pod 无法访问 OpenShift Container Platform 集群外的特定内部子网或主机。
 - pod 只能连接到特定的外部主机。
 
例如,您可以允许某一个项目访问指定的 IP 范围,但拒绝其他项目对同一 IP 范围的访问。或者,您可以限制应用程序开发人员从 Python pip 镜像进行更新,并强制更新仅来自批准的源。
					您可以通过创建一个 EgressFirewall 自定义资源(CR)来配置出口防火墙策略。出口防火墙与满足以下任一条件的网络流量匹配:
				
- CIDR 格式的 IP 地址范围
 - 解析为 IP 地址的 DNS 名称
 - 端口号
 - 协议是以下协议之一: TCP、UDP 和 SCTP
 
5.4.1.1. 出口防火墙的限制 复制链接链接已复制到粘贴板!
出口防火墙有以下限制:
- 
								项目不能有多个 
EgressFirewallCR。 - 
								出口防火墙规则不适用于通过路由器的网络流量。任何有权创建 
RouteCR 对象的用户,都可以通过创建指向禁止的目的地的路由来绕过出口防火墙策略规则。 - 出口防火墙不适用于主机网络命名空间。启用主机网络的 Pod 不受出口防火墙规则的影响。
 如果您的出口防火墙包含
0.0.0.0/0的拒绝规则,则阻止访问 OpenShift Container Platform API 服务器。您必须为每个 IP 地址添加允许规则,或使用出口策略规则中的nodeSelector类型允许规则来连接到 API 服务器。以下示例演示了确保 API 服务器访问所需的出口防火墙规则的顺序:
EgressFirewallAPI 服务器访问示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
- <namespace>
 - 指定出口防火墙的命名空间。
 - <api_server_address_range>
 - 指定包含 OpenShift Container Platform API 服务器的 IP 地址范围。
 - <cidrSelector>
 指定
0.0.0.0/0值来设置全局拒绝规则,阻止访问 OpenShift Container Platform API 服务器。要查找 API 服务器的 IP 地址,请运行
oc get ep kubernetes -n default。如需更多信息,请参阅 BZ#1988324。
- 
								每个项目最多可定义一个具有最多 8,000 个规则的 
EgressFirewall对象。 - 如果您在 Red Hat OpenShift Networking 中使用带有共享网关模式的 OVN-Kubernetes 网络插件,返回入口回复会受到出口防火墙规则的影响。如果出口防火墙规则丢弃入口回复目的地 IP,流量将被丢弃。
 - 通常,在出口防火墙策略中使用域名服务器(DNS)名称不会影响通过 CoreDNS 进行本地 DNS 解析。但是,如果您的出口防火墙策略使用域名,并且外部 DNS 服务器处理受影响 pod 的 DNS 解析,则必须包含允许访问 DNS 服务器的 IP 地址的出口防火墙规则。
 
违反这些限制会导致项目的出口防火墙出现问题。因此,所有外部网络流量都会被丢弃,这可能会给您的组织造成安全风险。
						kube-node-lease、kube-public、kube-system、openshift 和 openshift- 项目中创建一个 EgressFirewall 资源。
					
5.4.1.2. 出口防火墙策略规则的匹配顺序 复制链接链接已复制到粘贴板!
OVN-Kubernetes 根据定义的顺序评估出口防火墙策略规则,从第一个到最后一个的顺序。第一个与 pod 的出口连接匹配的规则会被应用。该连接会忽略后续的所有规则。
5.4.1.3. 域名服务器 (DNS) 解析如何工作 复制链接链接已复制到粘贴板!
如果您在 egress 防火墙策略规则中使用 DNS 名称,则正确解析域名会受到以下限制:
- 域名更新会根据生存时间(TTL)持续时间进行轮询。默认情况下,持续时间为 30 分钟。当出口防火墙控制器查询本地名称服务器以获取域名时,如果响应包含 TTL 且 TTL 小于 30 分钟,控制器会将该 DNS 名称的持续时间设置为返回的值。每个 DNS 名称都会在 DNS 记录的 TTL 过期后查询。
 - 在需要时,pod 必须通过相同的本地名称服务器解析域名。否则,egress 防火墙控制器和 pod 已知的域的 IP 地址可能会有所不同。如果主机名的 IP 地址不同,则出口防火墙的强制实施可能不一致。
 - 
								因为出口防火墙控制器和 pod 异步轮询相同的本地名称服务器,所以 pod 可能会在出口控制器执行前获取更新的 IP 地址,从而导致竞争条件。由于这个限制,仅建议在 
EgressFirewall对象中使用域名来更改 IP 地址的域。 
5.4.1.3.1. 改进了 DNS 解析并解析通配符域名 复制链接链接已复制到粘贴板!
在某些情况下,与 DNS 记录关联的 IP 地址会频繁更改,或者您可能希望在出口(egress)防火墙策略规则中指定通配符域名。
							在这种情况下,OVN-Kubernetes 集群管理器为每个出口防火墙策略规则中使用的每个唯一 DNS 名称创建一个 DNSNameResolver 自定义资源对象。此自定义资源存储以下信息:
						
改进了出口防火墙规则的 DNS 解析只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
DNSNameResolver CR 定义示例
其中:
- <name>
 - 指定 DNS 名称。这可以是标准 DNS 名称或通配符 DNS 名称。对于通配符 DNS 名称,DNS 名称解析信息包含与通配符 DNS 名称匹配的所有 DNS 名称。
 - <dnsName>
 - 
										指定与 
spec.name字段匹配的解析 DNS 名称。如果spec.name字段包含通配符 DNS 名称,则会创建多个dnsName条目,其中包含在解析时与通配符 DNS 名称匹配的标准 DNS 名称。如果通配符 DNS 名称也可以成功解析,则此字段也存储通配符 DNS 名称。<ip> 指定与 DNS 名称关联的当前 IP 地址。 - <ttlSeconds>
 - 指定最后一次生存时间(TTL)持续时间。
 - <lastLookupTime>
 - 指定最后一次查找时间。
 
							如果在 DNS 解析 DNS 名称的过程中,查询中的 DNS 名称与 DNSNameResolver CR 中定义的任何名称匹配,那么在 CR status 字段中会相应地更新之前的信息。如果 DNS 通配符名称查找失败,会在默认的 TTL 为 30 分钟后重试请求。
						
							OVN-Kubernetes 集群管理器监视对 EgressFirewall 自定义资源对象的更新,并在更新发生时创建、修改或删除与这些出口防火墙策略关联的 DNSNameResolver CR。
						
								不要直接修改 DNSNameResolver 自定义资源。这可能导致出口防火墙的不需要的行为。
							
5.4.2. EgressFirewall 自定义资源(CR) 复制链接链接已复制到粘贴板!
					您可以为出口防火墙定义一个或多个规则。规则是一个 Allow 规则,也可以是一个 Deny 规则,它包括规则适用的流量规格。
				
					以下 YAML 描述了 EgressFirewall CR:
				
EgressFirewall 对象
其中:
- <OVN>
 - 
								对象的名称必须是 
default。 - <egress_rules>
 - 指定一个或多个出口网络策略规则的集合,如以下部分所述。
 
5.4.2.1. EgressFirewall 规则 复制链接链接已复制到粘贴板!
						以下 YAML 描述了 EgressFirewall 资源的规则。用户可以选择 CIDR 格式的 IP 地址范围、域名,或使用 nodeSelector 字段来允许或拒绝出口流量。egress 小节需要一个包括一个或多个对象的数组。
					
出口策略规则小节
其中:
- <type>
 - 
									指定规则的类型。该值必须是 
Allow或Deny。 - <to>
 - 
									指定描述出口流量匹配规则的小节,该规则指定 
cidrSelector字段或dnsName字段。您不能在同一规则中使用这两个字段。 - <cidr_range>
 - 指定 CIDR 格式的 IP 地址范围。
 - <dns_name>
 - 指定 DNS 域名。
 - <nodeSelector>
 - 
									指定标签,它们是用户定义的键和值对。标签附加到对象,如 pod。
nodeSelector允许选择一个或多个节点标签,并附加到 pod。 - <ports>
 - 指定描述规则的网络端口和协议集合的可选字段。
 
端口小节
ports: - port: protocol:
ports:
- port:
  protocol:
其中:
- <port>
 - 
									指定网络端口,如 
80或443。如果为此字段指定一个值,还必须为protocol字段指定一个值。 - <protocol>
 - 
									指定网络协议。该值必须是 
TCP、UDP或SCTP。 
5.4.2.2. EgressFirewall CR 示例 复制链接链接已复制到粘贴板!
以下示例定义了几个出口防火墙策略规则:
其中:
- <egress>
 - 指定出口防火墙策略规则对象的集合。
 
						以下示例定义了一个策略规则,即如果流量使用 TCP 协议和目标端口 80,或任何协议和目标端口 443,则拒绝通过 172.16.1.1/32 IP 地址到主机的流量。
					
5.4.2.3. 使用 nodeSelector 的 EgressFirewall CR 示例 复制链接链接已复制到粘贴板!
						作为集群管理员,您可以使用 nodeSelector 字段指定标签来允许或拒绝集群中节点的出口流量。标签可以应用到一个或多个节点。标签很有用,因为不是为每个节点 IP 地址添加手动规则,所以您可以使用节点选择器创建一个标签,以允许出口防火墙后面的 pod 访问主机网络 pod。以下是带有 region=east 标签的示例:
					
5.4.3. 创建 EgressFirewall 自定义资源(CR) 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为项目创建一个出口防火墙策略对象。
						如果项目已有 EgressFirewall 资源,您必须编辑现有策略来更改出口防火墙规则。
					
先决条件
- 使用 OVN-Kubernetes 网络插件的集群。
 - 
							安装 OpenShift CLI (
oc) 。 - 您需要使用集群管理员身份登陆到集群。
 
流程
创建策略规则:
- 
									创建一个 
<policy_name>.yaml文件,其中<policy_name>描述出口策略规则。 - 
									在文件中定义 
EgressFirewall对象。 
- 
									创建一个 
 运行以下命令来创建策略对象。将
<policy_name>替换为策略的名称,<project>替换为规则应用到的项目。oc create -f <policy_name>.yaml -n <project>
$ oc create -f <policy_name>.yaml -n <project>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 成功输出列出了
egressfirewall.k8s.ovn.org/v1名称以及创建的状态。- 
							可选:保存 
<policy_name>.yaml文件,以便在以后进行修改。