DOCA 文档 v2.10.0

DOCA 东-西 向 Overlay 加密应用

本指南介绍了基于 IPsec 的 strongSwan 解决方案,该方案基于 NVIDIA® BlueField® DPU 之上。

注意

如果您的目标应用使用 100Gb/s 或更高的带宽,其中大部分带宽分配给 IPsec 流量,请参阅NVIDIA BlueField-2 DPU 产品发行说明,了解潜在的带宽限制。要访问相关的产品发行说明,请联系您的 NVIDIA 销售代表。

IPsec 用于在不同设备之间建立加密连接。它有助于确保通过公共网络发送的数据安全。IPsec 通常用于建立 VPN,其工作原理是对 IP 数据包进行加密,并验证数据包的来源。

IPsec 包含以下主要模块

  • 密钥交换 – 密钥是一个随机字节字符串,可用于消息的加密和解密。IPsec 通过连接设备之间的密钥交换来设置密钥,以便每个设备都可以解密另一设备的消息。

  • 身份验证 – IPsec 为每个数据包提供身份验证,以确保它们来自可信来源。

  • 加密 – IPsec 加密每个数据包中的有效载荷,并可能根据传输模式加密数据包的 IP 标头。

  • 解密 – 在通信的另一端,数据包由 IPsec 支持的节点解密。

IPsec 支持两种类型的标头

  • 身份验证标头 (AH) – AH 协议确保数据包来自可信来源。AH 不提供任何加密。

  • 封装安全协议 (ESP) – ESP 加密每个数据包的有效载荷以及 IP 标头(取决于传输模式)。ESP 为每个数据包添加了自己的标头和尾部。

IPsec 支持两种类型的传输模式

  • IPsec 隧道模式 – 在两个网络节点之间使用,每个节点在公共网络上充当隧道发起者/终止者。在此模式下,原始 IP 标头和有效载荷都被加密。由于 IP 标头已加密,因此添加了一个 IP 隧道用于网络转发。在隧道的每一端,路由器都会解密 IP 标头以将数据包路由到其目的地。

  • 传输模式 – 每个数据包的有效载荷都被加密,但原始 IP 标头未加密。因此,中间网络节点能够查看每个数据包的目的地并路由数据包,除非使用单独的隧道协议。

strongSwan 是一个基于 IPsec 的开源 VPN 解决方案。有关更多信息,请参阅strongSwan 文档

IPsec 数据包卸载将 IPsec 加密(加密/解密)和 IPsec 封装都卸载到硬件。

部署模型允许 IPsec 卸载对主机透明,其优势在于保护传统工作负载(不依赖于主机 SW 堆栈)和主机上零 CPU 利用率。

IPsec 数据包卸载配置与 OVS 卸载一起工作并对其透明。这意味着来自 OVS 卸载的所有数据包都由 IPsec 规则加密。

下图说明了 IPsec 数据包卸载和 OVS VXLAN 卸载之间的交互。

system_design_diagram-version-1-modificationdate-1735039485060-api-v2.png

注意

IPsec 数据包卸载仅在 Ubuntu Bluefield 内核 5.15 上受支持

注意

OVS 卸载和 IPsec IPv6 不能一起工作。

application_architecture_diagram-version-1-modificationdate-1735039485443-api-v2.png

  1. 使用 swanctl.conf 配置文件配置 strongSwan IPsec 卸载。

  2. 流量从主机通过 BlueField 发送。

  3. 使用 OVS,数据包在入口处使用隧道协议(例如 VXLAN)进行封装,以匹配 strongSwan 的 IPsec 配置。

  4. 由 strongSwan 配置文件设置,流量将使用硬件卸载进行加密。

  5. 出口流程首先是解密,然后是隧道标头的解封装,并转发到相关的物理功能。

不适用

  • 需要 NVIDIA® BlueField®-2 平台或更高版本

  • 带有内核 5.15 的 BlueField Ubuntu BFB

  • strongSwan 版本 5.9.10 或更高版本

编译和安装 strongSwan

注意

以下部分提供了编译和安装 NVIDIA 的 strongSwan 分支(分支 BF-5.9.10)的说明,但用户可以使用上游 strongSwan 说明(只要版本为 5.9.10 或更高版本)。

