1. 引言
随着互联网技术的快速发展,智能终端用户量的爆炸式增加,对移动通信业务的覆盖效果要求越来越高。据调查显示,移动通信业务主要集中在车站、住宅区、办公区等室内场所 [1] 。但目前室内信号存在容纳终端量小、信号不稳定,数据和话音质量差等现象。针对上述现象,室内信号增强的解决方案主要有femto基站、路由器、AP等。Femto系统是通过固网宽带接入核心网,为用户提供固定移动融合业务,在高性价比实现移动通信室内覆盖、固定移动综合业务平台化提高等方面具有显著优势,已成为主流运营商重点关注的技术方向。Femto系统是由Femto AP、安全网关、Femto网关等组成的,目前Femto应用中一般安全网关都是作为独立网元存在的。本文分析的就是安全网关作为独立网元存在的不足,并针对这些不足对独立安全网关进行改进,利用基于DPDK实现的用户态IPSec网关来改善数据通信处理流程复杂带来的一系列问题,优化安全网关的性能。
2. 架构概述
2.1. Femto架构概述
Femto系统架构组成如图1所示,包括终端、femto基站、femto网关、核心网 [2] 。Femto基站通过Internet连接到femto网关,在Internet上传输的数据安全性很容易通过相应的技术手段造成威胁,所以提高femto系统的安全性是非常必要的,IPSec网关技术应运而生 [3] 。
2.2. IPSec框架概述
IPSec安全网关的运行环境是Linux系统。如图2所示为IPSec安全网关的结构框图。其中数据加解密模块、AH (Authentication Header,验证头)/ESP (Encapsulated Security Payload,封装安全载荷)实现模块、SADB (Security Association Database,安全关联数据库)/SPDB (Safety Policy Database,安全策略数据库)等模块都是在内核层实现的,IKE (Internet Key Exchange,因特网密钥交换协议)模块在用户层实现 [4] 。
现有的IPSec安全网关技术是使用IPSec隧道对数据进行加解密处理,这种方式会增加额外的带宽,对数据的传输速率产生很大的影响,因此需要寻求方法来提升安全网关的性能。提升IPSec安全网关性能的方法有三种:第一,优化IPSec加解密算法;第二,利用加速硬件来处理加解密流程;第三,内核协议栈中IPSec数据的处理流程的内存拷贝、系统调用、中断的开销比较大,而用户态只有一些上层应用程序,我们可以把协议栈放在用户态减少上述开销,在用户态实现IPSec功能。基于上述三种方法的对比和衡量,本文采用在用户态实现IPSec功能来优化安全网关的性能。

Figure 2. The structure diagram of IP Security gateway
图2. IPSec网关的结构框图
3. 解决方案
通过大量的调研和学习,本文提出了一种基于DPDK (Data Plane Development Kit,数据平面开发套件)实现用户态IPSec网关功能的方法。即利用基于VPP (Vector Packet Processing,向量报文处理)框架实现的DPDK模块、协议栈处理模块和IPSec模块来提升安全网关的性能,如图3所示。
首先介绍一下DPDK,DPDK是Intel推出的运行在用户空间上利用自身提供的数据平面库来实现数据包快速收发的套件,绕过了Linux内核协议栈对数据包进行相应的处理 [5] 。DPDK主要有两个功能:底层驱动和数据收发。
DPDK在底层驱动模块实现了多核处理和分布式存储分配方式。DPDK改变了传统处理方式不支持多核环境的缺点,实现了多核环境,把所有的逻辑核分为主核和次核两部分,主核负责初始化次核、内存池的初始化、共享变量的建立、硬件的检测以及任务的分发等。次核负责执行主核分发的任务。同时为了避免分发的任务在多个逻辑核之间频繁的迁移,DPDK通过CPU亲和性将任务固定分发到某一个次核。次核的任务执行由主核完全控制,不能被其他应用程序抢占,因此在整个应用程序的执行期间,处理器核都是被独占的。
为了解决传统处理方式中硬件中断所带来的负载严重不均衡问题,以最快的速度处理数据包,DPDK采用轮询模式从网卡获取数据包,每一个逻辑核可以分配一个发送和接收队列,将收到的数据包平均放在网卡的接收队列中,以此实现负载均衡。另外不断的检查每一个逻辑核的发送队列,将要发送的数据包发送出去 [5] 。通过上述方式,有效减少了数据收发的开销,实现数据包的快速收发。
接下来介绍的是用户态的框架VPP。VPP是Cisco开发的一套基于DPDK实现的运行在用户空间的
可扩展框架。它是个延展性很高的应用,一个应用在VPP里以连起来的若干节点(Graph Node)组成,每个节点包含上述的一个或多个功能。网络帧在VPP中被储存在网络帧向量Packet Vector中,它也是节点的唯一处理对象,节点也会根据处理结果来决定网络帧的下一个目的地节点。它的功能非常强大,提供了完整的IPsec协议栈支持:ESP,Transport和Tunnel模式,以及IKEV2,将VPP IPSec和DPDK Cryptodev进行了融合,在VPP IPSec中成功启用了DPDK Cryptodev来负责所有的Crypto工作,让两者之间有了强烈的化学反应。VPP DPDK IPsec工作流如图4所示,可以看到,在interface-output节点处,程序发现网络帧是ESP协议帧后,将其组成Packet Vector传递给ipsec-if-output节点,再将其交给DPDK Cryptodev加持的dpdk-esp-encrypt和dpdk-esp-decrypt做Crypto工作。然后再传递给dpdk-crypto-input轮询节点,dequeue处理完的工作流。接下来的dpdk-esp-encrypt-post/dpdk-esp-decrypt-post负责网络帧的再封装 [6] 。
4. 测试及分析
为了比较用户态IPSec网关与传统方案的性能,搭建如图5所示的测试环境。其中网关A和B是两

