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 传输。

DOCA IPsec 安全网关设计为使用 2 个端口运行,即安全端口和非安全端口
安全端口 – BlueField 接收 IPsec 加密的数据包,解密后,它们通过非安全端口发送
非安全端口 – BlueField 接收常规(纯文本)数据包,加密后,它们通过安全端口发送
硬件 (HW) 卸载的示例数据包路径

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

将应用程序与 SF 结合使用

静态配置
打开两个 DOCA 设备,一个用于安全端口,另一个用于非安全端口。
使用打开的 DOCA 设备,应用程序探测 DPDK 端口并相应地初始化 DOCA Flow 和 DOCA Flow 端口。
在创建的端口上,构建 DOCA Flow 管道。
在循环中根据 JSON 规则
为新规则创建 IPSec SA 共享资源。
将加密或解密规则插入到 DOCA Flow 管道。
动态配置

打开两个 DOCA 设备,一个用于安全端口,另一个用于非安全端口。
使用打开的 DOCA 设备,应用程序探测 DPDK 端口并相应地初始化 DOCA Flow 和 DOCA Flow 端口。
在创建的端口上,构建 DOCA Flow 管道。
创建 UDS 套接字并监听传入数据。
在循环中等待接收新的 IPsec 策略时,如果收到新的 IPsec 策略
解析策略,判断是加密规则还是解密规则。
为新规则创建 IPSec SA 共享资源。
将加密或解密规则插入到 DOCA Flow 管道。
DOCA 流模式
应用程序可以在两种模式下运行:vnf
和 switch
。有关模式的更多信息,请参阅 DOCA Flow 中的“管道模式”。
VNF 模式
加密

应用程序构建用于加密的管道。控制管道作为根管道,包含四个条目,用于匹配 L3 和 L4 类型并将流量转发到相关管道。
IPv6 管道 – 匹配源 IP 地址并将流量转发到匹配 5 元组(不包括源 IP)的管道。
在 5 元组匹配管道中,设置“设置元数据”操作,元数据将是 JSON 文件中规则的索引。
匹配的数据包将转发到第二个端口。
在安全出口域中,IP 分类器管道将数据包发送到正确的加密管道(IPv4 或 IPv6),该管道具有共享的 IPsec 加密操作。根据元数据匹配,数据包将使用用户规则中定义的封装目标 IP 和 SPI 进行加密。
解密

应用程序构建用于解密的管道。控制管道作为根管道,包含两个条目,用于匹配 L3 类型并将流量转发到相关的解密管道。
解密管道根据规则文件匹配目标 IP 和 SPI,并具有用于解密的共享 IPsec 操作。
解密后,匹配的数据包将转发到解封装管道,如果综合征为非零,则丢弃数据包。否则,数据包将解封装 ESP 标头并转发到第二个端口。
在调试模式下,如果综合征为非零,则将其发送到坏综合征管道,以匹配综合征、计数并丢弃/发送到应用程序。
交换机模式