要从源代码编译和安装 strongswan,请在 BlueField (Arm 核) 上执行以下步骤

  1. 安装依赖项

    复制
    已复制!
                

    sudo apt install dpkg-dev devscripts debhelper dh-autoreconf autoconf flex libtool gperf lzip yacc bison flex m4 libgmp-dev libsystemd-dev -y

  2. 克隆和编译 strongSwan

    复制
    已复制!
                

    $ git clone https://github.com/Mellanox/strongswan.git $ cd strongswan $ git checkout BF-5.9.10 $ dpkg-buildpackage -uc -us -b

    这应该在父文件夹中创建两个 .deb 文件,strongswan_5.9.10-2.bf_arm64.debstrongswan-swanctl_5.9.10-2.bf_arm64.deb

    注意

    strongSwan BF-5.9.10 基于官方 strongSwan 5.9.10 分支,并添加了对 DOCA IPsec 插件的打包和支持。有关 strongSwan DOCA 插件的更多信息,请参阅DOCA IPsec 安全网关应用指南

  3. 卸载所有旧的 strongSwan 和 charon 软件包以防止冲突

    复制
    已复制!
                

    $ sudo dpkg -P --force-depends <packages>

    示例

    复制
    已复制!
                

    $ sudo dpkg -P --force-depends libstrongswan libstrongswan-standard-plugins strongswan strongswan-charon strongswan-libcharon strongswan-starter libcharon-extauth-plugins

    信息

    用户可以通过运行 dpkg -l | grep strongswandpkg -l | grep charon 来查找所有 strongSwan 和 charon 软件包。

  4. 安装两个 strongSwan .deb 文件(它们应该已在父文件夹中创建)。

    复制
    已复制!
                

    $ sudo dpkg -i ../strongswan_5.9.10-2.bf_arm64.deb ../strongswan-swanctl_5.9.10-2.bf_arm64.deb

以下部分提供有关手动配置 IPsec 数据包卸载的常规信息,以及有关将 OVS IPsec 与 strongSwan 结合使用的具体信息。

注意

有一个脚本 east_west_overlay_encryption.sh,它会自动执行本节中的步骤。

如果您直接使用 ip xfrm 工具,请使用 /opt/mellanox/iproute2/sbin/ip 以从 IPsec 数据包卸载支持中受益。

配置流程分为两个部分

  1. 启用 IPsec 数据包卸载模式。

  2. 使用三种身份验证模式之一配置 IPsec OVS 网桥。

注意

步骤二的替代方案是手动配置 swanctl.conf 文件(strongSwan 的配置文件),并直接使用 strongSwan 而不是使用 IPsec OVS(它会自动生成 swanctl.conf 文件),如“使用 strongSwan 手动配置 OVS IPsec”部分中所述。

启用 IPsec 数据包卸载

本节显式地在 Arm 内核上启用 IPsec 数据包卸载,然后再设置支持卸载的 IPsec 隧道。

注意

如果 OVS VXLAN 隧道配置已存在,请在执行以下步骤之前停止 openvswitch 服务,并在之后重新启动该服务。

在 Arm 内核上显式启用 IPsec 完全卸载。

  1. /etc/mellanox/mlnx-bf.conf 中设置 IPSEC_FULL_OFFLOAD="yes"

    注意

    如果 IPSEC_FULL_OFFLOAD 未出现在 /etc/mellanox/mlnx-bf.conf 中,则您可能正在使用旧版本的 BlueField 镜像。在DOCA 归档中查看以前 DOCA 版本中启用 IPsec 完全卸载的方式。

  2. 重启 IB 驱动程序(重启也有效)。运行

    复制
    已复制!
                

    /etc/init.d/openibd restart

注意

要恢复 IPsec 完全卸载模式,请重复步骤 1 中的过程,唯一的区别是在 /etc/mellanox/mlnx-bf.conf 中设置 IPSEC_FULL_OFFLOAD="no"


配置 OVS IPsec

注意

在继续本节之前,请确保按照“启用 IPsec 数据包卸载”部分中的步骤对两个 DPU 执行操作。

本节配置 OVS IPsec VXLAN 隧道,该隧道自动生成 swanctl.conf 文件并运行 strongSwan(IPsec 守护程序)。下图说明了两个 BlueField DPU(左和右)使用安全 VXLAN 通道的示例。

application_architecture_diagram-version-1-modificationdate-1735039485443-api-v2.png

需要在两个 BlueField DPU 之间构建 OVS IPsec 隧道,以连接两个主机(右和左)。

OVS IPsec 隧道配置了两个主机 InfiniBand 设备之间未知的 IPsec 连接。在本示例中,主机的 InfiniBand 网络设备为 HOST_PF,DPU 的主机表示为 PF_REP,DPU 的物理功能为 PF

此示例在两个 Arm 上设置以下变量

复制
已复制!
            

# host_ip1=1.1.1.1 # host_ip2=1.1.1.2 # HOST_PF=ens7np0 # ip1=192.168.50.1 # ip2=192.168.50.2 # PF=p0 # PF_REP=pf0hpf

注意

HOST_PF 的名称在您的机器中可能有所不同。您可以通过运行以下命令进行验证

复制
已复制!
            

host# ibdev2netdev mlx5_0 port 1 ==> ens7np0 (Down) mlx5_1 port 1 ==> ens8np1 (Down)

