作者简介
Radu Nicolau,英特尔的网络软件工程师。 他的工作目前主要是数据平面功能和库的IPsec相关开发。
本文介绍DPDK框架下的 inline IPsec加速支持方案,重点介绍如何在Intel®82599 万兆以太网控制器系列【1】下启用inline IPSEC加速。
inline IPsec在某些加密算法中具有比look aside加速延迟更低等优点。
本文包含IPsec的“lookaside”硬件加速和inline IPsec之间的差异(即,数据包流差异和应用程序端在性能和处理方面的预期差异)等背景信息,并将简要介绍测试下itong的设置,以及如何安装和运行IPsec网关应用程序的示例。
本文假设使用的DPDK版本是17.11或更高版本。
背景
DPDK安全库【2】提供了一个用于管理和配置卸载到基于硬件的设备的安全协议操作的框架。 该库定义了用于创建和释放安全会话的通用API,这些会话可以支持完整协议卸载以及使用inline 加密操作的网络接口控制器(NIC)或加密设备。
DPDK 安全库自17.11发布以来一直包含在DPDK中,该安全库引入了部分用于为英特尔82599万兆以太网控制器提供inline 加密(IPsec)加速提供了支持的API和功能。 DPDK IXGBE【3】驱动程序也相应更新了对inline IPsec的支持。
英特尔82599万兆以太网控制器系列仅支持AES-GCM 128对称加密算法,因此也仅支持如下IPSEC相关协议:
•仅ESP验证:AES-128-GMAC(128位密钥)
•ESP加密和身份验证:AES-128-GCM(128位密钥)
IPsec安全网关【4】示例应用程序也支持此功能,下面将对此进行更详细的说明。
数据包流
首先,让我们看看数据包流和通过系统处理。
上述流程图介绍解密一个IPsec包的各种可能步骤及阶段。 第一种情况使用 lookaside Intel® QuickAssist技术(intel®QAT)硬件加速器对其进行处理(解密和/或验证)。 第二种情况使用英特尔82599万兆以太网控制器中提供的inline IPsec硬件处理进行处理。
第二阶段(解密和/或身份验证)与网络控制器本身的包接收阶段相结合。DPDK应用程序仍然需要处理封装安全有效负载(ESP)数据包的封装和解封装。
除了包方向之外,输出流是相同的。
软件API和示例应用程序
现在,让我们看看软件API、要求和使用模型。 我们将使用IPsec安全网关【5】示例应用程序中的代码摘录,为了清晰起见进行了简化,并删除了错误处理。
首先,我们需要创建一个安全会话,从以下配置开始:
接下来,创建安全会话:
然后,创建一个RTE_FLOW_ACTION_TYPE_SECURITY流程:
这样,配置完成,安全关联(SA)对于与创建的流匹配的传入ESP数据包处于活动状态。 “rte_mbuf”结构中的卸载标志将指示是否通过设置PKT_RX_SEC_OFFLOAD标志来inline 处理数据包,如果发生任何错误,还将设置PKT_RX_SEC_OFFLOAD_FAILED。
对于输出数据包,编程类似,只是应用程序需要设置卸载标志PKT_TX_SEC_OFFLOAD。
测试系统设置
除DPDK和示例应用程序外,我们还将使用Python * scapy v2.4.0(数据包生成器)和pycryptodome v3.6.0(提供AES-GCM支持)来生成明文和加密数据包。
将以下内容另存为inline_ipsec.py:
测试系统配置如下图所示:
该配置使用两个Intel®82599ES万兆以太网控制器双端口卡连接,如上所示。
在此特定配置中,卡1端口将分配给DPDK驱动程序,端口0 BDF 06:00.0和端口1 BDF 06:00.1。 卡0端口将分配给内核驱动程序,标识为enp2s0f0和enp2s0f1。 注意,不同系统的地址和端口名称可能不同。
根据此数据创建IPsec示例应用程序配置,并将其另存为名为inline.cfg的文件。 例如:
然后按如下方式启动应用程序:
请注意,NULL加密设备存在仅因为IPSEC-SECGW应用程序需要一个“真正的”加密PMD(历史遗留原因)。
测试ESP解密和转发解密的数据包:
为了测试应用程序,在端口1上发送加密数据包:
python inline_ipsec.py -i enp2s0f1 -s 64 -c 32 -e 1
在侦听端口0时:
tcpdump -i enp2s0f0 –vvX
应在端口0上观察到解密的数据包:
数据包流如下:
1.在端口1上接收ESP数据包。
2.端口1 RX队列包含有效负载解密的ESP数据包。
3.ESP解封装。
4.在端口0上发送包含解密有效载荷的明文包。
测试ESP加密
为了测试应用程序,在端口0上发送明文数据包:
python inline_ipsec.py -i enp2s0f0 -s 64 -c 32 -e 0
在侦听端口1时:
tcpdump -i enp2s0f0 –vvX
数据包流如下:
1.端口0收到明文报文。
2. ESP封装。
3.数据包放在端口1的TX队列中。
4.数据包在传输过程中由端口1加密。
结论
本文介绍了英特尔82599万兆以太网控制器提供的inline IPsec支持的详细信息,内部工作原理以及DPDK框架如何支持,以及如何构建可利用该功能的应用程序。
附上文注释详细链接
https://www.intel.com/content/www/us/en/embedded/products/networking/82599-10-gigabit-ethernet-controller-family-documentation.html
http://doc.dpdk.org/guides/prog_guide/rte_security.html
http://doc.dpdk.org/guides/nics/ixgbe.html#inline-crypto-processing-support
http://doc.dpdk.org/guides/sample_app_ug/ipsec_secgw.html
-
http://doc.dpdk.org/guides/sample_app_ug/ipsec_secgw.html
转发抽奖啦
送!京东电子卡
活动规则:带文字将本文转发至朋友圈,并将截图发至公众号后台,小编将随机抽取十位,每人送出一张京东十元电子卡!中奖名单见下期推送。
领取方式:后台发送卡号及卡密。
点击下方精彩回顾
DPDK与SPDK开源社区
长按扫码关注我们