DOCA 文档 v2.10.0

DOCA IPsec 安全网关应用指南

本文档介绍了基于 NVIDIA® BlueField® DPU 的 IPsec 安全网关实现。

注意

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

注意

DOCA IPsec 安全网关在 alpha 级别提供支持。

DOCA IPsec 安全网关利用 DPU 的硬件功能实现安全网络通信。该应用程序演示了如何根据 DOCA Flow 库插入与 IPsec 加密和解密相关的规则。

该应用程序演示了如何插入规则以创建 IPsec 隧道。

注意

互联网密钥交换 (IKE) 的配置示例可以在“密钥守护程序集成 (StrongSwan)”部分找到,但不被视为应用程序的一部分。

应用程序可以通过以下方式之一配置为接收 IPsec 规则

  • 静态配置 –(默认)接收 IPsec 加密和解密的固定规则列表

    注意

    创建安全关联 (SA) 对象时,应用程序从 JSON 输入文件获取密钥、salt 和其他 SA 属性。

  • 动态配置 – 在运行时通过 Unix 域套接字 (UDS) 接收 IPsec 加密和解密规则,当为应用程序提供套接字路径时启用

    注意

    您可以在 strongSwan 项目(DOCA 插件)下找到将规则生成器与应用程序集成的示例。

该应用程序支持以下 IPsec 模式:隧道、传输、UDP 传输。

ipsec-mode-diagrams-with-encryption-version-1-modificationdate-1734469676643-api-v2.png

DOCA IPsec 安全网关设计为使用 2 个端口运行,即安全端口和非安全端口

  • 安全端口 – BlueField 接收 IPsec 加密的数据包,解密后,它们通过非安全端口发送

  • 非安全端口 – BlueField 接收常规(纯文本)数据包,加密后,它们通过安全端口发送

硬件 (HW) 卸载的示例数据包路径

image2023-4-2_12-21-37-version-1-modificationdate-1734469675800-api-v2.png

部分软件处理的示例数据包路径(在软件中处理封装/解封装)

image2023-4-2_12-22-22-version-1-modificationdate-1734469675513-api-v2.png

将应用程序与 SF 结合使用

image2023-4-2_12-24-42-version-1-modificationdate-1734469672617-api-v2.png

静态配置

  1. 打开两个 DOCA 设备,一个用于安全端口,另一个用于非安全端口。

  2. 使用打开的 DOCA 设备,应用程序探测 DPDK 端口并相应地初始化 DOCA Flow 和 DOCA Flow 端口。

  3. 在创建的端口上,构建 DOCA Flow 管道。

  4. 在循环中根据 JSON 规则

    1. 为新规则创建 IPSec SA 共享资源。

    2. 将加密或解密规则插入到 DOCA Flow 管道。

动态配置

app_arch_dyn_2.7-version-1-modificationdate-1734469673023-api-v2.png

  1. 打开两个 DOCA 设备,一个用于安全端口,另一个用于非安全端口。

  2. 使用打开的 DOCA 设备,应用程序探测 DPDK 端口并相应地初始化 DOCA Flow 和 DOCA Flow 端口。

  3. 在创建的端口上,构建 DOCA Flow 管道。

  4. 创建 UDS 套接字并监听传入数据。

  5. 在循环中等待接收新的 IPsec 策略时,如果收到新的 IPsec 策略

    1. 解析策略,判断是加密规则还是解密规则。

    2. 为新规则创建 IPSec SA 共享资源。

    3. 将加密或解密规则插入到 DOCA Flow 管道。

DOCA 流模式

应用程序可以在两种模式下运行:vnfswitch。有关模式的更多信息,请参阅 DOCA Flow 中的“管道模式”。

VNF 模式

加密

vnf_pipes_enc_2.7-version-1-modificationdate-1734469673807-api-v2.png

  1. 应用程序构建用于加密的管道。控制管道作为根管道,包含四个条目,用于匹配 L3 和 L4 类型并将流量转发到相关管道。

    1. IPv6 管道 – 匹配源 IP 地址并将流量转发到匹配 5 元组(不包括源 IP)的管道。

    2. 在 5 元组匹配管道中,设置“设置元数据”操作,元数据将是 JSON 文件中规则的索引。

    3. 匹配的数据包将转发到第二个端口。

  2. 在安全出口域中,IP 分类器管道将数据包发送到正确的加密管道(IPv4 或 IPv6),该管道具有共享的 IPsec 加密操作。根据元数据匹配,数据包将使用用户规则中定义的封装目标 IP 和 SPI 进行加密。

