6.6. Egress 防火墙
6.6.1. 查看项目的出口防火墙
作为集群管理员,您可以列出任何现有出口防火墙的名称,并查看特定出口防火墙的流量规则。
从 OpenShift Container Platform 4.14 开始,OpenShift SDN CNI 已被弃用。自 OpenShift Container Platform 4.15 起,网络插件不是新安装的选项。在以后的发行版本中,计划删除 OpenShift SDN 网络插件,并不再被支持。红帽将在删除前对这个功能提供程序错误修正和支持,但不会再改进这个功能。作为 OpenShift SDN CNI 的替代选择,您可以使用 OVN Kubernetes CNI。如需更多信息,请参阅 OpenShift SDN CNI 删除。
6.6.1.1. 查看 EgressFirewall 对象
您可以查看集群中的 EgressFirewall 对象。
先决条件
- 使用 OVN-Kubernetes 网络插件的集群。
-
安装 OpenShift 命令行界面 (CLI),通常称为
oc
。 - 您必须登录集群。
流程
可选: 要查看集群中定义的 EgressFirewall 对象的名称,请输入以下命令:
$ oc get egressfirewall --all-namespaces
要检查策略,请输入以下命令。将
<policy_name>
替换为要检查的策略名称。$ oc describe egressfirewall <policy_name>
输出示例
Name: default Namespace: project1 Created: 20 minutes ago Labels: <none> Annotations: <none> Rule: Allow to 1.2.3.0/24 Rule: Allow to www.example.com Rule: Deny to 0.0.0.0/0
6.6.2. 为项目编辑出口防火墙
作为集群管理员,您可以修改现有出口防火墙的网络流量规则。
6.6.2.1. 编辑 EgressFirewall 对象
作为集群管理员,您可以更新一个项目的出口防火墙。
先决条件
- 使用 OVN-Kubernetes 网络插件的集群。
-
安装 OpenShift CLI (
oc
) 。 - 您需要使用集群管理员身份登陆到集群。
流程
查找项目的 EgressFirewall 对象的名称。将
<project>
替换为项目的名称。$ oc get -n <project> egressfirewall
可选:如果您在创建出口网络防火墙时没有保存 EgressFirewall 对象的副本,请输入以下命令来创建副本。
$ oc get -n <project> egressfirewall <name> -o yaml > <filename>.yaml
将
<project>
替换为项目的名称。将<name>
替换为 Pod 的名称。将<filename>
替换为要将 YAML 保存到的文件的名称。修改策略规则后,请输入以下命令替换 EgressFirewall 对象。将
<filename>
替换为包含更新的 EgressFirewall 对象的文件名称。$ oc replace -f <filename>.yaml
6.6.3. 从项目中删除出口防火墙
作为集群管理员,您可以从项目中删除出口防火墙,从而删除对项目的离开 OpenShift Container Platform 集群的网络流量的限制。
6.6.3.1. 删除 EgressFirewall 对象
作为集群管理员,您可以从项目中删除出口防火墙。
先决条件
- 使用 OVN-Kubernetes 网络插件的集群。
-
安装 OpenShift CLI (
oc
) 。 - 您需要使用集群管理员身份登陆到集群。
流程
查找项目的 EgressFirewall 对象的名称。将
<project>
替换为项目的名称。$ oc get -n <project> egressfirewall
输入以下命令删除 EgressFirewall 对象。将
<project>
替换为项目名称,<name>
替换为对象名称。$ oc delete -n <project> egressfirewall <name>
6.6.4. 为项目配置出口防火墙
作为集群管理员,您可以为项目创建一个出口防火墙,用于限制离开 OpenShift Container Platform 集群的出口流量。
6.6.4.1. 出口防火墙在一个项目中的工作原理
作为集群管理员,您可以使用一个出口防火墙来限制集群内的一些 pod 或所有 pod 可以访问的外部主机。出口防火墙适用于以下情况:
- pod 只能连接到内部主机,且无法启动到公共互联网的连接。
- pod 只能连接到公共互联网,且无法启动到 OpenShift Container Platform 集群以外的内部主机的连接。
- pod 无法访问 OpenShift Container Platform 集群外的特定内部子网或主机。
- pod 只能连接到特定的外部主机。
例如,您可以允许某一个项目访问指定的 IP 范围,但拒绝其他项目对同一 IP 范围的访问。或者您可以限制应用程序开发人员从 Python pip 的镜像点进行更新,并强制要求更新只能来自于批准的源。
出口防火墙不适用于主机网络命名空间。启用主机网络的 Pod 不受出口防火墙规则的影响。
您可以通过创建一个 EgressFirewall 自定义资源(CR)对象来配置出口防火墙策略。出口防火墙与满足以下任一条件的网络流量匹配:
- CIDR 格式的 IP 地址范围
- 解析为 IP 地址的 DNS 名称
- 端口号
- 协议是以下协议之一: TCP、UDP 和 SCTP
如果您的出口防火墙包含 0.0.0.0/0
的拒绝规则,则阻止访问 OpenShift Container Platform API 服务器。您必须为每个 IP 地址添加允许规则,或使用出口策略规则中的 nodeSelector
类型允许规则来连接到 API 服务器。
以下示例演示了确保 API 服务器访问所需的出口防火墙规则的顺序:
apiVersion: k8s.ovn.org/v1 kind: EgressFirewall metadata: name: default namespace: <namespace> 1 spec: egress: - to: cidrSelector: <api_server_address_range> 2 type: Allow # ... - to: cidrSelector: 0.0.0.0/0 3 type: Deny
要查找 API 服务器的 IP 地址,请运行 oc get ep kubernetes -n default
。
如需更多信息,请参阅 BZ#1988324。
出口防火墙规则不适用于通过路由器的网络流量。任何有权创建 Route CR 对象的用户,都可以通过创建指向禁止的目的地的路由来绕过出口防火墙策略规则。
6.6.4.1.1. 出口防火墙的限制
出口防火墙有以下限制:
- 项目不能有一个以上的 EgressFirewall 对象。
- 每个项目最多可定义一个具有最多 8,000 个规则的 EgressFirewall 对象。
- 如果您在 Red Hat OpenShift Networking 中使用带有共享网关模式的 OVN-Kubernetes 网络插件,则返回入口回复会受到出口防火墙规则的影响。如果出口防火墙规则丢弃入口回复目的地 IP,流量将被丢弃。
违反这些限制会导致项目的出口防火墙出现问题。因此,所有外部网络流量都会被丢弃,这可能会给您的组织造成安全风险。
可在 kube-node-lease
、kube-public
、kube-system
、openshift
和 openshift-
项目中创建一个 Egress Firewall 资源。
6.6.4.1.2. 出口防火墙策略规则的匹配顺序
出口防火墙策略规则按照它们定义的顺序来评估,从第一个到最后一个的顺序。第一个与 pod 的出口连接匹配的规则会被应用。该连接会忽略后续的所有规则。
6.6.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 地址的域。
在出口防火墙策略中使用 DNS 名称不会影响通过 CoreDNS 的本地 DNS 解析。
但是,如果您的出口防火墙策略使用域名,并且外部 DNS 服务器处理受影响 pod 的 DNS 解析,则必须包括允许访问 DNS 服务器的 IP 地址的出口防火墙规则。
6.6.4.1.3.1. 改进了 DNS 解析并解析通配符域名
在某些情况下,与 DNS 记录关联的 IP 地址会频繁更改,或者您可能希望在出口(egress)防火墙策略规则中指定通配符域名。
在这种情况下,OVN-Kubernetes 集群管理器为每个出口防火墙策略规则中使用的每个唯一 DNS 名称创建一个 DNSNameResolver
自定义资源对象。此自定义资源存储以下信息:
改进了出口防火墙规则的 DNS 解析只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
DNSNameResolver
CR 定义示例
apiVersion: networking.openshift.io/v1alpha1 kind: DNSNameResolver spec: name: www.example.com. 1 status: resolvedNames: - dnsName: www.example.com. 2 resolvedAddress: - ip: "1.2.3.4" 3 ttlSeconds: 60 4 lastLookupTime: "2023-08-08T15:07:04Z" 5
如果在 DNS 解析 DNS 名称的过程中,查询中的 DNS 名称与 DNSNameResolver
CR 中定义的任何名称匹配,那么在 CR status
字段中会相应地更新之前的信息。如果 DNS 通配符名称查找失败,会在默认的 TTL 为 30 分钟后重试请求。
OVN-Kubernetes 集群管理器监视对 EgressFirewall
自定义资源对象的更新,并在更新发生时创建、修改或删除与这些出口防火墙策略关联的 DNSNameResolver
CR。
不要直接修改 DNSNameResolver
自定义资源。这可能导致出口防火墙的不需要的行为。
6.6.4.2. EgressFirewall 自定义资源(CR)对象
您可以为出口防火墙定义一个或多个规则。规则是一个 Allow
规则,也可以是一个 Deny
规则,它包括规则适用的流量规格。
以下 YAML 描述了 EgressFirewall CR 对象:
EgressFirewall 对象
apiVersion: k8s.ovn.org/v1 kind: EgressFirewall metadata: name: <name> 1 spec: egress: 2 ...
6.6.4.2.1. EgressFirewall 规则
以下 YAML 描述了一个出口防火墙规则对象。用户可以选择 CIDR 格式的 IP 地址范围、域名,或使用 nodeSelector
允许或拒绝出口流量。egress
小节需要一个包括一个或多个对象的数组。
出口策略规则小节
egress: - type: <type> 1 to: 2 cidrSelector: <cidr> 3 dnsName: <dns_name> 4 nodeSelector: <label_name>: <label_value> 5 ports: 6 ...
端口小节
ports: - port: <port> 1 protocol: <protocol> 2
6.6.4.2.2. EgressFirewall CR 对象示例
以下示例定义了几个出口防火墙策略规则:
apiVersion: k8s.ovn.org/v1
kind: EgressFirewall
metadata:
name: default
spec:
egress: 1
- type: Allow
to:
cidrSelector: 1.2.3.0/24
- type: Deny
to:
cidrSelector: 0.0.0.0/0
- 1
- 出口防火墙策略规则对象的集合。
以下示例定义了一个策略规则,即如果流量使用 TCP 协议和目标端口 80
,或任何协议和目标端口 443
,则拒绝通过 172.16.1.1
IP 地址到主机的流量。
apiVersion: k8s.ovn.org/v1 kind: EgressFirewall metadata: name: default spec: egress: - type: Deny to: cidrSelector: 172.16.1.1 ports: - port: 80 protocol: TCP - port: 443
6.6.4.2.3. EgressFirewall 的 nodeSelector 示例
作为一个集群管理员,您可以使用 nodeSelector
指定标签来允许或拒绝集群中节点的出口流量。标签可以应用到一个或多个节点。以下是带有 region=east
标签的示例:
apiVersion: k8s.ovn.org/v1 kind: EgressFirewall metadata: name: default spec: egress: - to: nodeSelector: matchLabels: region: east type: Allow
除了为每个节点 IP 地址添加手动规则外,使用节点选择器创建标签,允许出口防火墙后面的 pod 访问主机网络 pod。
6.6.4.3. 创建出口防火墙策略对象
作为集群管理员,您可以为项目创建一个出口防火墙策略对象。
如果项目已经定义了 EgressFirewall 对象,您必须编辑现有策略来更改出口防火墙规则。
先决条件
- 使用 OVN-Kubernetes 网络插件的集群。
-
安装 OpenShift CLI (
oc
) 。 - 您需要使用集群管理员身份登陆到集群。
流程
创建策略规则:
-
创建一个
<policy_name>.yaml
文件,其中<policy_name>
描述出口策略规则。 - 在您创建的文件中,定义出口策略对象。
-
创建一个
运行以下命令来创建策略对象。将
<policy_name>
替换为策略的名称,<project>
替换为规则应用到的项目。$ oc create -f <policy_name>.yaml -n <project>
在以下示例中,在名为
project1
的项目中创建一个新的 EgressFirewall 对象:$ oc create -f default.yaml -n project1
输出示例
egressfirewall.k8s.ovn.org/v1 created
-
可选:保存
<policy_name>.yaml
文件,以便在以后进行修改。