本示例使用第一个 InfiniBand 的 (mlx5_0) 网络设备,即 ens7np0

  1. 为主机 (x86) 的 HOST_PF 配置 IP 地址

    1. host_1

      复制
      已复制!
                  

      # ifconfig $HOST_PF $host_ip1/24 up

    2. host_2

      复制
      已复制!
                  

      # ifconfig $HOST_PF $host_ip2/24 up

      注意

      步骤 1 是唯一在主机上执行的命令,其余命令在 Arm (DPU) 侧执行。

  2. 为两个 Arm 的 PF 配置 IP 地址

    1. Arm_1

      复制
      已复制!
                  

      # ifconfig $PF $ip1/24 up

    2. Arm_2

      复制
      已复制!
                  

      # ifconfig $PF $ip2/24 up

  3. 启动 Open vSwitch。如果您的操作系统是 Ubuntu,请在 Arm_1Arm_2 上运行以下命令

    复制
    已复制!
                

    # service openvswitch-switch start

    如果您的操作系统是 CentOS,请在 Arm_1Arm_2 上运行以下命令

    复制
    已复制!
                

    # service openvswitch restart

  4. 启动 OVS IPsec 服务。在 Arm_1Arm_2 上运行

    复制
    已复制!
                

    # systemctl start openvswitch-ipsec.service

  5. 在两个 DPU 中设置 OVS 网桥。在 Arm_1Arm_2 上运行

    复制
    已复制!
                

    # ovs-vsctl add-br vxlan-br # ovs-vsctl add-port ovs-br $PF_REP # ovs-vsctl set Open_vSwitch . other_config:hw-offload=true

    注意

    配置 other_config:hw-offload=true 会设置 IPsec 数据包卸载。将其设置为 false 会设置软件 IPsec。

    注意

    隧道接口 (PF) 的 MTU 应至少比上方隧道端点 (PF_REP) 的 MTU 大 50 字节,以考虑 VXLAN 隧道标头的大小。例如,如果 PF_REP 的 MTU 为 1500,则 PF 的 MTU 应至少为 1550。

    要配置 PF 的 MTU

    复制
    已复制!
                

    # ifconfig $PF mtu $PF_MTU up

  6. 在 OVS 网桥上设置 IPsec 隧道。可能存在三种身份验证方法,选择您首选的身份验证方法,然后按照与其相关的步骤操作。请注意,后两种身份验证方法需要您创建证书(自签名证书或证书颁发机构证书)。

注意

在使用三种身份验证方法之一设置 IPsec 隧道后,strongSwan 配置将自动完成,并且将生成 swanctl.conf 文件,并且 strongSwan 将自动运行。

身份验证方法

以下小节详细介绍了在 OVS 网桥上设置 IPsec 隧道的可能身份验证方法。

预共享密钥

此方法使用预共享密钥配置 OVS IPsec。您必须选择一个预共享密钥,例如

复制
已复制!
            

psk=swordfish

  1. 设置 VXLAN 隧道

    1. Arm_1 上,运行

      复制
      已复制!
                  

      # ovs-vsctl add-port vxlan-br tun -- \ set interface tun type=vxlan \ options:local_ip=$ip1 \ options:remote_ip=$ip2 \ options:key=100 \ options:dst_port=4789 \ options:psk=$psk

    2. Arm_2 上,运行

      复制
      已复制!
                  

      # ovs-vsctl add-port vxlan-br tun -- \ set interface tun type=vxlan \ options:local_ip=$ip2 \ options:remote_ip=$ip1 \ options:key=100 \ options:dst_port=4789\ options:psk=$psk

自签名证书