解密

vnf_pipes_dec_2.7-version-1-modificationdate-1734469672287-api-v2.png

  1. 应用程序构建用于解密的管道。控制管道作为根管道,包含两个条目,用于匹配 L3 类型并将流量转发到相关的解密管道。

  2. 解密管道根据规则文件匹配目标 IP 和 SPI,并具有用于解密的共享 IPsec 操作。

  3. 解密后,匹配的数据包将转发到解封装管道,如果综合征为非零,则丢弃数据包。否则,数据包将解封装 ESP 标头并转发到第二个端口。

    1. 在调试模式下,如果综合征为非零,则将其发送到坏综合征管道,以匹配综合征、计数并丢弃/发送到应用程序。

交换机模式

switch_pipes_2.7-version-1-modificationdate-1734469673470-api-v2.png

在交换机模式下,入口根管道匹配源端口以确定下一个管道是什么

  • 根据端口,数据包通过与 VNF 模式几乎相同的路径,并设置元数据。之后,数据包移动到出口根管道。

在出口根管道中,匹配的是在数据包元数据中设置的加密和解密位

  • 解密位为 1 – 数据包完成解密路径,必须发送到非安全端口

  • 加密位为 1 – 数据包几乎完成加密路径,必须发送到安全出口域上的加密管道,并从那里发送到安全端口

此应用程序利用以下 DOCA 库

有关更多信息,请参阅它们各自的编程指南。

信息

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

DOCA 参考应用程序的安装包包含应用程序的源代码以及匹配的编译说明。这允许“按原样”编译应用程序,并提供修改源代码,然后编译应用程序新版本的能力。

提示

有关应用程序以及开发和编译技巧的更多信息,请参阅 DOCA 参考应用程序页面。

应用程序的源代码可以在应用程序的目录下找到:/opt/mellanox/doca/applications/ipsec_security_gw/

准备工作

该应用程序依赖于 json-c 开源库,因此,需要以下安装

  • Ubuntu/Debian

    复制
    已复制!
                

    $ sudo apt install libjson-c-dev

  • CentOS/RHEL

    复制
    已复制!
                

    $ sudo yum install json-c-devel

编译所有应用程序

所有 DOCA 应用程序都在一个 meson 项目下定义。因此,默认情况下,编译包含所有应用程序。

要一起构建所有应用程序,请运行

复制
已复制!
            

cd /opt/mellanox/doca/applications/ meson /tmp/build ninja -C /tmp/build

信息

doca_ipsec_security_gw 将在 /tmp/build/ipsec_security_gw/ 下创建。


仅编译当前应用程序

要直接仅构建 IPsec 安全网关应用程序

复制
已复制!
            

cd /opt/mellanox/doca/applications/ meson /tmp/build -Denable_all_applications=false -Denable_ipsec_security_gw=true ninja -C /tmp/build

信息

doca_ipsec_security_gw 将在 /tmp/build/ipsec_security_gw/ 下创建。

或者,用户可以在 meson_options.txt 文件中设置所需的标志,而不是在编译命令行中提供它们

  1. 编辑 /opt/mellanox/doca/applications/meson_options.txt 中的以下标志

    • enable_all_applications 设置为 false

    • enable_ipsec_security_gw 设置为 true

  2. 运行以下编译命令

    复制
    已复制!
                

    cd /opt/mellanox/doca/applications/ meson /tmp/build ninja -C /tmp/build

    信息

    doca_ipsec_security_gw 将在 /tmp/build/ipsec_security_gw/ 下创建。

故障排除

有关应用程序编译过程中遇到的任何问题,请参阅 DOCA 故障排除

