9.3. 配置出口防火墙来控制对外部 IP 地址的访问

作为集群管理员,您可以为项目创建一个出口防火墙,用于限制离开 OpenShift Container Platform 集群的出口流量。

9.3.1. 出口防火墙在一个项目中的工作原理

做为一个集群的系统管理员,您可以使用一个出口防火墙(egress firewall)来限制集群内的所有或部分 Pods 可以访问的外部主机。出口防火墙适用于以下情况:

  • Pod 只能连接到内部主机,且无法启动到公共互联网的连接。
  • Pod 只能连接到公共互联网,且无法启动到 OpenShift Container Platform 集群以外的内部主机的连接。
  • Pod 无法访问 OpenShift Container Platform 集群外的特定内部子网或主机。
  • Pod 只能连接到特定的外部主机。

您可以通过创建一个 EgressNetworkPolicy 自定义资源 (CR) 对象并指定 CIDR 格式的 IP 地址范围或指定 DNS 名称来配置出口防火墙策略。例如,您可以允许某一个项目访问指定的 IP 范围,但拒绝其他项目对同一 IP 范围的访问。或者您可以限制应用程序开发人员从 Python pip 的镜像点进行更新,并强制要求更新只能来自于批准的源。

重要

您必须将 OpenShift SDN 配置为使用网络策略或多租户模式来配置出口防火墙策略。

如果使用网络策略模式,egress 策略只与每个命名空间的一个策略兼容,且无法在需要共享网络的项目中使用,如全局项目。

警告

出口防火墙规则不适用于通过路由器的网络流量。任何有权创建 Route CR 对象的用户,都可以通过创建指向禁止访问的目的地的路由,来绕过出口网络策略规则。

9.3.1.1. 出口防火墙的限制

出口防火墙有以下限制:

  • 项目不能有多个 EgressNetworkPolicy 对象。
  • 每个项目最多只能定义一个具有最多 50 个规则的 EgressNetworkPolicy 对象。
  • default 项目无法使用出口网络策略。
  • 当在多租户模式下使用 OpenShift SDN 默认 Container Network Interface (CNI) 网络供应商时,会有以下限制:

    • 全局项目无法使用出口防火墙。您可以使用 oc adm pod-network make-projects-global 把一个项目设置为全局项目。
    • 通过 oc adm pod-network join-projects 命令合并的项目,无法在任何合并的项目中使用出口防火墙。

违反这些限制会导致项目的出口策略中断,并可能导致所有外部网络流量被丢弃。

9.3.1.2. 出口网络策略规则的匹配顺序

egress 网络策略规则是按照它们定义的顺序来评估的,从第一个到最后一个的顺序。第一个与 Pod 的出口连接匹配的规则会被应用。该连接会忽略后续的所有规则。

9.3.1.3. 域名服务器 (DNS) 解析如何工作

如果您在 egress 防火墙策略规则中使用 DNS 名称,则正确解析域名会受到以下限制:

  • 域名更新根据本地非授权服务器返回的域的 TTL(time to live)值进行轮询。
  • 在需要时,Pod 必须通过相同的本地名称服务器解析域名。否则,egress 防火墙控制器和 Pod 已知的域的 IP 地址可能会有所不同。如果主机名的 IP 地址不同,则出口防火墙所起的强制作用可能会不一致。
  • 因为出口防火墙控制器和 Pod 异步轮询相同的本地名称服务器,所以 Pod 可能会在出口控制器执行前获取更新的 IP 地址,从而导致竞争条件。由于这个限制,仅建议在 EgressNetworkPolicy 对象中使用域名来更改 IP 地址的域。
注意

出口防火墙始终允许 Pod 访问 Pod 所在的用于 DNS 解析的节点的外部接口。

如果您在出口防火墙策略中使用域名,且您的 DNS 解析不是由本地节点上的 DNS 服务器处理,那么您必须添加出口防火墙规则,允许访问您的 DNS 服务器的 IP 地址。如果您在 Pod 中使用域名。

9.3.2. EgressNetworkPolicy 自定义资源 (CR) 对象

以下 YAML 描述了一个 EgressNetworkPolicy CR 对象:

apiVersion: network.openshift.io/v1
kind: EgressNetworkPolicy
metadata:
  name: <name> 1
spec:
  egress: 2
    ...
1
为出口防火墙指定一个名称
2
如下小节所述,指定一个或多个出口网络策略规则的集合。

9.3.2.1. EgressNetworkPolicy 规则

以下 YAML 描述了一个出口防火墙规则对象。egress 键需要一个包括一个或多个对象的数组。

egress:
- type: <type> 1
  to: 2
    cidrSelector: <cidr> 3
    dnsName: <dns-name> 4
1
指定规则类型。该值必须是 AllowDeny
2
为规则指定一个 cidrSelectordnsName 的值。您不能在规则中同时使用这两个键。
3
以 CIDR 格式指定一个 IP 地址范围。
4
指定一个域名。

9.3.2.2. EgressNetworkPolicy CR 对象示例

以下示例定义了几个出口防火墙策略规则:

apiVersion: network.openshift.io/v1
kind: EgressNetworkPolicy
metadata:
  name: default-rules 1
spec:
  egress: 2
  - type: Allow
    to:
      cidrSelector: 1.2.3.0/24
  - type: Allow
    to:
      dnsName: www.example.com
  - type: Deny
    to:
      cidrSelector: 0.0.0.0/0
1
策略对象的名称。
2
出口防火墙策略规则对象的集合。

9.3.3. 创建出口防火墙策略对象

作为集群管理员,您可以为项目创建一个出口防火墙策略对象。

重要

如果项目已经定义了一个 EgressNetworkPolicy 对象,您必须编辑现有的策略来更改出口防火墙规则。

先决条件

  • 使用 OpenShift SDN 默认 Container Network Interface (CNI) 网络供应商插件的集群。
  • 安装 OpenShift CLI(oc)。
  • 您需要使用集群管理员身份登陆到集群。

流程

  1. 创建策略规则:

    1. 创建一个 <policy-name>.yaml 文件,其中 <policy-name> 描述出口策略规则。
    2. 在您创建的文件中,定义出口策略对象。
  2. 运行以下命令来创建策略对象:

    $ oc create -f <policy-name>.yaml -n <project>

    在以下示例中,在名为 project1 的项目中创建一个新的 EgressNetworkPolicy 对象:

    $ oc create -f default-rules.yaml -n project1

    输出示例

    egressnetworkpolicy.network.openshift.io/default-rules created

  3. 可选:保存 <policy-name>.yaml ,以便在以后进行修改。