此方法使用自签名证书配置 OVS IPsec。您必须生成自签名证书和密钥。本示例演示了如何使用 ovs-pki 生成自签名证书,但您可以以任何其他方式生成它们,同时跳过步骤 1。

  1. 使用 ovs-pki 生成自签名证书

    1. Arm_1 上,运行

      复制
      已复制!
                  

      # ovs-pki req -u host_1 # ovs-pki self-sign host_1

      运行此代码后,您应该拥有 host_1-cert.pemhost_1-privkey.pem

    2. Arm_2 上,运行

      复制
      已复制!
                  

      # ovs-pki req -u host_2 # ovs-pki self-sign host_2

      运行此代码后,您应该拥有 host_2-cert.pemhost_2-privkey.pem

  2. 配置证书和私钥

    1. Arm_1 的证书复制到 Arm_2,并将 Arm_2 的证书复制到 Arm_1

    2. 在每台机器上,将 host_1-privkey.pemhost_2-cert.pem 移动到 /etc/swanctl/x509/(如果在 Ubuntu 上)或 /etc/strongswan/swanctl/x509/(如果在 CentOS 上)。

    3. 在每台机器上,将本地私钥(Arm_1 上的 host_1-privkey.pemArm_2 上的 host_2-privkey.pem)移动到 /etc/swanctl/private(如果在 Ubuntu 上)或 /etc/strongswan/swanctl/private(如果在 CentOS 上)。

  3. 在两侧设置 OVS other_config

    1. Arm_1

      复制
      已复制!
                  

      # ovs-vsctl set Open_vSwitch . other_config:certificate=/etc/swanctl/x509/host_1-cert.pem \ other_config:private_key=/etc/swanctl/private/host_1-privkey.pem

    2. Arm_2

      复制
      已复制!
                  

      # ovs-vsctl set Open_vSwitch . other_config:certificate=/etc/swanctl/x509/host_2-cert.pem \ other_config:private_key=/etc/swanctl/private/host_2-privkey.pem

  4. 设置 VXLAN 隧道

    1. Arm_1

      复制
      已复制!
                  

      # ovs-vsctl add-port vxlan-br vxlanp0 -- set interface vxlanp0 type=vxlan options:local_ip=$ip1 \ options:remote_ip=$ip2 options:key=100 options:dst_port=4789 \ options:remote_cert=/etc/swanctl/x509/host_2-cert.pem # service openvswitch-switch restart

    2. Arm_2

      复制
      已复制!
                  

      # ovs-vsctl add-port vxlan-br vxlanp0 -- set interface vxlanp0 type=vxlan options:local_ip=$ip2 \ options:remote_ip=$ip1 options:key=100 options:dst_port=4789 \ options:remote_cert=/etc/swanctl/x509/host_1-cert.pem # service openvswitch-switch restart

注意

在步骤 3 和 4 中,如果您使用的是 CentOS,则必须将证书的路径更改为 /etc/strongswan/swanctl/x509/,并将私钥的路径更改为 /etc/strongswan/swanctl/private


CA 签名证书

此方法使用证书颁发机构 (CA) 签名证书配置 OVS IPsec。您必须生成 CA 签名证书和密钥。本示例演示了如何使用 ovs-pki 生成 CA 签名证书,但您可以以任何其他方式生成它们,同时跳过步骤 1。

  1. 使用 ovs-pki 生成 CA 签名证书。对于此方法,所有证书和请求都必须在证书生成和签名期间位于同一目录中。本示例将此目录称为 certsworkspace

    1. Arm_1 上,运行

      复制
      已复制!
                  

      # ovs-pki init --force # cp /var/lib/openvswitch/pki/controllerca/cacert.pem <path_to>/certsworkspace # cd <path_to>/certsworkspace # ovs-pki req -u host_1 # ovs-pki sign host1 switch

      运行此代码后,您应该在 certsworkspace 文件夹中拥有 host_1-cert.pemhost_1-privkey.pemcacert.pm

    2. Arm_2 上,运行

      复制
      已复制!
                  

      # ovs-pki init --force # cp /var/lib/openvswitch/pki/controllerca/cacert.pem <path_to>/certsworkspace # cd <path_to>/certsworkspace # ovs-pki req -u host_2 # ovs-pki sign host_2 switch

      运行此代码后,您应该在 certsworkspace 文件夹中拥有 host_2-cert.pemhost_2-privkey.pemcacert.pm

  2. 配置证书和私钥

    1. Arm_1 的证书复制到 Arm_2,并将 Arm_2 的证书复制到 Arm_1

    2. 在每台机器上,将 host_1-privkey.pemhost_2-cert.pem 移动到 /etc/swanctl/x509/(如果在 Ubuntu 上)或 /etc/strongswan/swanctl/x509/(如果在 CentOS 上)。

    3. 在每台机器上,将本地私钥(如果是 Arm_1 则为 host_1-privkey.pem,如果是 Arm_2 则为 host_2-privkey.pem)移动到 /etc/swanctl/private(如果在 Ubuntu 上)或 /etc/strongswan/swanctl/private(如果在 CentOS 上)。

    4. 在每台机器上,将 cacert.pem 复制到 x509ca 目录下的 /etc/swanctl/x509ca/(如果在 Ubuntu 上)或 /etc/strongswan/swanctl/x509ca/(如果在 CentOS 上)。

  3. 在两侧设置 OVS other_config

    1. Arm_1

      复制
      已复制!
                  

      # ovs-vsctl set Open_vSwitch . \ other_config:certificate=/etc/strongswan/swanctl/x509/host_1.pem \ other_config:private_key=/etc/strongswan/swanctl/private/host_1-privkey.pem \ other_config:ca_cert=/etc/strongswan/swanctl/x509ca/cacert.pem

    2. Arm_2

      复制
      已复制!
                  

      # ovs-vsctl set Open_vSwitch . \ other_config:certificate=/etc/strongswan/swanctl/x509/host_2.pem \ other_config:private_key=/etc/strongswan/swanctl/private/host_2-privkey.pem \ other_config:ca_cert=/etc/strongswan/swanctl/x509ca/cacert.pem

  4. 设置隧道

    1. Arm_1

      复制
      已复制!
                  

      # ovs-vsctl add-port vxlan-br vxlanp0 -- set interface vxlanp0 type=vxlan options:local_ip=$ip1 \ options:remote_ip=$ip2 options:key=100 options:dst_port=4789 \ options:remote_name=host_2 # service openvswitch-switch restart

    2. Arm_2

      复制
      已复制!
                  

      # ovs-vsctl add-port vxlan-br vxlanp0 -- set interface vxlanp0 type=vxlan options:local_ip=$ip2 \ options:remote_ip=$ip1 options:key=100 options:dst_port=4789 \ options:remote_name=host_1 # service openvswitch-switch restart