准备工作

  1. IPsec 安全网关应用程序基于 DOCA Flow。因此,用户需要分配巨页内存。

    复制
    已复制!
                

    $ echo '2048' | sudo tee -a /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages $ sudo mkdir /mnt/huge $ sudo mount -t hugetlbfs -o pagesize=2M nodev /mnt/huge

  2. VNF 模式 – IPsec 安全网关应用程序需要禁用一些硬件表

    复制
    已复制!
                

    /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.0 mode legacy /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.1 mode legacy   echo none > /sys/class/net/p0/compat/devlink/encap echo none > /sys/class/net/p1/compat/devlink/encap   /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.0 mode switchdev /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.1 mode switchdev

    要恢复旧配置

    复制
    已复制!
                

    /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.0 mode legacy /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.1 mode legacy   echo basic > /sys/class/net/p0/compat/devlink/encap echo basic > /sys/class/net/p1/compat/devlink/encap   /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.0 mode switchdev /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.1 mode switchdev

  3. 交换机模式 – IPsec 安全网关应用程序需要配置端口以在交换机模式下运行

    复制
    已复制!
                

    sudo mlxconfig -d /dev/mst/mt41686(mt41692)_pciconf0 s LAG_RESOURCE_ALLOCATION=1 # power cycle the host to apply this setting   /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.0 mode legacy /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.1 mode legacy   sudo devlink dev param set pci/0000:03:00.0 name esw_pet_insert value false cmode runtime sudo devlink dev param set pci/0000:03:00.1 name esw_pet_insert value false cmode runtime   /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.0 mode switchdev /opt/mellanox/iproute2/sbin/devlink dev eswitch set pci/0000:03:00.1 mode switchdev   sudo devlink dev param set pci/0000:03:00.0 name esw_multiport value true cmode runtime sudo devlink dev param set pci/0000:03:00.1 name esw_multiport value true cmode runtime

    注意

    在断开主机电源之前,请确保执行 BlueField 系统重启

    要恢复旧配置

    复制
    已复制!
                

    sudo devlink dev param set pci/0000:03:00.0 name esw_multiport value false cmode runtime sudo devlink dev param set pci/0000:03:00.1 name esw_multiport value false cmode runtime

应用程序执行

IPsec 安全网关应用程序以源代码形式提供。因此,在执行应用程序之前需要进行编译。

  1. 应用程序使用说明

    复制
    已复制!
                

    Usage: doca_ipsec_security_gw [DOCA Flags] [Program Flags]   DOCA Flags: -h, --help Print a help synopsis -v, --version Print program version information -l, --log-level Set the (numeric) log level for the program <10=DISABLE, 20=CRITICAL, 30=ERROR, 40=WARNING, 50=INFO, 60=DEBUG, 70=TRACE> --sdk-log-level Set the SDK (numeric) log level for the program <10=DISABLE, 20=CRITICAL, 30=ERROR, 40=WARNING, 50=INFO, 60=DEBUG, 70=TRACE> -j, --json <path> Parse all command flags from an input json file   Program Flags: -s, --secured secured port pci-address -u, --unsecured unsecured port pci-address -c, --config Path to the JSON file with application configuration -m, --mode ipsec mode - {tunnel/transport/udp_transport} -i, --ipc IPC socket file path -sn, --secured-name secured port interface name -un, --unsecured-name unsecured port interface name -n, --nb-cores number of cores --debug Enable debug counters

    信息

    此使用说明可以使用 -h(或 --help)选项打印到命令行

    复制
    已复制!
                

    ./doca_ipsec_security_gw -h

    信息

    有关更多信息,请参阅“命令行标志”部分。

  2. 在 BlueField 或主机上运行应用程序的 CLI 示例

    • 静态配置

      复制
      已复制!
                  

      ./doca_ipsec_security_gw -s 03:00.0 -u 03:00.1 -c ./ipsec_security_gw_config.json -m transport

      注意

      PCIe 地址标识符(-s-u 标志)应与所需 PCIe 设备的地址匹配。

    • 动态配置

      复制
      已复制!
                  

      ./doca_ipsec_security_gw -s 03:00.0 -u 03:00.1 -c ./ipsec_security_gw_config.json -m transport -i /tmp/rules_socket

      注意

      PCIe 地址标识符(-s-u 标志)应与所需 PCIe 设备的地址匹配。

  3. 该应用程序还支持基于 JSON 的部署模式,其中所有命令行参数都通过 JSON 文件提供

    复制
    已复制!
                

    ./doca_ipsec_security_gw --json [json_file]

    例如

    复制
    已复制!
                

    ./doca_ipsec_security_gw --json ipsec_security_gw_params.json

    注意

    在执行之前,请确保使用的 JSON 文件包含正确的配置参数,尤其是部署所需的 PCIe 地址。

命令行标志

标志类型

短标志

长标志/JSON 键

