20.3. 为项目配置出口防火墙
作为集群管理员,您可以为项目创建一个出口防火墙,用于限制离开 OpenShift Container Platform 集群的出口流量。
从 OpenShift Container Platform 4.14 开始,OpenShift SDN CNI 已被弃用。自 OpenShift Container Platform 4.15 起,网络插件不是新安装的选项。在以后的发行版本中,计划删除 OpenShift SDN 网络插件,并不再被支持。红帽将在删除前对这个功能提供程序错误修正和支持,但不会再改进这个功能。作为 OpenShift SDN CNI 的替代选择,您可以使用 OVN Kubernetes CNI。如需更多信息,请参阅 OpenShift SDN CNI 删除。
20.3.1. EgressNetworkPolicy 自定义资源在项目中如何工作 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用一个出口防火墙来限制集群内的一些 pod 或所有 pod 可以访问的外部主机。您可以通过创建一个 EgressNetworkPolicy 自定义资源(CR)来配置出口防火墙策略。
出口防火墙适用于以下情况:
- pod 只能连接到内部主机,且无法开始连接到公共互联网。
- pod 只能连接到公共互联网,且无法启动到 OpenShift Container Platform 集群以外的内部主机的连接。
- pod 无法访问 OpenShift Container Platform 集群外的特定内部子网或主机。
- pod 只能连接到特定的外部主机。
例如,您可以允许某一个项目访问指定的 IP 范围,但拒绝其他项目对同一 IP 范围的访问。或者您可以限制应用程序开发人员从 Python pip 的镜像点进行更新,并强制要求更新只能来自于批准的源。
在 EgressNetworkPolicy CR 中,您可以匹配满足以下条件的网络流量:
- CIDR 格式的 IP 地址范围
- 解析为 IP 地址的 DNS 名称
20.3.1.1. EgressNetworkPolicy CR 的限制 复制链接链接已复制到粘贴板!
出口防火墙有以下限制:
-
项目不能有多个
EgressNetworkPolicyCR。允许使用多个EgressNetworkPolicyCR 创建,但不应该这样做。当您创建多个自定义资源时,您会收到以下信息:丢弃所有规则。实际上,所有外部流量都会被丢弃,这可能会给您的组织造成安全风险。 - 您必须将 OpenShift SDN 配置为使用网络策略或多租户模式来配置出口防火墙。如果您使用网络策略模式,则出口防火墙只与每个命名空间的一个策略兼容,且无法用于共享网络的项目,如全局项目。
-
每个项目最多可定义一个最多具有 1000 个规则的
EgressNetworkPolicyCR。 -
default项目无法使用出口防火墙。 当在多租户模式下使用 OpenShift SDN 网络插件时,会有以下限制:
-
全局项目无法使用出口防火墙。您可以使用
oc adm pod-network make-projects-global把一个项目设置为全局项目。 -
通过
oc adm pod-network join-projects命令合并的项目,无法在任何合并的项目中使用出口防火墙。
-
全局项目无法使用出口防火墙。您可以使用
-
如果您创建无选择器服务并手动定义指向外部 IP 的端点或
EndpointSlices,则到服务 IP 的流量可能仍然被允许,即使您的EgressNetworkPolicy配置为拒绝所有出口流量。这是因为 OpenShift SDN 不会对这些外部端点完全强制执行出口网络策略。因此,这可能会导致意外的访问外部服务。 - 出口防火墙不适用于主机网络命名空间。启用主机网络的 Pod 不受出口防火墙规则的影响。
- 出口防火墙规则不适用于通过路由器的网络流量。任何有权创建 Route CR 对象的用户,都可以通过创建指向禁止的目的地的路由来绕过出口防火墙策略规则。
违反这些限制会导致项目的出口防火墙出现问题。因此,所有外部网络流量都会丢弃,这可能会导致您的机构出现安全风险。
您可以在 kube-node-lease、kube-public、kube-system、openshift 和 openshift- 项目中创建一个 Egress Firewall 资源。
20.3.1.2. EgressNetworkPolicy CR 规则的匹配顺序 复制链接链接已复制到粘贴板!
OVN-Kubernetes 网络插件根据您定义规则的第一个到最后的顺序评估出口防火墙策略规则。第一个与 pod 的出口连接匹配的规则会被应用。该插件会忽略该连接的任何后续规则。
20.3.1.3. 域名服务器 (DNS) 解析如何工作 复制链接链接已复制到粘贴板!
如果您在 egress 防火墙策略规则中使用 DNS 名称,则正确解析域名会受到以下限制:
- 域名更新会根据生存时间(TTL)持续时间进行轮询。默认情况下,持续时间为 30 秒。当出口防火墙控制器查询本地名称服务器以获取域名时,如果响应中包含的 TTL 小于 30 秒,控制器会将持续时间设置为返回的值。如果响应中的 TTL 大于 30 分钟,控制器会将持续时间设置为 30 分钟。如果 TTL 介于 30 秒到 30 分钟之间,控制器会忽略该值,并将持续时间设置为 30 秒。
- 在需要时,pod 必须通过相同的本地名称服务器解析域名。否则,egress 防火墙控制器和 pod 已知的域的 IP 地址可能会有所不同。如果主机名的 IP 地址不同,则不会应用出口防火墙的一致性强制。
-
因为出口防火墙控制器和 pod 异步轮询相同的本地名称服务器,所以 pod 可能会在出口控制器执行前获取更新的 IP 地址,从而导致竞争条件。由于这个限制,仅建议在
EgressNetworkPolicyCR 中使用域名来更改 IP 地址的域。 在
EgressNetworkPolicyCR 中使用 DNS 名称不会影响通过 CoreDNS 进行本地 DNS 解析。但是,如果您的策略使用域名,并且外部 DNS 服务器处理受影响 pod 的 DNS 解析,则必须包含允许访问 DNS 服务器的 IP 地址的出口防火墙规则。
20.3.2. EgressNetworkPolicy 自定义资源(CR) 复制链接链接已复制到粘贴板!
您可以为出口防火墙定义一个或多个规则。规则是一个 Allow 规则,也可以是一个 Deny 规则,它包括规则适用的流量规格。
以下 YAML 描述了 EgressNetworkPolicy CR:
其中:
- <name>
- 指定出口防火墙策略的名称。
- <egress>
- 如下小节所述,指定一个或多个出口网络策略规则的集合。
20.3.2.1. EgressNetworkPolicy 规则 复制链接链接已复制到粘贴板!
用户可以选择 CIDR 格式的 IP 地址范围、域名,或使用 nodeSelector 允许或拒绝出口流量。egress 小节需要一个包括一个或多个对象的数组。以下 YAML 描述了一个出口防火墙规则对象。
其中:
- <type>
-
指定规则的类型。该值必须是
Allow或Deny。 - <to>
-
指定描述出口流量匹配规则的小节,该规则指定
cidrSelector字段或dnsName字段。您不能在同一规则中使用这两个字段。 - <cidr_range>
- 指定 CIDR 格式的 IP 地址范围。
- <dns_name>
- 指定 DNS 域名。
- <nodeSelector>
-
指定标签,它们是用户定义的键和值对。标签附加到对象,如 pod。
nodeSelector允许选择一个或多个节点标签,并附加到 pod。
20.3.2.2. EgressNetworkPolicy CR 对象示例 复制链接链接已复制到粘贴板!
以下示例定义了几个出口防火墙规则:
其中:
- <egress>
- 指定出口防火墙策略规则对象的集合。
20.3.3. 创建 EgressNetworkPolicy 自定义资源(CR) 复制链接链接已复制到粘贴板!
作为集群管理员,您可以为项目创建一个 EgressNetworkPolicy CR。
如果项目已经定义了 EgressNetworkPolicy 对象,您必须编辑现有的策略来更改出口防火墙规则。
先决条件
- 使用 OpenShift SDN 网络插件的集群。
-
安装 OpenShift CLI (
oc) 。 - 您需要使用集群管理员身份登陆到集群。
流程
创建策略规则:
-
创建一个
<policy_name>.yaml文件,其中<policy_name>描述出口策略规则。 -
在 文件中定义
EgressNetworkPolicy。
-
创建一个
运行以下命令来创建策略对象。将
<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 成功输出列出了
egressnetworkpolicy.network.openshift.io/v1名称以及创建的状态。-
可选:保存
<policy_name>.yaml文件,以便在以后进行修改。