注意

在步骤 3 和 4 中,如果您使用的是 CenOS,则必须将证书的路径更改为 /etc/strongswan/swanctl/x509/,将 CA 证书的路径更改为 /etc/strongswan/swanctl/x509ca/,并将私钥的路径更改为 /etc/strongswan/swanctl/private/

确保 IPsec 已配置

使用 /opt/mellanox/iproute2/sbin/ip xfrm state show,您应该能够看到为使用关键字 in mode packet 配置的 IPsec 连接的 4 个 IPsec 状态,这意味着您处于 IPsec 数据包硬件卸载模式。

例如,在使用预共享密钥方法配置 IPsec 后,您将在 Arm_1 上获得类似于以下内容的结果

复制
已复制!
            

# /opt/mellanox/iproute2/sbin/ip xfrm state show   src 192.168.50.1 dst 192.168.50.2 proto esp spi 0xcc8bf8ad reqid 1 mode transport replay-window 0 flag esn aead rfc4106(gcm(aes)) 0x9f45cc4577e70c4e077bcc0c1473a782143e7ad199f58566519639d03b593b8996383f11 128 anti-replay esn context: seq-hi 0x0, seq 0x0, oseq-hi 0x0, oseq 0x0 replay_window 1, bitmap-length 1 00000000  crypto offload parameters: dev p0 dir out mode packet sel src 192.168.50.1/32 dst 192.168.50.2/32 proto udp sport 4789  src 192.168.50.2 dst 192.168.50.1 proto esp spi 0xce8bf4b6 reqid 1 mode transport replay-window 0 flag esn aead rfc4106(gcm(aes)) 0xf2d0e335d9a64ef6e385a630a32b0e43bb52f581290cd34bbb8f7592d54f11657ed0258e 128 anti-replay esn context: seq-hi 0x0, seq 0x0, oseq-hi 0x0, oseq 0x0 replay_window 32, bitmap-length 1 00000000  crypto offload parameters: dev p0 dir in mode packet sel src 192.168.50.2/32 dst 192.168.50.1/32 proto udp dport 4789  src 192.168.50.1 dst 192.168.50.2 proto esp spi 0xcb600a84 reqid 2 mode transport replay-window 0 flag esn aead rfc4106(gcm(aes)) 0x7fb26035299bcc9b973abea5d581acfbcf87cbf0bd053b745c4d95c62311f934010973f6 128 anti-replay esn context: seq-hi 0x0, seq 0x0, oseq-hi 0x0, oseq 0x0 replay_window 1, bitmap-length 1 00000000  crypto offload parameters: dev p0 dir out mode packet sel src 192.168.50.1/32 dst 192.168.50.2/32 proto udp dport 4789  src 192.168.50.2 dst 192.168.50.1 proto esp spi 0xc137d5a0 reqid 2 mode transport replay-window 0 flag esn aead rfc4106(gcm(aes)) 0x28e3d12ad4e24aa9d9de9459de8ef8bb4379e8e12faac0054c5b629b6aa50fdeda8e4574 128 anti-replay esn context: seq-hi 0x0, seq 0x0, oseq-hi 0x0, oseq 0x0 replay_window 32, bitmap-length 1 00000000  crypto offload parameters: dev p0 dir in mode packet sel src 192.168.50.2/32 dst 192.168.50.1/32 proto udp sport 4789 

在确保 IPsec 连接已配置后,您可以使用 HOST_PF 的 IP 地址在 host_1host_2 之间发送加密流量。

使用 strongSwan 手动配置 OVS IPsec

本节配置一个 OVS VXLAN 隧道,然后手动使用 swanctl.conf 文件并运行 strongSwan(IPsec 守护程序)。

注意