描述

JSON 内容

通用标志

h

help

打印帮助概要

N/A

v

version

打印程序版本信息

N/A

l

log-level

设置应用程序的日志级别

  • DISABLE=10

  • CRITICAL=20

  • ERROR=30

  • WARNING=40

  • INFO=50

  • DEBUG=60

  • TRACE=70(需要使用 TRACE 日志级别支持进行编译)

复制
已复制!
            

"log-level": 60

N/A

sdk-log-level

设置程序的日志级别

  • DISABLE=10

  • CRITICAL=20

  • ERROR=30

  • WARNING=40

  • INFO=50

  • DEBUG=60

  • TRACE=70

复制
已复制!
            

"sdk-log-level": 40

j

json

从输入 json 文件解析所有命令标志

N/A

程序标志

c

config

JSON 配置文件的路径

复制
已复制!
            

"config": "security_gateway_config.json"

u

unsecured

非安全端口的 PCIe 地址

复制
已复制!
            

"unsecured": "03:00.1"

s

secured

安全端口的 PCIe 地址

复制
已复制!
            

"secured": "03:00.0"

m

mode

IPsec 模式。

可能的值:tunneltransportudp_transport

复制
已复制!
            

"mode": "tunnel"

un

unsecured-name

非安全端口的接口名称

复制
已复制!
            

"unsecured-name": "p1"

sn

secured-name

安全端口的接口名称

复制
已复制!
            

"secured-name": "p0"

i

ipc

IPC 套接字文件路径,用于在运行时接收 IPsec 规则

复制
已复制!
            

"ipc": "/tmp/rules_socket"

n

nb-cores

核心数

复制
已复制!
            

"nb-cores": 8

N/A

debug

为所有条目添加计数器

复制
已复制!
            

"debug": true

信息

有关支持的标志和执行模式的更多信息,请参阅 DOCA Arg Parser


静态配置 IPsec 规则

IPsec 规则和其他配置可以使用 JSON 配置文件添加,该文件通过 --config 参数传递。

字段

类型

描述

示例

config

switch

bool

配置 DOCA Flow 是在 VNF (false) 模式还是交换机 (true) 模式下运行

复制
已复制!
            

"switch": true

esp-header-offload

string

解封装和封装卸载:bothencapdecapnone。默认为 both(同时卸载封装和解封装)。

复制
已复制!
            

"esp-header-offload": "none"

sw-sn-inc-enable

bool

如果设置为 true,则在软件中递增 ESP 的序列号。默认为 false。

注意

仅当 esp_header_offloaddecapnone 时可用。

复制
已复制!
            

"sw-sn-inc-enable": true

sw-antireplay-enable

bool

如果设置为 true,则在软件中启用防重放机制。默认为 false。

注意

仅当 esp_header_offloadencapnone 时可用。

注意

窗口大小为 64。非 ESN。支持非零 sn_initial

复制
已复制!
            

"sw-antireplay-enable": true

sn-initial

uint

ESP 标头的初始序列号。当 sw_antireplay_enable 为 true 时也使用。默认为 0。

复制
已复制!
            

"sn-initial": 0

debug

bool

true 时,为所有条目设置调试计数器。默认为 false

此参数也从 CLI 使用,如果在其中之一发送,则将其视为 true。

复制
已复制!
            

"debug": false

fwd-bad-syndrome

string

转发具有坏综合征的数据包:dropRSS。默认为 drop

注意

仅在调试模式下可用。

复制
已复制!
            

"fwd-bad-syndrome": "drop"

perf-measurements

string

可能的值:noneinsertion-ratebandwidthboth。默认为 none

  • insertion-rate – 打印添加条目所花费的总时间

  • bandwidth – 优化管道以提高 IPv6 的 pps

复制
已复制!
            

"perf-measurements": "both"

vxlan-encap

bool

true 时,在加密后执行 vxlan-encap,并在解密前执行解封装。默认为 false

复制
已复制!
            

"vxlan-encap": false

vni

uint

vxlan-encap 为 true 时,在 VXLAN 隧道中使用此 vni 值。

复制
已复制!
            

"vni": 5

marker-encap

bool

true 时,添加额外的 8 字节非 ESP 标记。默认为 false

复制
已复制!
            

"marker-encap": false

encrypt_rules

ip-version

int

源和目标 IP 版本。可能的值:46。可选;默认为 4