在交换机模式下,入口根管道匹配源端口以确定下一个管道是什么
根据端口,数据包通过与 VNF 模式几乎相同的路径,并设置元数据。之后,数据包移动到出口根管道。
在出口根管道中,匹配的是在数据包元数据中设置的加密和解密位
解密位为 1 – 数据包完成解密路径,必须发送到非安全端口
加密位为 1 – 数据包几乎完成加密路径,必须发送到安全出口域上的加密管道,并从那里发送到安全端口
有关如何安装 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
文件中设置所需的标志,而不是在编译命令行中提供它们
编辑
/opt/mellanox/doca/applications/meson_options.txt
中的以下标志将
enable_all_applications
设置为false
将
enable_ipsec_security_gw
设置为true
运行以下编译命令
cd /opt/mellanox/doca/applications/ meson /tmp/build ninja -C /tmp/build
信息doca_ipsec_security_gw
将在/tmp/build/ipsec_security_gw/
下创建。
故障排除
有关应用程序编译过程中遇到的任何问题,请参阅 DOCA 故障排除。
准备工作
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/hugeVNF 模式 – 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交换机模式 – IPsec 安全网关应用程序需要配置端口以在交换机模式下运行
sudo mlxconfig -d /dev/mst/mt41686(mt41692)_pciconf0 s LAG_RESOURCE_ALLOCATION=
1
# power cycle the host to applythis
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 valuefalse
cmode runtime sudo devlink dev param set pci/0000
:03
:00.1
name esw_pet_insert valuefalse
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 valuetrue
cmode runtime sudo devlink dev param set pci/0000
:03
:00.1
name esw_multiport valuetrue
cmode runtime注意在断开主机电源之前,请确保执行 BlueField 系统重启。
要恢复旧配置
sudo devlink dev param set pci/
0000
:03
:00.0
name esw_multiport valuefalse
cmode runtime sudo devlink dev param set pci/0000
:03
:00.1
name esw_multiport valuefalse
cmode runtime
应用程序执行
IPsec 安全网关应用程序以源代码形式提供。因此,在执行应用程序之前需要进行编译。
应用程序使用说明
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 levelfor
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 portinterface
name -un, --unsecured-name unsecured portinterface
name -n, --nb-cores number of cores --debug Enable debug counters信息此使用说明可以使用
-h
(或--help
)选项打印到命令行./doca_ipsec_security_gw -h
信息有关更多信息,请参阅“命令行标志”部分。
在 BlueField 或主机上运行应用程序的 CLI 示例
静态配置
./doca_ipsec_security_gw -s
03
:00.0
-u03
:00.1
-c ./ipsec_security_gw_config.json -m transport注意PCIe 地址标识符(
-s
和-u
标志)应与所需 PCIe 设备的地址匹配。动态配置
./doca_ipsec_security_gw -s
03
:00.0
-u03
:00.1
-c ./ipsec_security_gw_config.json -m transport -i /tmp/rules_socket注意PCIe 地址标识符(
-s
和-u
标志)应与所需 PCIe 设备的地址匹配。
该应用程序还支持基于 JSON 的部署模式,其中所有命令行参数都通过 JSON 文件提供
./doca_ipsec_security_gw --json [json_file]
例如
./doca_ipsec_security_gw --json ipsec_security_gw_params.json
注意在执行之前,请确保使用的 JSON 文件包含正确的配置参数,尤其是部署所需的 PCIe 地址。
命令行标志
标志类型 | 短标志 | 长标志/JSON 键 | 描述 | JSON 内容 |
通用标志 |
|
| 打印帮助概要 | N/A |
|
| 打印程序版本信息 | N/A | |
|
| 设置应用程序的日志级别
|
| |
N/A |
| 设置程序的日志级别
|
| |
|
| 从输入 json 文件解析所有命令标志 | N/A | |
程序标志 |
|
| JSON 配置文件的路径 |
|
|
| 非安全端口的 PCIe 地址 |
| |
|
| 安全端口的 PCIe 地址 |
| |
|
| IPsec 模式。 可能的值: |
| |
|
| 非安全端口的接口名称 |
| |
|
| 安全端口的接口名称 |
| |
|
| IPC 套接字文件路径,用于在运行时接收 IPsec 规则 |
| |
|
| 核心数 |
| |
N/A |
| 为所有条目添加计数器 |
|
有关支持的标志和执行模式的更多信息,请参阅 DOCA Arg Parser。
静态配置 IPsec 规则
IPsec 规则和其他配置可以使用 JSON 配置文件添加,该文件通过 --config
参数传递。
节 | 字段 | 类型 | 描述 | 示例 |
|
| bool | 配置 DOCA Flow 是在 VNF ( |
|
| string | 解封装和封装卸载: |
| |
| bool | 如果设置为 注意
仅当 |
| |
| bool | 如果设置为 注意
仅当
注意
窗口大小为 64。非 ESN。支持非零 |
| |
| uint | ESP 标头的初始序列号。当 |
| |
| bool | 当 此参数也从 CLI 使用,如果在其中之一发送,则将其视为 true。 |
| |
| string | 转发具有坏综合征的数据包: 注意
仅在调试模式下可用。 |
| |
| string | 可能的值:
|
| |
| bool | 当 |
| |
| uint | 当 |
| |
| bool | 当 |
| |
|
| int | 源和目标 IP 版本。可能的值: |
|
| string | 要匹配的源 IP |
| |
| string | 要匹配的目标 IP |
| |
| string | L4 协议:TCP 或 UDP |
| |
| int | 要匹配的源端口 | ||
| int | 要匹配的目标端口 |
| |
| int | 封装 IP 版本: |
| |
| string | 封装目标 IP 注意
仅隧道模式下强制。 |
| |
| int | 要在 ESP 标头中设置的 SPI 整数 |
| |
| string | 用于创建 SA 的密钥(十六进制格式) |
| |
| int | 密钥大小: |
| |
| int | 用于创建 SA 的 Salt 值。默认为 |
| |
| int | ICV 长度值: |
| |
| int | 设置 IPsec 生命周期阈值。如果 |
| |
| bool | 启用扩展序列号。默认为 |
| |
|
| int | 目标 IP 版本: |
|
| string | 要匹配的目标 IP |
| |
| int | 内部 IP 版本: 注意
仅隧道模式下强制。 |
| |
| int | 要在 ESP 标头中匹配的 SPI |
| |
| string | 用于创建 SA 的密钥(十六进制格式) |
| |
| int | 密钥大小: |
| |
| int | 用于创建 SA 的 Salt 值。默认为 |
| |
| int | ICV 长度值: |
| |
| int | 设置 IPsec 生命周期阈值。如果 |
| |
| bool | 启用扩展序列号。默认为 |
|
动态配置 IPsec 规则
应用程序监听 UDS 套接字,以接收在 policy.h
文件中预定义的 IPsec 策略结构。
客户端程序或密钥守护程序应使用通过 --ipc
/-i
标志提供给应用程序的相同套接字文件路径连接到套接字,并通过同一套接字将策略结构作为 packed 发送到应用程序。
在动态配置中,应用程序使用 JSON 配置文件中的 config
部分,并忽略 encrypt_rules
和 decrypt_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 故障排除。
解析应用程序参数。
初始化参数解析器资源并注册 DOCA 通用参数。
doca_argp_init();
注册应用程序的参数。
register_ipsec_security_gw_params();
解析参数。
doca_argp_start();
解析应用程序参数。
DPDK 初始化。
rte_eal_init();
调用
rte_eal_init()
以使用提供的 EAL 标志初始化 EAL 资源,以便不探测端口。解析配置文件。
ipsec_security_gw_parse_config();
初始化设备和端口。
ipsec_security_gw_init_devices();
使用输入的 PCIe 地址/接口名称打开 DOCA 设备。
从每个打开的设备探测 DPDK 端口。
初始化并启动 DPDK 端口。
dpdk_queues_and_ports_init();
初始化 DPDK 端口,包括 mempool 分配。
如果需要,初始化 hairpin 队列。
将每个端口的 hairpin 队列绑定到其对等端口。
初始化 DOCA Flow。
ipsec_security_gw_init_doca_flow();
初始化 DOCA Flow 库。
查找 DPDK 探测到的端口的索引,并使用它们启动 DOCA Flow 端口。
插入规则。
插入加密规则。
ipsec_security_gw_insert_encrypt_rules();
插入解密规则。
ipsec_security_gw_insert_decrypt_rules();
等待流量。
ipsec_security_gw_wait_for_traffic();
在循环中等待,直到用户终止程序。
IPsec 安全网关清理
DOCA Flow 清理;销毁初始化的端口。
doca_flow_cleanup();
SA 销毁。
ipsec_security_gw_destroy_sas();
IPsec 对象销毁。
ipsec_security_gw_ipsec_ctx_destroy();
销毁 DPDK 端口和队列。
dpdk_queues_and_ports_fini();
DPDK 完成。
dpdk_fini();
调用
rte_eal_destroy()
以销毁初始化的 EAL 资源。参数解析器销毁。
doca_argp_destroy()
strongSwan 是一个密钥守护程序,它使用 Internet 密钥交换版本 2 (IKEv2) 协议在两个对等方之间建立 SA。strongSwan 包括一个 DOCA 插件,它是 BFB 中 strongSwan 包的一部分。仅当触发 DOCA IPsec 安全网关时才加载该插件。插件连接到 UDS 套接字,并在密钥交换完成后将 IPsec 策略发送到应用程序。
有关密钥守护程序的更多信息,请参阅 strongSwan 文档 。
端到端架构
下图展示了一个架构,其中两个 BlueField DPU 相互连接,并且每个 DPU 上都运行着 DOCA IPsec 安全网关。

swanctl
是一个用于 strongSwan IPsec 配置的命令行工具
在动态配置中,在两侧运行 DOCA IPsec 安全网关。
启动 strongSwan 服务。
使用两侧的
swanctl.conf
配置文件配置 strongSwan IPsec。在两个对等方之间启动密钥交换。在流程结束时,结果到达 DOCA 插件,填充策略定义的结构,并将其发送到套接字。
两侧的 DOCA IPsec 安全网关从套接字读取新策略,执行解析,创建 DOCA SA 对象,并添加流解密/加密条目。
此架构使用两个 BlueField DPU 上的 P1 上行链路来运行 strongSwan 密钥守护程序。要配置上行链路
为两个 DPU 的 PF 配置 IP 地址
在 BF1 上
ip addr add
192.168
.50.1
/24
dev p1在 BF2 上
ip addr add
192.168
.50.2
/24
dev p1注意可以为上行链路配置多个 IP 地址,以便使用不同的策略属性运行密钥交换。
验证两个 BlueField DPU 之间的连接。
BF1> ping
192.168
.50.2
注意确保上行链路不在 OVS 网桥中。
为每台机器配置
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_ts
和remote_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 插件
验证 此处 列出的依赖项是否已安装在您的环境中。
libgmp-dev
在该列表中缺失,因此请确保也安装它。Git 检出 BF-5.9.10 分支。
在位于
src/libcharon/plugins/doca
下的插件中添加您的更改。在 strongSwan 仓库中运行
autogen.sh
。运行以下命令
./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 对等方上运行以下命令。
在动态配置中运行 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 安全网关应用程序。
编辑
/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 }
注意您还必须为此应用程序提供此路径。
重启 strongSwan 服务器
systemctl restart strongswan.service
注意如果应用程序已以日志级别 debug 运行,您可以看到连接已成功完成,并且应用程序正在等待新的 IPsec 策略。
验证
swanctl.conf
文件是否存在于/etc/swanctl/conf.d/
目录中。注意建议删除
/etc/swanctl/conf.d/
下任何未使用的 conf 文件。加载 IPsec 配置
swanctl --load-all
在发起方或目标侧启动 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