使用intel82599网卡完成。
介绍
本文介绍了数据平面开发套件 (DPDK)框架中的内联 IPsec 加速支持实现,特别关注英特尔® 82599 10 千兆以太网控制器系列的功能和支持。
内联 IPsec 可用于实现 IPsec 感知系统,该系统具有比旁路辅助和加速硬件更好的延迟,前提是支持的算法合适。
本文包含的背景信息将重点介绍 IPsec 的“后备”硬件加速与内联 IPsec 之间的差异(即数据包流差异以及应用程序端、性能和处理方面的预期差异)。
将提供设置测试系统、安装和运行 IPsec 网关应用程序的示例。
本文假设使用的DPDK版本是17.11或更高版本。
背景
DPDK 安全库提供了一个框架,用于管理和配置卸载到基于硬件的设备的安全协议操作。该库定义了通用 API 来创建和释放安全会话,这些会话可以支持完整的协议卸载以及与网络接口控制器 (NIC) 或加密设备的内联加密操作。
自 17.11 版以来,安全库就已包含在 DPDK 中,它引入了 API 和功能,可以添加对英特尔 82599 10 千兆以太网控制器系列上已有的内联加密 (IPsec) 加速的支持。DPDK IXGBE 驱动程序也进行了更新,支持内联 IPsec。
英特尔 82599 10 千兆以太网控制器系列仅支持 AES-GCM 128,因此支持的协议:
仅 ESP 身份验证:AES-128-GMAC(128 位密钥)
ESP 加密和认证:AES-128-GCM(128 位密钥)
IPsec安全网关示例应用程序也支持此功能,下面将详细说明。
数据包流
首先,让我们看一下数据包在系统中的流动和处理。
上面描述的数据包流显示了传入加密 IPsec 数据包的数据包处理阶段。在第一种情况下,使用旁路英特尔® QuickAssist 技术 (英特尔® QAT) 硬件加速器对其进行处理(解密和/或验证)。在第二种情况下,使用英特尔 82599 10 千兆以太网控制器中提供的内联 IPsec 硬件处理对其进行处理。
如上所述,处理的第二阶段(解密和/或身份验证)由网络控制器本身与数据包接收阶段相结合。 DPDK 应用程序仍需要处理封装安全有效负载 (ESP) 数据包的封装和解封装。
除数据包方向外,传出流程相同。
软件 API 和示例应用程序
现在,让我们看看软件 API、要求和使用模型。我们将使用IPsec 安全网关示例应用程序中的代码摘录,这些代码经过简化,清晰易懂,并且删除了错误处理。
首先,我们需要创建一个安全会话,从以下配置开始:
struct rte_security_session_conf sess_conf = {
.action_type = RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO,
.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
{.ipsec = {在这里插入代码片
.spi = <SPI>,
.salt = <Salt>,
.options = { 0 },
.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS,
.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
} },
.crypto_xform = <xforms>,
.userdata = NULL,
};
接下来,创建安全会话:
struct rte_security_ctx *ctx = (struct rte_security_ctx *)
rte_eth_dev_get_sec_ctx(<portid>);
rte_security_session *sec_session =
rte_security_session_create(ctx, &sess_conf, <session_pool>);
然后,创建一个 RTE_FLOW_ACTION_TYPE_SECURITY 流:
pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4;
pattern[1].mask = &rte_flow_item_ipv4_mask;
pattern[2].type = RTE_FLOW_ITEM_TYPE_ESP;
pattern[2].spec = &esp_spec; /*contains the SPI*/
pattern[2].mask = &rte_flow_item_esp_mask;
action[0].type = RTE_FLOW_ACTION_TYPE_SECURITY;
action[0].conf = sa->sec_session;
action[1].type = RTE_FLOW_ACTION_TYPE_END;
action[1].conf = NULL;
flow = rte_flow_create(portid, , <pattern>, , &<err>);
这样,配置就完成了,并且安全关联 (SA) 对于与所创建流匹配的传入 ESP 数据包处于活动状态。“rte_mbuf”结构中的卸载标志将通过设置 PKT_RX_SEC_OFFLOAD 标志来指示数据包是否以内联方式处理,如果发生任何错误,还将设置 PKT_RX_SEC_OFFLOAD_FAILED。
对于传出的数据包,编程类似,只是应用程序需要设置卸载标志 PKT_TX_SEC_OFFLOAD。
测试系统设置
除了 DPDK 和示例应用程序之外,我们还将使用 Python* scapy v2.4.0(数据包生成器)和 pycryptodome v3.6.0(提供 AES-GCM 支持)来生成明文和加密数据包。
将以下内容保存为 inline_ipsec.py:
from scapy.all import *
def main(argv):
payload = 'test-' * 2000
sa = SecurityAssociation(ESP, spi=5, crypt_algo='AES-GCM',
crypt_key='\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15'
'\x88\x09\xcf\x4f\x3d\xde\xad\xbe\xef',
auth_algo='NULL', auth_key=None,
tunnel_header=IP(src='172.16.1.5', dst='172.16.2.5'))
sa.crypt_algo.icv_size = 16
try:
opts, args = getopt.getopt(argv, 'c:i:s:e:',
['count=', 'iface=', 'size=', 'encrypt='])
except getopt.GetoptError:
sys.exit(2)
maxcount = 1
intface = "enp2s0f0"
paysize = 64
do_encrypt = True
for opt, arg in opts:
if opt in ("-c", "--count"):
maxcount = arg
if opt in ("-i", "--iface"):
intface = arg
if opt in ("-s", "--size"):
paysize = arg
if opt in ("-e", "--encrypt"):
if arg == '0' or arg == 'False':
do_encrypt = False
p = IP(src='192.168.105.10', dst='192.168.105.10')
p /= "|->"
p /= payload[0:(int(paysize) - 6)]
p /= "<-|"
p = IP(str(p))
if do_encrypt:
e = sa.encrypt(p)
else:
e = p
eth_e = Ether()/e
sendp(eth_e, iface=intface, count=int(maxcount))
if __name__ == "__main__":
exit(main(sys.argv[1:]))
测试系统配置如下图所示。
该配置使用两个英特尔® 82599ES 10 千兆以太网控制器双端口卡,如上所示连接。
在此特定配置中,卡 1 端口将分配给 DPDK 驱动程序,端口 0 BDF 06:00.0 和端口 1 BDF 06:00.1。卡 0 端口将分配给内核驱动程序,标识为 enp2s0f0 和 enp2s0f1。请注意,在其他系统中,地址和端口名称可能不同。
根据此数据创建 IPsec 示例应用配置,并将其保存为名为 inline.cfg 的文件。例如:
#SP IPv4 rules
sp ipv4 out esp protect 1005 pri 1 dst 192.168.105.0/24 sport 0:65535 dport 0:65535
#SA rules
sa out 1005 aead_algo aes-128-gcm aead_key 2b:7e:15:16:28:ae:d2:a6:ab:f7:15:88:09:cf:4f:3d:de:ad:be:ef \
mode ipv4-tunnel src 172.16.1.5 dst 172.16.2.5 \
port_id 1 \
type inline-crypto-offload \
sa in 5 aead_algo aes-128-gcm aead_key 2b:7e:15:16:28:ae:d2:a6:ab:f7:15:88:09:cf:4f:3d:de:ad:be:ef \
mode ipv4-tunnel src 172.16.1.5 dst 172.16.2.5 \
port_id 1 \
type inline-crypto-offload \
#Routing rules
rt ipv4 dst 172.16.2.5/32 port 1
rt ipv4 dst 192.168.105.10/32 port 0
然后按如下方式启动应用程序:
ipsec-secgw \
-l 6,7 \
-w 06:00.0 -w 06:00.1 \
--log-level 8 --socket-mem 1024,0 --vdev crypto_null \
-- -p 0xf -P -u 0x2 \
--config="(0,0,6),(1,0,7)" -f ./inline.cfg
请注意,NULL 加密设备仅存在,因为应用程序需要“真正的”加密 PMD(出于遗留原因)。
测试 ESP 解密和解密数据包的转发
为了测试应用程序,在端口 1 上发送加密数据包:
python inline_ipsec.py -i enp2s0f1 -s 64 -c 32 -e 1
在监听端口 0 时:
tcpdump -i enp2s0f0 –vvX
在端口 0 上应该可以观察到解密的数据包:
10:31:00.636564 IP (tos 0x0, ttl 63, id 1, offset 0, flags [none],
proto Options (0), length 84)
192.168.105.10 > 192.168.105.10: ip 64
0x0000: 4500 0054 0001 0000 3f00 0100 c0a8 690a E..T....?.....i.
0x0010: c0a8 690a 7c2d 3e74 6573 742d 7465 7374 ..i.|->test-test
0x0020: 2d74 6573 742d 7465 7374 2d74 6573 742d -test-test-test-
0x0030: 7465 7374 2d74 6573 742d 7465 7374 2d74 test-test-test-t
0x0040: 6573 742d 7465 7374 2d74 6573 742d 7465 est-test-test-te
0x0050: 733c 2d7c s<-|
数据包流向如下:
端口 1 接收到 ESP 数据包。
端口 1 RX 队列包含已解密有效载荷的 ESP 数据包。
ESP 解封装。
包含解密有效负载的明文数据包在端口 0 上传输。
测试 ESP 加密
为了测试应用程序,在端口 0 上发送明文数据包:
python inline_ipsec.py -i enp2s0f0 -s 64 -c 32 -e 0
在监听端口 1 时:
tcpdump -i enp2s0f0 –vvX
在端口 1 上应该可以观察到加密数据包:
10:37:45.622669 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none],
proto ESP (50), length 140)
172.16.1.5 > 172.16.2.5: ESP(spi=0x000003ed,seq=0x20), length 120
0x0000: 4500 008c 0000 0000 4032 1f16 ac10 0105 E.......@2......
0x0010: ac10 0205 0000 03ed 0000 0020 0000 0000 ................
0x0020: 0000 0020 fd78 c8f5 7fab 4fb3 5b98 7e79 .....x....O.[.~y
0x0030: 81b0 b4f2 d796 ccd4 f0a7 b031 bb9b 9bde ...........1....
0x0040: af18 767e 5d0f 73e3 bc82 4ea3 4afb 00eb ..v~].s...N.J...
0x0050: 6d02 a367 7a3a c2dd 6b64 74c1 5d41 bb45 m..gz:..kdt.]A.E
0x0060: 7ac2 c1e0 0fb8 5f73 7fcd 4304 e396 32ea z....._s..C...2.
0x0070: 228e 22e5 4a3e ea72 88fb 13a7 e940 9346 ".".J>.r.....@.F
0x0080: 4451 98cf 97fd 878c 96f0 f754 DQ.........T
数据包流向如下:
在端口 0 上接收到明文数据包。
ESP 封装。
数据包被放置在端口 1 上的 TX 队列中。
数据包在传输过程中由端口1加密。
新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。2
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