在继续本节之前,请确保按照“启用 IPsec 数据包卸载”部分中的步骤对两个 DPU 执行操作。

  1. 在 OVS 上构建 VXLAN 隧道,并将 PF 表示器连接到同一 OVS 网桥。

    1. Arm_1

      复制
      已复制!
                  

      # ovs-vsctl add-br vxlan-br # ovs-vsctl add-port vxlan-br PF_REP # ovs-vsctl add-port vxlan-br vxlan11 -- set interface vxlan11 type=vxlan options:local_ip=$ip1 \ options:remote_ip=$ip2 options:key=100 options:dst_port=4789 \ # ovs-vsctl set Open_vSwitch . other_config:hw-offload=true

    2. Arm_2

      复制
      已复制!
                  

      # ovs-vsctl add-br vxlan-br # ovs-vsctl add-port vxlan-br PF_REP # ovs-vsctl add-port vxlan-br vxlan11 -- set interface vxlan11 type=vxlan options:local_ip=$ip2 \ options:remote_ip=$ip1 options:key=100 options:dst_port=4789 \ # ovs-vsctl set Open_vSwitch . other_config:hw-offload=true

  2. 如果您的操作系统是 Ubuntu,请在 Arm_1Arm_2 上运行

    复制
    已复制!
                

    service openvswitch-switch start

    如果您的操作系统是 CentOS,请运行

    复制
    已复制!
                

    service openvswitch restart

  3. 为 PF 启用 TC 卸载。在 Arm_1Arm_2 上运行

    复制
    已复制!
                

    # ethtool -K $PF hw-tc-offload on

  4. 从 Arm 禁用主机 PF 作为端口所有者。在 Arm_1Arm_2 上运行

    复制
    已复制!
                

    # mlxprivhost -d /dev/mst/mt${pciconf} --disable_port_owner r

    注意

    要获取 ${pciconf},请在 DPU 上运行以下命令

    复制
    已复制!
                

    # ls --color=never /dev/mst/ | grep --color=never '^m.*f0$' | cut -c 3-

    例如

    复制
    已复制!
                

    # mlxprivhost -d /dev/mst/mt41686_pciconf0 --disable_port_owner r

  5. 为每台机器配置 swanctl.conf 文件。请参阅 swanctl.conf 文件部分。

    注意

    每台机器在 /etc/swanctl/conf.d/ 中应正好有一个 .swanctl.conf 文件。

  6. 加载 swanctl.conf 文件并初始化 strongSwan。运行

    1. Arm_2 上,运行

      复制
      已复制!
                  

      systemctl restart strongswan.service swanctl --load-all

    2. Arm_1 上,运行

      复制
      已复制!
                  

      systemctl restart strongswan.service swanctl --load-all swanctl -i --child bf

现在应该建立 IPsec 连接。

swanctl.conf 文件

strongSwan 使用添加到其配置文件 swanctl.conf 中的新值来配置 IPSec 数据包硬件卸载。该文件应放置在 sysconfdir 下,默认情况下可以在 /etc/swanctl/swanctl.conf 中找到。

术语左 (BFL) 和右 (BFR) 参考“应用架构”下的图示,用于标识通信的两个节点(或机器)。

注意

任何一方(BFL 或 BFR)都可以履行任何角色(发起者或接收者)。

在本示例中,192.168.50.1 用于左 PF 上行链路,192.168.50.2 用于右 PF 上行链路。

复制
已复制!
            

connections { BFL-BFR { local_addrs = 192.168.50.1 remote_addrs = 192.168.50.2   local { auth = psk id = host1 } remote { auth = psk id = host2 }   children { bf-out { local_ts = 192.168.50.1/24 [udp] remote_ts = 192.168.50.2/24 [udp/4789] esp_proposals = aes128gcm128-x25519-esn mode = transport policies_fwd_out = yes hw_offload = packet } bf-in { local_ts = 192.168.50.1/24 [udp/4789] remote_ts = 192.168.50.2/24 [udp] esp_proposals = aes128gcm128-x25519-esn mode = transport policies_fwd_out = yes hw_offload = packet } } version = 2 mobike = no reauth_time = 0 proposals = aes128-sha256-x25519 } }   secrets { ike-BF { id-host1 = host1 id-host2 = host2 secret = 0sv+NkxY9LLZvwj4qCC2o/gGrWDF2d21jL } }

BFB 安装程序将在 strongSwan conf.d 目录中放置两个示例 swanctl.conf 文件,分别用于 BFL 和 BFR(BFL.swanctl.confBFR.swanctl.conf)。每个节点在其 strongSwan conf.d 目录中应只有一个 swanctl.conf 文件。

请注意

  • hw_offload = packet" 负责配置 IPsec 数据包卸载

  • 数据包卸载支持已添加到现有的 hw_offload 字段中,并保持向后兼容性。

    供您参考

    描述

    不配置硬件卸载。

    crypto

    如果内核和硬件支持,则配置加密硬件卸载;如果不支持,则失败。

    与 crypto 相同(被认为是旧版)。

    packet

    如果内核和硬件支持,则配置数据包硬件卸载;如果不支持,则失败。

    auto

    如果内核和硬件支持,则配置数据包硬件卸载;不失败(必要时执行回退到 crypto 或 否)。

  • 每当 hw_offload 的值更改时,都必须重新加载 strongSwan 配置。

  • 切换到加密硬件卸载需要事先将 devlink/ipsec_mode 设置为 none

  • 切换到数据包硬件卸载需要设置

  • [udp/4789] 对于指示 strongSwan 仅对 VXLAN 通信进行 IPSec 至关重要。

  • 数据包硬件卸载只能在通过 VXLAN 流式传输的内容上完成。

