×

通过启用 IPsec,您可以加密节点之间内部 Pod 到 Pod 的集群流量以及 Pod 与集群外部的 IPsec 端点之间的外部流量。OVN-Kubernetes 集群网络上节点之间所有 Pod 到 Pod 的网络流量都以传输模式使用 IPsec 加密。

默认情况下禁用 IPsec。您可以在安装集群期间或之后启用 IPsec。有关集群安装的信息,请参阅OpenShift Container Platform 安装概述

OpenShift Container Platform 集群上的 IPsec 存在以下支持限制

  • 您必须在更新到 OpenShift Container Platform 4.15 之前禁用 IPsec。已知问题可能会导致在未禁用 IPsec 的情况下更新时 Pod 到 Pod 通信中断。(OCPBUGS-43323)

  • 在 IBM Cloud® 上,IPsec 仅支持 NAT-T。此平台不支持封装安全有效负载 (ESP)。

  • 如果您的集群使用托管控制平面 用于 Red Hat OpenShift Container Platform,则不支持用于 Pod 到 Pod 或到外部主机的流量的 IPsec 加密。

  • 如果一个或多个接口连接到 Open vSwitch (OVS),则不支持在任何网络接口上使用 ESP 硬件卸载。为您的集群启用 IPsec 将触发使用连接到 OVS 的接口的 IPsec。默认情况下,OpenShift Container Platform 将禁用连接到 OVS 的任何接口上的 ESP 硬件卸载。

  • 如果您为未连接到 OVS 的网络接口启用了 IPsec,则集群管理员必须手动禁用未连接到 OVS 的每个接口上的 ESP 硬件卸载。

以下列表概述了 IPsec 文档中的关键任务

  • 在集群安装后启用和禁用 IPsec。

  • 为集群和外部主机之间的流量配置 IPsec 加密。

  • 验证 IPsec 是否加密不同节点上的 Pod 之间的流量。

操作模式

在 OpenShift Container Platform 集群上使用 IPsec 时,您可以选择以下操作模式

表 1. IPsec 操作模式
模式 描述 默认值

已禁用

没有流量被加密。这是集群默认值。

完全

Pod 到 Pod 的流量将按照“Pod 到 Pod IPsec 加密类型的网络流量”中所述进行加密。完成 IPsec 的必要配置步骤后,可能会加密到外部节点的流量。

外部

完成 IPsec 的必要配置步骤后,可能会加密到外部节点的流量。

先决条件

要支持使用 IPsec 对外部主机的流量进行加密,请确保满足以下前提条件。

  • OVN-Kubernetes 网络插件必须配置为本地网关模式,其中 ovnKubernetesConfig.gatewayConfig.routingViaHost=true

  • 已安装 NMState Operator。此 Operator 对于指定 IPsec 配置是必需的。有关更多信息,请参阅 Kubernetes NMState Operator

    仅在 Google Cloud Platform (GCP) 上支持 NMState Operator 用于配置 IPsec。

  • 已安装 Butane 工具 (butane)。要安装 Butane,请参阅 安装 Butane

这些前提条件是将证书添加到主机 NSS 数据库以及配置 IPsec 以与外部主机通信所必需的。

启用 IPsec 时的网络连接要求

必须配置机器之间的网络连接,以允许 OpenShift Container Platform 集群组件进行通信。每台机器必须能够解析集群中所有其他机器的主机名。

表 2. 所有机器到所有机器通信使用的端口
协议 端口 描述

UDP

500

IPsec IKE 数据包

4500

IPsec NAT-T 数据包

ESP

N/A

IPsec 封装安全有效负载 (ESP)

Pod 到 Pod 流量的 IPsec 加密

对于 Pod 到 Pod 流量的 IPsec 加密,以下部分描述了哪些特定的 Pod 到 Pod 流量被加密,使用了哪种加密协议,以及如何处理 X.509 证书。这些部分不适用于集群和外部主机之间的 IPsec 加密,您必须为您的特定外部网络基础设施手动配置这些加密。

Pod 到 Pod IPsec 加密的网络流量类型

启用 IPsec 后,只有以下 Pod 之间的网络流量流会被加密:

  • 集群网络上不同节点上的 Pod 之间的流量

  • 来自主机网络上的 Pod 到集群网络上的 Pod 的流量

以下流量流不会被加密:

  • 集群网络上同一节点上的 Pod 之间的流量

  • 主机网络上的 Pod 之间的流量

  • 来自集群网络上的 Pod 到主机网络上的 Pod 的流量

加密和未加密的流量如下图所示

IPsec encrypted and unencrypted traffic flows

