IPsec 数据包卸载
此功能在启用加密功能的 BlueField-2 DPU 产品以及 ConnectX-6 Dx、ConnectX-6 Lx 和 ConnectX-7 网卡上受支持。请注意,ConnectX-6 网卡不支持此功能。
更新/未来的启用加密功能的 DPU 和适配器产品系列也应支持此功能,除非其文档中另有明确说明。
当仅使用 NVIDIA® BlueField®-2 DPU 和 NVIDIA® ConnectX®-6 Dx 适配器时:如果您的目标应用程序利用 100Gb/s 或更高的带宽,其中大部分带宽分配给 IPsec 流量,请参阅相关的 DPU 或适配器卡产品发行说明,以了解潜在的带宽限制。要访问发行说明,请访问 NVIDIA 网络的文档网站,或联系您的 NVIDIA 销售代表。
ConnectX-6 Dx 适配器仅支持完全卸载:加密叠加(其中 Hypervisor 控制 IPsec 卸载 - 例如,参见 OVS IPsec - https://docs.openvswitch.org/en/latest/tutorials/ipsec/),在装有 NVIDIA 驱动程序的 Linux 操作系统中。
此功能需要 Linux 内核 v6.6 或更高版本。
当仅由 VM(VF 功能)控制时,IPsec 隧道模式在 alpha 级别受支持。
此功能旨在在 switchdev 模式下启用 IPsec 完全卸载。ip-xfrm
命令用于配置 IPsec 状态和策略,它类似于传统模式配置。但是,在这种模式下使用完全卸载有一些限制
仅支持 IPsec 传输模式和隧道模式。
如果存在任何已卸载的 TC 规则,则不允许卸载第一个 IPsec TX 状态/策略,第一个 RX 状态/策略也适用。更具体地说,必须先创建 IPsec RX/TX 表,然后才能卸载任何 TC 规则。因此,通常的做法是在添加任何 TC 规则之前配置 IPsec 规则。
以下是使用 VXLan 隧道的 IPsec 配置示例
启用 switchdev 模式
echo
1
> /sys/class
/net/$PF0 /device/sriov_numvfs echo0000
:08
:00.2
> /sys/bus/pci/drivers/mlx5_core/unbind devlink dev param set pci/0000
:08
:00.0
name flow_steering_mode value dmfs cmode runtime devlink dev eswitch set pci/0000
:08
:00.0
mode switchdev echo0000
:08
:00.2
> /sys/bus/pci/drivers/mlx5_core/bind配置 PF/VF/REP 网络设备,并将 VF 放置在命名空间中
ifconfig $PF $LOCAL_TUN/
16
up ip l set dev $PF mtu2000
ifconfig $REP up ip netns add ns0 ip link set dev $VF netns ns0 ip netns exec ns0 ifconfig $VF $IP/16
up配置 IPsec 状态和策略
ip xfrm state add src $LOCAL_TUN/
16
dst $REMOTE_IP/16
proto esp spi0xb29ed314
reqid0xb29ed314
mode transport aead'rfc4106(gcm(aes))'
0x20f01f80a26f633d85617465686c32552c92c42f
128
offload packet dev $PF dir out sel src $LOCAL_TUN/16
dst $REMOTE_IP/16
flag esn replay-window64
ip xfrm state add src $REMOTE_IP/16
dst $LOCAL_TUN/16
proto esp spi0xc35aa26e
reqid0xc35aa26e
mode transport aead'rfc4106(gcm(aes))'
0x6cb228189b4c6e82e66e46920a2cde39187de4ba
128
offload packet dev $PF dir in sel src $REMOTE_IP/16
dst $LOCAL_TUN/16
flag esn replay-window64
ip xfrm policy add src $LOCAL_TUN dst $REMOTE_IP offload packet dev $PF dir out tmpl src $LOCAL_TUN/16
dst $REMOTE_IP/16
proto esp reqid0xb29ed314
mode transport priority12
ip xfrm policy add src $REMOTE_IP dst $LOCAL_TUN offload packet dev $PF dir in tmpl src $REMOTE_IP/16
dst $LOCAL_TUN/16
proto esp reqid0xc35aa26e
mode transport priority12
配置 Openvswitch
ovs-vsctl add-br br-ovs ovs-vsctl add-port br-ovs $REP ovs-vsctl add-port br-ovs vxlan1 -- set
interface
vxlan1 type=vxlan options:local_ip=$LOCAL_TUN options:remote_ip=$REMOTE_IP options:key=$VXLAN_ID options:dst_port=4789
与软件 IPsec 对应项相比,此用于 RDMA 流量的 IPsec 完全卸载选项提供了显著的性能改进,并支持在 RoCE 数据包上使用 IPsec,这些数据包在网络堆栈之外,如果没有完全硬件卸载则无法使用。因此,即使在使用 SR-IOV VF 时,用户也可以利用 RoCE V2 的 IPsec 协议的优势。
此功能的配置步骤应与上述步骤相同,但如果支持此功能,则发送的流量也可以是 RoCEV2 IPsec 流量。
要配置此功能
在 VF 上启用 IPsec。有关更多信息,请参阅 IPsec 功能。
在相关的 VF 网络设备上配置 IPsec 策略和状态。这应与 IPsec 规则的软件配置相同,可以使用以下实现选项之一完成
命令
卸载请求参数
iproute2 ip xfrm
卸载数据包
libreswan
nic-offload=packet
strongswan 1
有关使用 strongSwan 配置的示例,请参阅 DOCA 东西向叠加加密应用程序。
正常配置 SR-IOV VF,并添加其 OVS/TC 规则。
为了使此功能正常工作,必须启用 DMFS 转向模式。
以下是使用 iproute 的完整最小配置示例,其中 PF0 是网络设备 PF,F0_REP 是 VF 表示,NIC 是要在其上配置 IPsec 的 VF 网络设备
1
. echo1
> /sys/class
/net/$PF0 /device/sriov_numvfs2
. echo0000
:08
:00.2
> /sys/bus/pci/drivers/mlx5_core/unbind3
. devlink dev eswitch set pci/0000
:08
:00.0
mode switchdev4
. devlink dev param set pci/0000
:08
:00.0
name flow_steering_mode value dmfs cmode runtime5
. devlink port function set pci/0000
:08
:00.0
/1
ipsec_packet enable6
. echo0000
:08
:00.2
> /sys/bus/pci/drivers/mlx5_core/bind7
. tc qdisc add dev $PF0 ingress tc qdisc add dev $VF0_REP ingress tc filter add dev $PF0 parent ffff: protocol802
.1q chain0
flower vlan_id10
vlan_ethtype802
.1q cvlan_id5
action vlan pop action vlan pop action mirred egress redirect dev $VF0_REP tc filter add dev $VF0_REP parent ffff: protocol all chain0
flower action vlan push protocol802
.1q id5
action vlan push protocol802
.1q id10
action mirred egress redirect dev $PF08
. ifconfig $PF0 $PF_IP/24
up ifconfig $NIC $LOC_IP/$SUB_NET up ip link set dev $VF_REP up9
. ip xfrm state flush ip xfrm policy flush配置 IPsec 状态和策略
#states ip -
4
xfrm state add src $LOC_IP/$SUB_NET dst $REMOTE_IP/$SUB_NET proto esp spi1000
reqid10000
aead'rfc4106(gcm(aes))'
0x010203047aeaca3f87d060a12f4a4487d5a5c335
128
mode transport sel src $LOC_IP dst $REMOTE_IP offload packet dev $NIC dir out ip -4
xfrm state add src $REMOTE_IP/$SUB_NET dst $LOC_IP/$SUB_NET proto esp spi1001
reqid10001
aead'rfc4106(gcm(aes))'
0x010203047aeaca3f87d060a12f4a4487d5a5c335
128
mode transport sel src $REMOTE_IP dst $LOC_IP offload packet dev $NIC dir in #policies ip -4
xfrm policy add src $LOC_IP dst $REMOTE_IP offload packet dev $NIC dir out tmpl src $LOC_IP/$SUB_NET dst $REMOTE_IP/$SUB_NET proto esp reqid10000
mode transport ip -4
xfrm policy add src $REMOTE_IP dst $LOC_IP offload packet dev $NIC dir in tmpl src $REMOTE_IP/$SUB_NET dst $LOC_IP/$SUB_NET proto esp reqid10001
mode transport ip -4
xfrm policy add src $REMOTE_IP dst $LOC_IP dir fwd tmpl src $REMOTE_IP/$SUB_NET dst $LOC_IP/$SUB_NET proto esp reqid10001
mode transport
请注意,以上配置仅适用于一侧,但 IPsec 必须在两侧都配置才能使它们正常通信。另一侧的配置应几乎相同,但步骤 9 将以不对称方式配置,这意味着第一个策略将如下所示,并且所有其他状态/策略将相应调整
ip -4
xfrm state add src $LOC_IP/$SUB_NET dst $REMOTE_IP/$SUB_NET proto esp spi 1001
reqid 10001
aead 'rfc4106(gcm(aes))'
0x010203047aeaca3f87d060a12f4a4487d5a5c335
128
mode transport sel src $LOC_IP dst $REMOTE_IP offload packet dev $NIC dir out
完成此步骤后,您可以在配置了 IPsec 的两台机器之间发送您选择的任何 RoCE 流量。例如,在一侧使用 ibv_rc_pingpong -g 3 -d VF_device :
,在另一侧使用 ibv_rc_pingpong -g 3 -d VF_device $IP_OF_OTHER_SIDE :
。
最后,您可以使用 ipsec 计数器验证流量是否已使用 IPsec 加密
ethtool -S VF_NETDEV | grep ipsec