请注意以下限制

字段

限制

reauth_time

如果设置则忽略

rekey_time

请勿使用。如果设置则忽略。

rekey_bytes

请勿使用。不支持,如果设置则会失败。

rekey_packets

用于重新密钥


安装

有关如何安装 BlueField 相关软件的详细信息,请参阅DOCA Linux 安装指南

应用执行

注释

  • IPsec 守护程序由 systemd strongswan.service 启动

  • 使用 systemctl [start | stop | restart] 通过 strongswan.service 控制 IPsec 守护程序。例如,要重启,请运行

    复制
    已复制!
                

    systemctl restart strongswan.service

    此命令与 ipsec restart 的效果相同。

    注意

    请勿使用 ipsec 脚本(位于 /usr/sbin/ipsec 下)来重启/停止/启动 IPsec 连接。

本小节介绍如何使用脚本配置和设置 IPsec 连接。要配置 IPsec 连接,您需要两个 DPU,分别称为发起方和接收方机器。两台机器之间没有区别,只是发起方是启动两者之间连接的机器(并且应在接收方之后运行脚本)。

该脚本位于 /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh 下。

脚本参数

参数

描述

有效值

何时使用

注释

side

连接的一方(接收方或发起方)。

  • r|receiver

  • i|intitiator

始终

此参数必须始终在命令行上传递,并且不能在 JSON 参数文件中传递。

j|json

JSON 参数文件的完整路径。

JSON 文件路径,根据以下文件中演示的模板编写:/opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption_params.json

要将参数作为 JSON 文件传递

当使用 JSON 文件运行脚本时,您不能在命令行上传递 side 和 JSON 文件以外的其他参数。

initiator_ip_addr

发起方机器端口接口的 IP 地址,用于 IPsec 连接。

有效的 IP 地址,范围从 1.1.1.1 到 255.255.255.255。

始终

在 JSON 文件中,默认设置为 192.168.50.1。

receiver_ip_addr

接收方机器端口接口的 IP 地址,用于 IPsec 连接。

有效的 IP 地址,范围从 1.1.1.1 到 255.255.255.255。

始终

在 JSON 文件中,默认设置为 192.168.50.2。

port_num

端口接口的编号 (p0/p1),用于 IPsec 连接。

0 或 1。

始终

在 JSON 文件中,默认设置为 0。

auth_method

IPsec 的身份验证方法。可以是 psk(预共享密钥)、ssc(自签名证书)或 ca(CA 签名证书)。默认设置为 psk

可以是 psk(预共享密钥)、ssc(自签名证书)或 ca(CA 签名证书)。

始终

在 JSON 文件中,默认设置为 psk.

preshared_key

预共享密钥。

字符序列(字符串)。

auth_method 参数为 psk

在 JSON 文件中,默认设置为 swordfish。发起方和接收方都必须配置相同的 preshared_key

initiator_cert_path

发起方的证书。

任何有效的自签名或 CA 签名证书。必须提供证书的完整路径。

auth_method 参数为 sscca

发起方和接收方都必须配置相同的 initiator_cert_path

receiver_cert_path

接收方的证书。

任何有效的自签名或 CA 签名证书。必须提供证书的完整路径。

auth_method 参数为 sscca

发起方和接收方都必须配置相同的 receiver _cert_path

initiator_key_path

发起方的私钥。

使用证书生成的任何有效私钥。必须提供私钥的完整路径。

side 参数设置为 initiator,并且 auth_method 设置为 sscca

不适用

receiver_key_path

接收方的私钥。

使用证书生成的任何有效私钥。必须提供私钥的完整路径。

side 参数设置为 receiver,并且 auth_method 设置为 sscca

不适用

initiator_cacert_path

发起方的 CA 证书。

任何有效的 CA 证书。必须提供证书的完整路径。

sideauth_method 参数分别设置为 initiatorca

不适用

receiver_cacert_path

接收方的 CA 证书。

任何有效的 CA 证书。必须提供证书的完整路径。

sideauth_method 参数分别设置为 receiverca

不适用

initiator_cn

发起方证书的通用名称 (CN)。

必须与发起方证书中描述的 CN 相同。

sideauth_method 参数分别设置为 receiverca

不适用

receiver_cn

接收方证书的 CN。

必须与接收方证书中描述的 CN 相同。

sideauth_method 参数分别设置为 initiatorca