加密协议和 IPsec 模式

使用的加密密码是 AES-GCM-16-256。完整性校验值 (ICV) 为 16 字节。密钥长度为 256 位。

使用的 IPsec 模式是传输模式,这是一种通过在原始数据包的 IP 报头中添加封装安全有效负载 (ESP) 报头并加密数据包数据来加密端到端通信的模式。OpenShift Container Platform 目前不使用或不支持用于 Pod 到 Pod 通信的 IPsec隧道模式

安全证书生成和轮换

集群网络运营商 (CNO) 生成一个自签名的 X.509 证书颁发机构 (CA),IPsec 使用该证书进行加密。来自每个节点的证书签名请求 (CSR) 将由 CNO 自动完成。

CA 有效期为 10 年。各个节点证书有效期为 5 年,并在 4 年半后自动轮换。

外部流量的 IPsec 加密

OpenShift Container Platform 支持对外部主机的流量进行 IPsec 加密,您必须提供 TLS 证书。

支持的平台

此功能在以下平台上受支持:

  • 裸机

  • Google Cloud Platform (GCP)

  • Red Hat OpenStack Platform (RHOSP)

  • VMware vSphere

如果您有 Red Hat Enterprise Linux (RHEL) 工作节点,则不支持对外部流量进行 IPsec 加密。

如果您的集群使用 Red Hat OpenShift Container Platform 的托管控制平面,则不支持配置 IPsec 以加密对外部主机的流量。

限制

请确保遵守以下禁止事项:

  • 配置外部流量的 IPsec 时,NMState Operator 目前不支持 IPv6 配置。

  • 提供的证书包中的证书通用名称 (CN) 必须不能以 ovs_ 前缀开头,因为此命名可能会与每个节点的网络安全服务 (NSS) 数据库中的 Pod 到 Pod IPsec CN 名称冲突。

启用 IPsec 加密

作为集群管理员,您可以启用 Pod 到 Pod IPsec 加密以及集群和外部 IPsec 端点之间的 IPsec 加密。

您可以通过以下任一模式配置 IPsec:

  • Full:对 Pod 到 Pod 和外部流量进行加密

  • External:对外部流量进行加密

如果您需要除了 Pod 到 Pod 流量之外还要配置对外部流量的加密,则还必须完成“配置外部流量的 IPsec 加密”过程。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 您已以具有 cluster-admin 权限的用户身份登录到集群。

  • 您已将集群 MTU 大小减小了 46 字节,以允许 IPsec ESP 报头的开销。

步骤
  1. 要启用 IPsec 加密,请输入以下命令:

    $ oc patch networks.operator.openshift.io cluster --type=merge \
    -p '{
      "spec":{
        "defaultNetwork":{
          "ovnKubernetesConfig":{
            "ipsecConfig":{
              "mode":<mode>
            }}}}}'

    其中

    模式

    指定 External 仅加密到外部主机的流量,或指定 Full 加密 Pod 到 Pod 流量以及可选的到外部主机的流量。默认情况下,IPsec 已禁用。

  2. 可选:如果您需要加密到外部主机的流量,请完成“配置外部流量的 IPsec 加密”过程。

验证
  1. 要查找 OVN-Kubernetes 数据平面 Pod 的名称,请输入以下命令:

    $ oc get pods -n openshift-ovn-kubernetes -l=app=ovnkube-node
    示例输出
    ovnkube-node-5xqbf                       8/8     Running   0              28m
    ovnkube-node-6mwcx                       8/8     Running   0              29m
    ovnkube-node-ck5fr                       8/8     Running   0              31m
    ovnkube-node-fr4ld                       8/8     Running   0              26m
    ovnkube-node-wgs4l                       8/8     Running   0              33m
    ovnkube-node-zfvcl                       8/8     Running   0              34m
  2. 通过运行以下命令来验证您的集群上是否已启用 IPsec:

    作为集群管理员,当 IPsec 配置为 Full 模式时,您可以验证集群上的 Pod 之间是否启用了 IPsec。此步骤不会验证您的集群和外部主机之间 IPsec 是否正常工作。

    $ oc -n openshift-ovn-kubernetes rsh ovnkube-node-<XXXXX> ovn-nbctl --no-leader-only get nb_global . ipsec

    其中

    <XXXXX>

    指定上一步中 Pod 的随机字母序列。

    示例输出
    true

配置外部流量的 IPsec 加密

作为集群管理员,要使用 IPsec 加密外部流量,您必须为您的网络基础设施配置 IPsec,包括提供 PKCS#12 证书。由于此过程使用 Butane 创建机器配置,因此您必须安装butane 命令。