复制
已复制!
            

"ip-version": 6

src-ip

string

要匹配的源 IP

复制
已复制!
            

"src-ip": "1.2.3.4"

dst-ip

string

要匹配的目标 IP

复制
已复制!
            

"dst-ip": "101:101:101:101:101:101:101:101"

protocol

string

L4 协议:TCP 或 UDP

复制
已复制!
            

"protocol"

src-port

int

要匹配的源端口

dst-port

int

要匹配的目标端口

复制
已复制!
            

"dst-port": 55

encap-ip-version

int

封装 IP 版本:46。可选;默认为 4

复制
已复制!
            

"ip-version": 4

encap-dst-ip

string

封装目标 IP

注意

仅隧道模式下强制。

复制
已复制!
            

"encap-dst-ip": "1.1.1.1"

spi

int

要在 ESP 标头中设置的 SPI 整数

复制
已复制!
            

"spi": 5

key

string

用于创建 SA 的密钥(十六进制格式)

复制
已复制!
            

"key": "112233445566778899aabbccdd"

key-type

int

密钥大小:128256。可选;默认为 256

复制
已复制!
            

"key-type": 128

salt

int

用于创建 SA 的 Salt 值。默认为 6

复制
已复制!
            

"salt": 1212

icv-length

int

ICV 长度值:81216。默认为 16

复制
已复制!
            

"icv-length": 12

lifetime-threshold

int

设置 IPsec 生命周期阈值。如果 sw-sn-inc-enable 为 true,则忽略。默认为 0。

复制
已复制!
            

"lifetime-threshold": 1000000

esn_en

bool

启用扩展序列号。默认为 false

复制
已复制!
            

"esn_en" : true

decrypt_rules

ip-version

int

目标 IP 版本:46。可选;默认为 4

复制
已复制!
            

"ip-version": 6

dst-ip

string

要匹配的目标 IP

复制
已复制!
            

"dst-ip": "1122:3344:5566:7788:99aa:bbcc:ddee:ff00"

inner-ip-version

int

内部 IP 版本:46。可选;默认为 4

注意

仅隧道模式下强制。

复制
已复制!
            

"inner-ip-version": 4

spi

int

要在 ESP 标头中匹配的 SPI

复制
已复制!
            

"spi": 5

key

string

用于创建 SA 的密钥(十六进制格式)

复制
已复制!
            

"key": "112233445566778899aabbccdd"

key-type

int

密钥大小:128256。可选;默认为 256

复制
已复制!
            

"key-type": 128

salt

int

用于创建 SA 的 Salt 值。默认为 6

复制
已复制!
            

"salt": 1212

icv-length

int

ICV 长度值:81216。默认为 16

复制
已复制!
            

"icv-length": 12

lifetime-threshold

int

设置 IPsec 生命周期阈值。如果 sw-antireplay-enable 为 true,则忽略。默认为 0。

复制
已复制!
            

"lifetime-threshold": 1000000

esn_en

bool

启用扩展序列号。默认为 false

复制
已复制!
            

"esn_en" : true


动态配置 IPsec 规则

应用程序监听 UDS 套接字,以接收在 policy.h 文件中预定义的 IPsec 策略结构。

客户端程序或密钥守护程序应使用通过 --ipc/-i 标志提供给应用程序的相同套接字文件路径连接到套接字,并通过同一套接字将策略结构作为 packed 发送到应用程序。

注意

在动态配置中,应用程序使用 JSON 配置文件中的 config 部分,并忽略 encrypt_rulesdecrypt_rules 部分。

IPsec 策略结构

复制
已复制!
            