不适用

有两种传递参数的方法,一种是使用 JSON 参数文件,另一种是通过在命令行上传递参数

使用 JSON 参数文件

在此方法中,您必须配置参数文件,然后运行脚本

  1. 配置位于 /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption_params.json 下的 JSON 参数文件,或根据 east_west_overlay_encryption_params.json 的模板为脚本创建一个 JSON 文件,具体说明请参见“脚本参数”部分。

  2. 在接收方的 DPU 上使用 JSON 文件运行脚本

    复制
    已复制!
                

    /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh --side=r --json=/opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption_params.json

  3. 在发起方的 DPU 上运行脚本

    复制
    已复制!
                

    /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh --side=i --json=/opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption_params.json

    您现在可以通过为 VXLAN 配置的 PF 接口 (192.168.50.[1|2]) 发送加密数据。

在命令行上传递参数

在此方法中,您无需配置参数文件,可以使用适当的参数运行脚本。

传递预共享密钥身份验证方法的参数

  1. 在接收方的 DPU 上运行脚本

    复制
    已复制!
                

    /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh --side=r --initiator_ip_addr=INITIATOR_IP_ADDRESS --receiver_ip_addr=RECEIVER_IP_ADDRESS --port_num=PORT_NUM \ --auth_method=psk --preshared_key=PRESHARED_KEY

  2. 在发起方的 DPU 上运行脚本

    复制
    已复制!
                

    /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh --side=i --initiator_ip_addr=INITIATOR_IP_ADDRESS --receiver_ip_addr=RECEIVER_IP_ADDRESS --port_num=PORT_NUM \ --auth_method=psk --preshared_key=PRESHARED_KEY

传递自签名证书身份验证方法的参数

  1. 在接收方的 DPU 上运行脚本

    复制
    已复制!
                

    /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh --side=r --initiator_ip_addr=INITIATOR_IP_ADDRESS --receiver_ip_addr=RECEIVER_IP_ADDRESS --port_num=PORT_NUM \ --auth_method=ssc --initiator_cert_path=INITIATOR_CERT_PATH --receiver_cert_path=RECEIVER_CERT_PATH --receiver_key_path=RECEIVER_KEY_PATH

  2. 在发起方的 DPU 上运行脚本

    复制
    已复制!
                

    /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh --side=i --initiator_ip_addr=INITIATOR_IP_ADDRESS --receiver_ip_addr=RECEIVER_IP_ADDRESS --port_num=PORT_NUM \ --auth_method=ssc --initiator_cert_path=INITIATOR_CERT_PATH --receiver_cert_path=RECEIVER_CERT_PATH --initiator_key_path=INITIATOR_KEY_PATH

传递 CA 证书身份验证方法的参数

  1. 在接收方的 DPU 上运行脚本

    复制
    已复制!
                

    /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh --side=r --initiator_ip_addr=INITIATOR_IP_ADDRESS --receiver_ip_addr=RECEIVER_IP_ADDRESS --port_num=PORT_NUM \ --auth_method=ca --initiator_cert_path=INITIATOR_CERT_PATH --receiver_cert_path=RECEIVER_CERT_PATH --receiver_key_path=RECEIVER_KEY_PATH --receiver_cacert_path=RECEIVER_CACERT_PATH --initiator_cn=INITIATOR_CN

  2. 在发起方的 DPU 上运行脚本

    复制
    已复制!
                

    /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh --side=i --initiator_ip_addr=INITIATOR_IP_ADDRESS --receiver_ip_addr=RECEIVER_IP_ADDRESS --port_num=PORT_NUM \ --auth_method=ssc --initiator_cert_path=INITIATOR_CERT_PATH --receiver_cert_path=RECEIVER_CERT_PATH --initiator_key_path=INITIATOR_KEY_PATH --initiator_cacert_path=INITIATOR_CACERT_PATH --receiver_cn=RECEIVER_CN

如需帮助和使用方法,请使用 --help/-h 标志运行脚本

复制
已复制!
            

/opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh -h

故障排除

请参考 DOCA 故障排除 文档,以解决您在安装或执行 DOCA 应用程序时可能遇到的任何问题。

恢复 IPsec 配置

要销毁 IPsec 配置,请在两台机器上运行以下命令

复制
已复制!
            

/opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh -d

注意

请确保在任一机器上运行应用程序至少两分钟后,再运行此命令。 否则,可能会导致错误。

注意

如果您在未先初始化连接的情况下运行此命令(在 运行 strongSwan 示例 中),您可能会收到错误。 这些错误没有功能影响,可以安全地忽略。


    • /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption.sh

    • /opt/mellanox/doca/applications/east_west_overlay_encryption/east_west_overlay_encryption_params.json

© 版权所有 2025,NVIDIA。 上次更新于 2025 年 2 月 12 日。