本文主要参考intel发布的vpp-sswan白皮书的内容搭建环境验证strongswan和vpp集成环境。
白皮书地址:https://networkbuilders.intel.com/solutionslibrary/fd-io-vpp-sswan-and-linux-cp-integrate-strongswan-with-world-s-first-open-sourced-1-89-tb-ipsec-solution-technology-guide
vpp-sswan是strongswan的一个插件,它将strongswan的ipsec esp进程处理逻辑从Linux内核卸载到vpp。vpp-sswan利用strongswan可扩展插件设计,将strongswand软件的SA创建/删除以及路由更新操作转换为vpp C api调用,通过api调用将ipsec配置下发到vpp中。也就是说strongswan是ipsec协议栈控制面,vpp则是数据转发面。
vpp-sswan具有以下优点:
1. 易于使用:vpp-sswan遵循strongswan charon规范编写,并提供有用的脚本来编译和安装插件。给定自定义的strongswan安装,用户只需要运行单个命令或手动将编译好的vpp-sswan插件和配置文件复制到特定的strongswan位置,重启strongswan服务即可。
2. 性能:vpp-sswan利用了高度优化的VPP I/O和IPsec协议栈。这意味着网络vpp负责处理I/O和IPsec数据通路。
vpp-sswan插件从22.10版本开始已集成到在vpp主线中,并与strongswan 5.9.5或5.9.6版本一起使用。vpp使用linux-cp插件和strongswan共享网络I/O接口。
上图中展示了在Linux-CP的帮助下,IKE交互的数据流在VPP和strongswan流程流程。在这个例子中,我们假设strongswan预期IKE消息和加密的ESP报文的本地IP地址是10.0.0.1。为了将来自VPP拥有的网卡的IKE数据包路由到strongswan,我们创建了一个Linux-CP实例,它绑定了镜像接口对(图中的WAN网卡端口和Tun/Tap端口),两者都具有相同的IP地址10.0.0.1。Linux-CP有助于自动配置接口之间的路由。当IKE消息通过WAN网卡端口被vpp接收后,会通过Tun/Tap端口转发到内核,经过Linux内核栈处理后再传递给strongswan。如果安全联盟协商成功,strongswan将通过vpp-sswan插件配置vpp中的IPsec ESP配置及路由。自动化配置完成后,VPP将负责IPsec ESP加密/解密,并将数据包转发到所需的端口。
假设通过Internet连接的两个子网192.168.0.0/24和192.168.1.0/24需要建立一条安全的IPsec隧道。每个子网都有一个IPsec网关系统,WAN ip分别为10.0.0.1和10.0.0.2。每个网关系统上的strongswan应用协商一个公共的安全联盟,私有地创建一个会话对称加密算法和密钥。strongswan应用程序将数据平面处理任务交给VPP,然后使用VPP的VAPI创建安全策略(SP)和SA。vpp-sswan将确保必要的SA/SP创建被正确解析为VPP VAPI调用。Linux-CP还将处理WAN网络适配器和镜像Tun/Tap端口之间的正确路由配置。
上图显示了ipsec加解密相关流程。加密流程:当网络数据包被LAN网络适配器接收并匹配出站安全策略(SP)规则时,报文将被加密。该过程包括在数据包中添加ESP (Encapsulating Security Payload,封装安全负载)头。一旦加密,数据包就被转发到WAN网卡端口。解密流程:当WAN网络适配器接收到网络分组时,将根据任何适用的入站SP规则对其进行检查。如果规则匹配,则解密报文,并删除ESP头或tunnel头。随后,解密数据包被转发到LAN网卡或Tun/Tap端口,具体取决于解密数据包中的IP目的地址。
下面是参考白皮书基于vpp最新主线分支在ubuntu22.04环境搭建流程。首先需要编译vpp release 版本,这里就不再展开了(默认vpp-sswan插件中Makefile仅适配了release版本)。
代码语言:javascript复制vpp Version: v24.02-rc0~46-ga16463610
OS:Ubuntu 22.04.3 LTS
kernel Version:5.15.0-88-generic
接下来就是需要先安装strongswan编译所依赖的环境库。
代码语言:javascript复制apt install -y flex bison byacc
apt install -y gperf python3 libsystemd-dev
接下来进入vpp-sswan目录执行make all,就是自动下载strongswan代码及编译。
代码语言:javascript复制cd ~/workspace/vpp/extras/strongswan/vpp_sswan
root@jinsh:~/workspace/vpp/extras/strongswan/vpp_sswan# make all
运行完之后就会在当前目录下生成libstrongswan-kernel-vpp.so,然后直接make install,就会将so及kernel-vpp配置文件拷贝到strongswan相关的配置路径中。
代码语言:javascript复制#查询当前路径下生成libstrongswan-kernel-vpp.so
root@jinsh:~/workspace/vpp/extras/strongswan/vpp_sswan# ls -lt
-rwxr-xr-x 1 root root 347832 Oct 15 08:34 libstrongswan-kernel-vpp.so
#执行make install安装so及配置文件。
root@jinsh:~/workspace/vpp/extras/strongswan/vpp_sswan# make install
cp libstrongswan-kernel-vpp.so /usr/lib/ipsec/plugins/libstrongswan-kernel-vpp.so
cp kernel-vpp.conf /etc/strongswan.d/charon/
接下来就是配置vpp的startup.conf文件,如下:
代码语言:javascript复制#使能linux-cp插件,关闭ikev2插件
plugins {
plugin linux_cp_plugin.so { enable }
plugin ikev2_plugin.so { disable }
}
#开启vpp和linux内核之间配置自动同步
linux-cp {
lcp-sync
}
重启vpp及strongswan软件,查询strongswan vapi接口已注册成功。
代码语言:javascript复制vpp# show api clients
Shared memory clients
Name PID Queue Length Queue VA Health
strongswan 52411 0 0x00000001301dea40 OK
vpp#
至此,strongswan和vpp集成环境已搭建完成,后续文章将导入配置验证效果。