struct ipsec_security_gw_ipsec_policy { /* Protocols attributes */ uint16_t src_port; /* Policy inner source port */ uint16_t dst_port; /* Policy inner destination port */ uint8_t l3_protocol; /* Policy L3 proto {POLICY_L3_TYPE_IPV4, POLICY_L3_TYPE_IPV6} */ uint8_t l4_protocol; /* Policy L4 proto {POLICY_L4_TYPE_UDP, POLICY_L4_TYPE_TCP} */ uint8_t outer_l3_protocol; /* Policy outer L3 type {POLICY_L3_TYPE_IPV4, POLICY_L3_TYPE_IPV6} */   /* Policy attributes */ uint8_t policy_direction; /* Policy direction {POLICY_DIR_IN, POLICY_DIR_OUT} */ uint8_t policy_mode; /* Policy IPSEC mode {POLICY_MODE_TRANSPORT, POLICY_MODE_TUNNEL} */   /* Security Association attributes */ uint8_t esn; /* Is ESN enabled? */ uint8_t icv_length; /* ICV length in bytes {8, 12, 16} */ uint8_t key_type; /* AES key type {POLICY_KEY_TYPE_128, POLICY_KEY_TYPE_256} */ uint32_t spi; /* Security Parameter Index */ uint32_t salt; /* Cryptographic salt */ uint8_t enc_key_data[MAX_KEY_LEN]; /* Encryption key (binary) */   /* Policy inner and outer addresses */ char src_ip_addr[MAX_IP_ADDR_LEN + 1]; /* Policy inner IP source address in string format */ char dst_ip_addr[MAX_IP_ADDR_LEN + 1]; /* Policy inner IP destination address in string format */ char outer_src_ip[MAX_IP_ADDR_LEN + 1]; /* Policy outer IP source address in string format */ char outer_dst_ip[MAX_IP_ADDR_LEN + 1]; /* Policy outer IP destination address in string format */ };

注意

策略类型(加密还是解密)根据 policy_direction 属性进行分类

  • POLICY_DIR_IN – 解密策略

  • POLICY_DIR_OUT – 加密策略


故障排除

有关 DOCA 应用程序的安装或执行过程中遇到的任何问题,请参阅 DOCA 故障排除

  1. 解析应用程序参数。

    1. 初始化参数解析器资源并注册 DOCA 通用参数。

      复制
      已复制!
                  

      doca_argp_init();

    2. 注册应用程序的参数。

      复制
      已复制!
                  

      register_ipsec_security_gw_params();

    3. 解析参数。

      复制
      已复制!
                  

      doca_argp_start();

      1. 解析应用程序参数。

  2. DPDK 初始化。

    复制
    已复制!
                

    rte_eal_init();

    调用 rte_eal_init() 以使用提供的 EAL 标志初始化 EAL 资源,以便不探测端口。

  3. 解析配置文件。

    复制
    已复制!
                

    ipsec_security_gw_parse_config();

  4. 初始化设备和端口。

    复制
    已复制!
                

    ipsec_security_gw_init_devices();

    1. 使用输入的 PCIe 地址/接口名称打开 DOCA 设备。

    2. 从每个打开的设备探测 DPDK 端口。

  5. 初始化并启动 DPDK 端口。

    复制
    已复制!
                

    dpdk_queues_and_ports_init();

    1. 初始化 DPDK 端口,包括 mempool 分配。

    2. 如果需要,初始化 hairpin 队列。

    3. 将每个端口的 hairpin 队列绑定到其对等端口。

  6. 初始化 DOCA Flow。

    复制
    已复制!
                

    ipsec_security_gw_init_doca_flow();

    1. 初始化 DOCA Flow 库。

    2. 查找 DPDK 探测到的端口的索引,并使用它们启动 DOCA Flow 端口。

  7. 插入规则。

    1. 插入加密规则。

      复制
      已复制!
                  

      ipsec_security_gw_insert_encrypt_rules();

    2. 插入解密规则。

      复制
      已复制!
                  

      ipsec_security_gw_insert_decrypt_rules();

  8. 等待流量。

    复制
    已复制!
                

    ipsec_security_gw_wait_for_traffic();

    1. 在循环中等待,直到用户终止程序。

  9. IPsec 安全网关清理

    1. DOCA Flow 清理;销毁初始化的端口。

      复制
      已复制!
                  

      doca_flow_cleanup();

    2. SA 销毁。

      复制
      已复制!
                  

      ipsec_security_gw_destroy_sas();

    3. IPsec 对象销毁。

      复制
      已复制!
                  

      ipsec_security_gw_ipsec_ctx_destroy();

    4. 销毁 DPDK 端口和队列。

      复制
      已复制!
                  

      dpdk_queues_and_ports_fini();

    5. DPDK 完成。

      复制
      已复制!
                  

      dpdk_fini();

      调用 rte_eal_destroy() 以销毁初始化的 EAL 资源。

    6. 参数解析器销毁。

      复制
      已复制!
                  

      doca_argp_destroy()

