Kube-OVN Overlay 网络支持 IPsec 加密

本文档提供了在 Kube-OVN Overlay 网络中启用和禁用 IPsec 加密隧道流量的详细指南。由于 OVN 隧道流量通过物理路由器和交换机传输,这些设备可能位于不受信任的公共网络中或面临攻击风险,因此启用 IPsec 加密可以有效防止流量数据被监控或篡改。

术语

术语解释
IPsec一种用于保护和验证通过互联网传输的数据的协议和技术。它在 IP 层提供安全通信,主要用于创建虚拟私人网络(VPN)以及保护 IP 数据包的传输。IPsec 主要通过以下方法确保数据安全:
  • 数据加密:通过加密技术,IPsec 可以确保数据在传输过程中不被窃取或篡改。常见的加密算法包括 AES、3DES 等。
  • 数据完整性检查:IPsec 使用哈希函数(例如 SHA-1、SHA-256)验证数据的完整性,确保数据在传输过程中未被修改。
  • 身份验证:IPsec 可以使用多种方法(例如预共享密钥、数字证书)验证通信双方的身份,以防止未经授权的访问。
  • 密钥管理:IPsec 使用互联网密钥交换(IKE)协议进行加密密钥的协商与管理。

注意事项

  • 启用 IPsec 可能会导致网络中断几秒钟。

  • 如果内核版本为 3.10.0-1160.el7.x86_64,启用 Kube-OVN 的 IPsec 功能可能会遇到兼容性问题。

先决条件

请执行以下命令检查当前操作系统内核是否支持 IPsec 相关模块。如果输出显示所有与 XFRM 相关的模块为 ym,则表示支持 IPsec。

cat /boot/config-$(uname -r) | grep CONFIG_XFRM

输出:

CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y CONFIG_XFRM_SUB_POLICY=y CONFIG_XFRM_MIGRATE=y CONFIG_XFRM_STATISTICS=y CONFIG_XFRM_IPCOMP=m

步骤

注意:除非另有说明,以下命令必须在集群主节点的 CLI 工具中执行。

启用 IPsec

  1. 修改 kube-ovn-controller 的配置文件。

    1. 执行以下命令编辑 kube-ovn-controller 的 YAML 配置文件。

      kubectl edit deploy kube-ovn-controller -n kube-system
    2. 按照以下说明修改指定字段。

      spec:
        template:
          spec:
            containers:
              - args:
                - --enable-ovn-ipsec=true  # 添加此字段
                securityContext:
                  runAsUser: 0  # 将值更改为 0
      

      字段说明:

      • spec.template.spec.containers[0].args:在此字段下添加 - --enable-ovn-ipsec=true
      • spec.template.spec.containers[0].securityContext.runAsUser:将此字段的值更改为 0。
    3. 保存更改。

  2. 修改 kube-ovn-cni 的配置文件。

    1. 执行以下命令编辑 kube-ovn-cni 的 YAML 配置文件。

      kubectl edit ds kube-ovn-cni -n kube-system
    2. 按照以下说明修改指定字段。

      spec:
        template:
          spec:
            containers:
            - args:
              - --enable-ovn-ipsec=true  # 添加此字段
              volumeMounts:  # 添加挂载路径,将名为 ovs-ipsec-keys 的卷挂载到容器
                - mountPath: /etc/ovs_ipsec_keys
                  name: ovs-ipsec-keys
            volumes:  # 添加类型为 hostPath 的名为 ovs-ipsec-keys 的卷
              - name: ovs-ipsec-keys
                hostPath:
                  path: /etc/origin/ovs_ipsec_keys
      

      字段说明:

      • spec.template.spec.containers[0].args:在此字段下添加 - --enable-ovn-ipsec=true
      • spec.template.spec.containers[0].volumeMounts:添加挂载路径,并将名为 ovs-ipsec-keys 的卷挂载到容器。
      • spec.template.spec.volumes:在此字段下添加类型为 hostPath 的名为 ovs-ipsec-keys 的卷。
    3. 保存更改。

  3. 验证功能是否成功启用。

    1. 执行以下命令进入 kube-ovn-cni Pod。

      kubectl exec -it -n kube-system $(kubectl get pods -n kube-system -l app=kube-ovn-cni -o=jsonpath='{.items[0].metadata.name}') -- /bin/bash
    2. 执行以下命令检查安全关联连接的数量。如果有(节点数量 - 1)个连接处于活动状态,表示启用成功。

      ipsec status | grep "Security"

      输出:

      Security Associations (2 up, 0 connecting): # 由于该集群中有 3 个节点,可以看到连接数量为 2 个活跃

禁用 IPsec

  1. 修改 kube-ovn-controller 的配置文件。

    1. 执行以下命令编辑 kube-ovn-controller 的 YAML 配置文件。

      kubectl edit deploy kube-ovn-controller -n kube-system
    2. 按照以下说明修改指定字段。

      spec:
        template:
          spec:
            containers:
              - args:
                - --enable-ovn-ipsec=false  # 更改为 false
                securityContext:
                  runAsUser: 65534  # 将值更改为 65534
      

      字段说明:

      • spec.template.spec.containers[0].args:将此字段 enable-ovn-ipsec 的值更改为 false。
      • spec.template.spec.containers[0].securityContext.runAsUser:将此字段的值更改为 65534。
    3. 保存更改。

  2. 修改 kube-ovn-cni 的配置文件。

    1. 执行以下命令编辑 kube-ovn-cni 的 YAML 配置文件。

      kubectl edit ds kube-ovn-cni -n kube-system
    2. 按照以下说明修改指定字段。

      • 修改前的配置

        spec:
          template:
            spec:
              containers:
              - args:
                - --enable-ovn-ipsec=true # 更改为 false
                volumeMounts: # 移除名为 ovs-ipsec-keys 的挂载路径
                  - mountPath: /etc/ovs_ipsec_keys
                    name: ovs-ipsec-keys
              volumes: # 移除名为 ovs-ipsec-keys 的卷,类型为 hostPath
                - name: ovs-ipsec-keys
                  hostPath:
                    path: /etc/origin/ovs_ipsec_keys
        

        字段说明:

        • spec.template.spec.containers[0].args:将此字段 enable-ovn-ipsec 的值更改为 false。
        • spec.template.spec.containers[0].volumeMounts:移除此字段下名为 ovs-ipsec-keys 的挂载路径。
        • spec.template.spec.volumes:移除此字段下名为 ovs-ipsec-keys 的卷,类型为 hostPath。
      • 修改后的配置

        spec:
          template:
            spec:
              containers:
              - args:
                - --enable-ovn-ipsec=false
                volumeMounts:
              volumes:
        
    3. 保存更改。

  3. 验证功能是否成功禁用。

    1. 执行以下命令进入 kube-ovn-cni Pod。

      kubectl exec -it -n kube-system $(kubectl get pods -n kube-system -l app=kube-ovn-cni -o=jsonpath='{.items[0].metadata.name}') -- /bin/bash
    2. 执行以下命令检查连接状态。如果没有输出,表示禁用成功。

      ipsec status