应用机器配置后,机器配置操作符将重新启动集群中受影响的节点以推出新的机器配置。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 您已在本地计算机上安装了butane 实用程序。

  • 您已在集群上安装了 NMState 操作符。

  • 您已以具有 cluster-admin 权限的用户身份登录到集群。

  • 您拥有 IPsec 端点的现有 PKCS#12 证书和 PEM 格式的 CA 证书。

  • 您已在集群上启用FullExternal模式下的 IPsec。

  • OVN-Kubernetes 网络插件必须配置为本地网关模式,其中 ovnKubernetesConfig.gatewayConfig.routingViaHost=true

步骤
  1. 使用 NMState 操作符节点网络配置策略创建 IPsec 配置。更多信息,请参见 Libreswan 作为 IPsec VPN 实现

    1. 要识别充当 IPsec 端点的集群节点的 IP 地址,请输入以下命令

      $ oc get nodes
    2. 创建一个名为ipsec-config.yaml 的文件,其中包含 NMState 操作符的节点网络配置策略,例如以下示例。有关NodeNetworkConfigurationPolicy 对象的概述,请参见 Kubernetes NMState 项目

      NMState IPsec 传输配置示例
      apiVersion: nmstate.io/v1
      kind: NodeNetworkConfigurationPolicy
      metadata:
        name: ipsec-config
      spec:
        nodeSelector:
          kubernetes.io/hostname: "<hostname>" (1)
        desiredState:
          interfaces:
          - name: <interface_name> (2)
            type: ipsec
            libreswan:
              left: <cluster_node> (3)
              leftid: '%fromcert'
              leftrsasigkey: '%cert'
              leftcert: left_server
              leftmodecfgclient: false
              right: <external_host> (4)
              rightid: '%fromcert'
              rightrsasigkey: '%cert'
              rightsubnet: <external_address>/32 (5)
              ikev2: insist
              type: transport
      1 指定要应用策略的主机名。此主机在 IPsec 配置中充当左侧主机。
      2 指定要在主机上创建的接口的名称。
      3 指定在集群端终止 IPsec 隧道的主机名。此名称应与您提供的 PKCS#12 证书中的 SAN(主题替代名称)匹配。
      4 指定外部主机名,例如host.example.com。此名称应与您提供的 PKCS#12 证书中的 SAN(主题替代名称)匹配。
      5 指定外部主机的 IP 地址,例如10.1.2.3/32
      NMState IPsec 隧道配置示例
      apiVersion: nmstate.io/v1
      kind: NodeNetworkConfigurationPolicy
      metadata:
        name: ipsec-config
      spec:
        nodeSelector:
          kubernetes.io/hostname: "<hostname>" (1)
        desiredState:
          interfaces:
          - name: <interface_name> (2)
            type: ipsec
            libreswan:
              left: <cluster_node> (3)
              leftid: '%fromcert'
              leftmodecfgclient: false
              leftrsasigkey: '%cert'
              leftcert: left_server
              right: <external_host> (4)
              rightid: '%fromcert'
              rightrsasigkey: '%cert'
              rightsubnet: <external_address>/32 (5)
              ikev2: insist
              type: tunnel
      1 指定要应用策略的主机名。此主机在 IPsec 配置中充当左侧主机。
      2 指定要在主机上创建的接口的名称。
      3 指定在集群端终止 IPsec 隧道的主机名。此名称应与您提供的 PKCS#12 证书中的 SAN(主题替代名称)匹配。
      4 指定外部主机名,例如host.example.com。此名称应与您提供的 PKCS#12 证书中的 SAN(主题替代名称)匹配。
      5 指定外部主机的 IP 地址,例如10.1.2.3/32
    3. 要配置 IPsec 接口,请输入以下命令

      $ oc create -f ipsec-config.yaml
  2. 提供以下证书文件以添加到每个主机上的网络安全服务 (NSS) 数据库中。这些文件作为后续步骤中的 Butane 配置的一部分导入。

    • left_server.p12:IPsec 端点的证书捆绑包

    • ca.pem:您用来签署证书的证书颁发机构

  3. 创建机器配置以将您的证书添加到集群

    1. 要为控制平面和工作节点创建 Butane 配置文件,请输入以下命令

      $ for role in master worker; do
        cat >> "99-ipsec-${role}-endpoint-config.bu" <<-EOF
        variant: openshift
        version: 4.17.0
        metadata:
          name: 99-${role}-import-certs
          labels:
            machineconfiguration.openshift.io/role: $role
        systemd:
          units:
          - name: ipsec-import.service
            enabled: true
            contents: |
              [Unit]
              Description=Import external certs into ipsec NSS
              Before=ipsec.service
      
              [Service]
              Type=oneshot
              ExecStart=/usr/local/bin/ipsec-addcert.sh
              RemainAfterExit=false
              StandardOutput=journal
      
              [Install]
              WantedBy=multi-user.target
        storage:
          files:
          - path: /etc/pki/certs/ca.pem
            mode: 0400
            overwrite: true
            contents:
              local: ca.pem
          - path: /etc/pki/certs/left_server.p12
            mode: 0400
            overwrite: true
            contents:
              local: left_server.p12
          - path: /usr/local/bin/ipsec-addcert.sh
            mode: 0740
            overwrite: true
            contents:
              inline: |
                #!/bin/bash -e
                echo "importing cert to NSS"
                certutil -A -n "CA" -t "CT,C,C" -d /var/lib/ipsec/nss/ -i /etc/pki/certs/ca.pem
                pk12util -W "" -i /etc/pki/certs/left_server.p12 -d /var/lib/ipsec/nss/
                certutil -M -n "left_server" -t "u,u,u" -d /var/lib/ipsec/nss/
      EOF
      done
    2. 要将您在上一步中创建的 Butane 文件转换为机器配置,请输入以下命令

      $ for role in master worker; do
        butane -d . 99-ipsec-${role}-endpoint-config.bu -o ./99-ipsec-$role-endpoint-config.yaml
      done
  4. 要将机器配置应用于您的集群,请输入以下命令

    $ for role in master worker; do
      oc apply -f 99-ipsec-${role}-endpoint-config.yaml
    done

    随着机器配置操作符 (MCO) 更新每个机器配置池中的机器,它将逐个重新启动每个节点。您必须等到所有节点都更新完毕后,外部 IPsec 连接才能可用。

  5. 通过输入以下命令检查机器配置池状态

    $ oc get mcp

    成功更新的节点具有以下状态:UPDATED=trueUPDATING=falseDEGRADED=false

    默认情况下,MCO 每次在一个池中更新一台机器,导致迁移所需的时间随着集群大小的增加而增加。

  6. 要确认 IPsec 机器配置已成功推出,请输入以下命令

    1. 确认已创建 IPsec 机器配置

      $ oc get mc | grep ipsec
      示例输出
      80-ipsec-master-extensions        3.2.0        6d15h
      80-ipsec-worker-extensions        3.2.0        6d15h
    2. 确认 IPsec 扩展已应用于控制平面节点

      $ oc get mcp master -o yaml | grep 80-ipsec-master-extensions -c
      预期输出
      2
    3. 确认 IPsec 扩展已应用于工作节点

      $ oc get mcp worker -o yaml | grep 80-ipsec-worker-extensions -c
      预期输出
      2