strongSwan 是一个密钥守护程序,它使用 Internet 密钥交换版本 2 (IKEv2) 协议在两个对等方之间建立 SA。strongSwan 包括一个 DOCA 插件,它是 BFB 中 strongSwan 包的一部分。仅当触发 DOCA IPsec 安全网关时才加载该插件。插件连接到 UDS 套接字,并在密钥交换完成后将 IPsec 策略发送到应用程序。

有关密钥守护程序的更多信息,请参阅 strongSwan 文档

端到端架构

下图展示了一个架构,其中两个 BlueField DPU 相互连接,并且每个 DPU 上都运行着 DOCA IPsec 安全网关。

END2END-version-1-modificationdate-1734469674210-api-v2.png

swanctl 是一个用于 strongSwan IPsec 配置的命令行工具

  1. 在动态配置中,在两侧运行 DOCA IPsec 安全网关。

  2. 启动 strongSwan 服务。

  3. 使用两侧的 swanctl.conf 配置文件配置 strongSwan IPsec。

  4. 在两个对等方之间启动密钥交换。在流程结束时,结果到达 DOCA 插件,填充策略定义的结构,并将其发送到套接字。

  5. 两侧的 DOCA IPsec 安全网关从套接字读取新策略,执行解析,创建 DOCA SA 对象,并添加流解密/加密条目。

此架构使用两个 BlueField DPU 上的 P1 上行链路来运行 strongSwan 密钥守护程序。要配置上行链路

  1. 为两个 DPU 的 PF 配置 IP 地址

    1. 在 BF1 上

      复制
      已复制!
                  

      ip addr add 192.168.50.1/24 dev p1

    2. 在 BF2 上

      复制
      已复制!
                  

      ip addr add 192.168.50.2/24 dev p1

      注意

      可以为上行链路配置多个 IP 地址,以便使用不同的策略属性运行密钥交换。

  2. 验证两个 BlueField DPU 之间的连接。

    复制
    已复制!
                

    BF1> ping 192.168.50.2

    注意

    确保上行链路不在 OVS 网桥中。

  3. 为每台机器配置 swanctl.conf 文件。该文件应位于 /etc/swanctl/conf.d/ 下。

    添加 swanctl.conf 文件示例

    • 传输模式

      • swanctl.conf BF1 示例

        复制
        已复制!
                    

        connections { BF1-BF2 { local_addrs = 192.168.50.1 remote_addrs = 192.168.50.2 rekey_time = 0   local { auth = psk id = host1 } remote { auth = psk id = host2 }   children { bf { local_ts = 192.168.50.1/32 [udp/60] remote_ts = 192.168.50.2/32 [udp/90] esp_proposals = aes128gcm128-x25519-esn mode = transport policies_fwd_out = yes life_time = 0 } } version = 2 mobike = no reauth_time = 0 proposals = aes128-sha256-x25519 } }   secrets { ike-BF { id-host1 = host1 id-host2 = host2 secret = 0sv+NkxY9LLZvwj4qCC2o/gGrWDF2d21jL } }

      • swanctl.conf BF2 示例

        复制
        已复制!
                    

        connections { BF2-BF1 { local_addrs = 192.168.50.2 remote_addrs = 192.168.50.1 rekey_time = 0   local { auth = psk id = host2 } remote { auth = psk id = host1 }   children { bf { local_ts = 192.168.50.2/32 [udp/90] remote_ts = 192.168.50.1/32 [udp/60] esp_proposals = aes128gcm128-x25519-esn mode = transport life_time = 0 } } version = 2 mobike = no reauth_time = 0 proposals = aes128-sha256-x25519 } }   secrets { ike-BF { id-host1 = host1 id-host2 = host2 secret = 0sv+NkxY9LLZvwj4qCC2o/gGrWDF2d21jL } }

    • 隧道模式

      复制
      已复制!
                  

      connections { BF1-BF2 { local_addrs = 192.168.50.2 remote_addrs = 192.168.50.1 rekey_time = 0   local { auth = psk id = host2 } remote { auth = psk id = host1 }   children { bf { local_ts = 2001:db8:85a3::8a2e:370:7334/128 [udp/3030] remote_ts = 2001:db8:85a3::8a2e:370:7335/128 [udp/55] esp_proposals = aes128gcm128-x25519-esn life_time = 0 } } version = 2 mobike = no proposals = aes128-sha256-x25519 } }   secrets { ike-BF { id-host1 = host1 id-host2 = host2 secret = 0sv+NkxY9LLZvwj4qCC2o/gGrWDF2d21jL } }

      注意

      对于 IPv4 地址,local_tsremote_ts 必须具有 /32 的网络掩码,对于 IPv6 地址,则必须具有 /128 的网络掩码。

      注意

      DOCA 插件不支持 SA 重新密钥。connection.rekey_time 必须设置为 0,connection.child.life_time 必须设置为 0。