Figure 3. The structure diagram of VPPDPDK IPSec in User
图3. VPPDPDK IPSec在用户态的结构框图

Figure 4. VPP DPDK IPsec workflow
图4. VPP DPDK IPsec工作流
台Dell PowerEdge R620 (型号)服务器,两个处理器,12个物理核,24个逻辑核,NUMA架构,32 G内存,Ubuntu14.04(64位)操作系统,万兆光口。测试仪1、2、3用的是IXIA测试仪。其中测试仪1表示的是发出数据包的速度;测试仪2表示接收数据包的速度;测试仪3表示网关A发出数据包的速度。
4.1. VPP安装步骤
1) 下载源码:git clone https://gerrit.fd.io/r/vpp;
2) 安装依赖:make install-dep;
3) 安装:执行./build-root/vagrant/build.sh;
4) 生成Makefiles文件:gitpull;cd build-root/;make distclean;./bootstrap.sh;
5) 进行编译:make V = 0 PLATFORM = vpp TAG = vpp install-deb;
6) 包安装:ls *.deb;dpkg–i *.deb;
7) 启动VPP:start vpp [7] 。
4.2. DPDK安装步骤
1) 下载源码:git clone git://dpdk.org/dpdk
2) 设置环境变量:进入dpdk目录:cd~/dpdk
编辑一个环境变量文件名字为dpdkrc,内容为:
export RTE_SDK = “pwd”;
export RTE_TARGET = x86_64-native-linuxapp-gcc;
然后执行sourcedpkdrc命令;
3) 编译dpdk
makeconfig T = x86_64-native-linuxapp-gcc;
make install T = x86_64-native-linuxapp-gcc;
4) 配置hugepages
mkdir-p/mnt/huge;
mount-t hugetlbfsnodev/mnt/huge;
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages;
5) 加载驱动模块
cd tools;
./dpdk-devbind.py –status (查看网络端口状态);
modprobeuio;
cd x86_64-native-linuxapp-gcc/kmod;
insmodigb_uio.ko;
6) 绑定网卡
./dpdk-devbind.py –bind = igb_uioethx;
./dpdk-devbind.py –status;
7) 解绑命令
./dpdk-devbind.py –u 02:06.0 02:07.0;
./dpdk-devbind.py –status [8] 。
经过上述步骤,完成运行在用户态的VPP和DPDK环境的搭建,要在VPP上实现IPSec和IKEV2的功能,还需要经过一系列的配置才能实现,在这里就不详细进行介绍了,环境搭建好之后,基于DPDK实现的IPSec网关就可以成功实现数据包在用户态的安全传输。
4.3. 测试结果分析
从测试仪1以20 Gbit/s的极限速度向测试仪2发送数据,单核转发,测试情况分为以下两种:一、网关A、B均为VPP DPDK IPSec;二、网关A、B均为标准IPSec (strongswan5.3.3)。使用百分比来表示此刻速率达到的最大吞吐量程度,100%表示20 Gbit/s。测试结果如图6所示。从测试结果图可知,在用户态实现的VPP DPDK IPSec网关比传统方案性能提升了很多,说明本方案是可行且有效的。
5. 总结
根据传统IPSec网关的不足,本文提出了一种基于DPDK的用户态IPSec网关的解决方案,并在Linux环境下实现了此方案。测试结果表明,VPP DPDK IPSec与传统方案相比,性能得到了有效的提升。