其他资源
  • 有关 nmstate IPsec API 的更多信息,请参见 IPsec 加密

禁用外部 IPsec 端点的 IPsec 加密

作为集群管理员,您可以删除到外部主机的现有 IPsec 隧道。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 您已以具有 cluster-admin 权限的用户身份登录到集群。

  • 您已在集群上启用FullExternal模式下的 IPsec。

步骤
  1. 创建一个名为remove-ipsec-tunnel.yaml 的文件,其中包含以下 YAML

    kind: NodeNetworkConfigurationPolicy
    apiVersion: nmstate.io/v1
    metadata:
      name: <name>
    spec:
      nodeSelector:
        kubernetes.io/hostname: <node_name>
      desiredState:
        interfaces:
        - name: <tunnel_name>
          type: ipsec
          state: absent

    其中

    名称

    指定节点网络配置策略的名称。

    节点名称

    指定要删除 IPsec 隧道的节点的名称。

    隧道名称

    指定现有 IPsec 隧道的接口名称。

  2. 要删除 IPsec 隧道,请输入以下命令

    $ oc apply -f remove-ipsec-tunnel.yaml

禁用 IPsec 加密

作为集群管理员,您可以禁用 IPsec 加密。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 使用具有cluster-admin 权限的用户登录到集群。

步骤
  1. 要禁用 IPsec 加密,请输入以下命令

    $ oc patch networks.operator.openshift.io cluster --type=merge \
    -p '{
      "spec":{
        "defaultNetwork":{
          "ovnKubernetesConfig":{
            "ipsecConfig":{
              "mode":"Disabled"
            }}}}}'
  2. 可选:您可以将集群 MTU 大小增加46 字节,因为 IP 数据包中不再有 IPsec ESP 头的开销。