DOCA IPsec 仅支持 ESP 标头、AES-GCM 加密算法以及密钥大小 128 或 256。因此,在 swanctl.conf 中设置 ESP 提案时,请遵守下表中提供的值

ESP 提案

包括 ICV 长度的算法类型

密钥大小

aes128gcm8

ENCR_AES_GCM_ICV8

128

aes128gcm64

ENCR_AES_GCM_ICV8

128

aes128gcm12

ENCR_AES_GCM_ICV12

128

aes128gcm96

ENCR_AES_GCM_ICV12

128

aes128gcm16

ENCR_AES_GCM_ICV16

128

aes128gcm128

ENCR_AES_GCM_ICV16

128

aes128gcm

ENCR_AES_GCM_ICV16

128

aes256gcm8

ENCR_AES_GCM_ICV8

256

aes256gcm64

ENCR_AES_GCM_ICV8

256

aes256gcm12

ENCR_AES_GCM_ICV12

256

aes256gcm96

ENCR_AES_GCM_ICV12

256

aes256gcm16

ENCR_AES_GCM_ICV16

256

aes256gcm128

ENCR_AES_GCM_ICV16

256

aes256gcm

ENCR_AES_GCM_ICV16

256


构建 strongSwan

要在 strongSwan 中启用 DOCA 插件

  1. 验证 此处 列出的依赖项是否已安装在您的环境中。libgmp-dev 在该列表中缺失,因此请确保也安装它。

  2. Git 克隆 https://github.com/Mellanox/strongswan.git

  3. Git 检出 BF-5.9.10 分支。

  4. 在位于 src/libcharon/plugins/doca 下的插件中添加您的更改。

  5. 在 strongSwan 仓库中运行 autogen.sh

  6. 运行以下命令

    复制
    已复制!
                

    ./configure --enable-openssl --disable-random --prefix=/usr/local --sysconfdir=/etc --enable-systemd --enable-doca make make install systemctl daemon-reload systemctl restart strongswan.service

运行解决方案

在两个 BlueField 对等方上运行以下命令。

  1. 在动态配置中运行 DOCA IPsec 安全网关,假设套接字位置为 /tmp/rules_socket

    复制
    已复制!
                

    doca_ipsec_security_gw -s 03:00.0 -un <sf_net_dev> -c ./ipsec_security_gw_config.json -m transport -i /tmp/rules_socket

    注意

    应首先运行 DOCA IPsec 安全网关应用程序。

  2. 编辑 /etc/strongswan.d/charon/doca.conf 文件并添加 UDS 套接字路径。如果未设置 socket_path,则插件使用默认路径 /tmp/strongswan_doca_socket

    复制
    已复制!
                

    doca {   # Whether to load the plugin load = yes   # Path to DOCA socket socket_path = /tmp/rules_socket }

    注意

    您还必须为此应用程序提供此路径。

  3. 重启 strongSwan 服务器

    复制
    已复制!
                

    systemctl restart strongswan.service

    注意

    如果应用程序已以日志级别 debug 运行,您可以看到连接已成功完成,并且应用程序正在等待新的 IPsec 策略。

  4. 验证 swanctl.conf 文件是否存在于 /etc/swanctl/conf.d/ 目录中。

    注意

    建议删除 /etc/swanctl/conf.d/ 下任何未使用的 conf 文件。

  5. 加载 IPsec 配置

    复制
    已复制!
                

    swanctl --load-all

  6. 在发起方或目标侧启动 IKE 协议

    复制
    已复制!
                

    swanctl -i --child <child_name>

    信息

    在上面的示例中,子项的名称为 bf

  • /opt/mellanox/doca/applications/ipsec_security_gw/

  • /opt/mellanox/doca/applications/ipsec_security_gw/ipsec_security_gw_params.json

© 版权所有 2025 NVIDIA。 上次更新时间:2025 年 2 月 12 日。