一种基于strongSwan的IPSec VPN网关的实现
2017-08-12李康康胡荣磊
蒋 华 李康康 胡荣磊
1(北京电子科技学院 北京 100070)2(西安电子科技大学 陕西 西安 710071)
一种基于strongSwan的IPSec VPN网关的实现
蒋 华1,2李康康2胡荣磊1
1(北京电子科技学院 北京 100070)2(西安电子科技大学 陕西 西安 710071)
IPSec VPN是一种使用IPSec协议来实现的虚拟专用网技术。针对国密算法在网络安全产品上的应用相对较少这一问题,设计一种基于开源IPSec项目strongSwan的VPN网关。该网关使用SSX0912加密芯片中的国密算法接口替换了strongSwan的国际密码算法接口,完成了strongSwan对国密标准的支持。将修改后的strongSwan移植到AM335x为核心的开发板中,在嵌入式硬件环境中实现了IPSec VPN的网关。通过搭建开发环境测试,该网关运行稳定,延时小,使用硬件加密模块,安全性更高,相比于简单的Linux系统实现,应用范围也更加广泛。
虚拟专用网 国密算法 strongSwan 嵌入式
0 引 言
随着IPSec VPN对性能、安全性的要求越来越高,IKEv1(网络密钥交换)协议[1]的冗余性、缺乏一致性的缺点越来越明显[2]。因此,在2005年10月,IETF工作组发布了IKE协议的第二版,即IKEv2[3]。IKEv2简化了IKEv1的复杂功能,增强了安全性,具体体现在抵御中间人攻击、拒绝服务攻击、完美前向保护等几个方面。IPSec协议是目前VPN技术开发中使用最广泛的一种安全协议[4]。Linux上常用的IPSec协议实现有Frees/wan项目,Frees/wan分为Openswan和strongSwan。Openswan是Linux下的开源项目,由于软件结构相对简单,安全性较好,兼容效果好,已经集成于Cisco等多家厂商的VPN产品中[5]。但是Openswan也有局限性,那就是只支持IKEv1协议,而IKEv1协议的冗余性等缺点对它今后的发展前景带来了很大的限制。IKEv2同时兼顾高效性、安全性的特点将会越来越受到人们的青睐。strongSwan同时支持IKEv1和IKEv2协议,可以广泛应用于不同的终端,包括PC、安卓手机、IOS手机等。
VPN的数据加解密技术、隧道技术、密钥管理技术、用户身份认证技术已经广泛应用于保障互联网信息安全的方方面面。数据加解密技术中使用的密码算法全部是来自于国外组织或机构制定的标准,常用的有DES、3DES、AES、SHA-1、ECC等。为了适应我国自身的安全需求,我国国家密码管理局批准了一系列国密标准的密码算法,例如SM1、SM2、SM3、SM4、祖冲之算法等。在此基础上也制订了基于国密算法的VPN技术规范[5]。因此,基于国密的IPSec协议标准,实现自主可控的IPSec VPN网关是国家安全和经济发展的需要。
本文通过替换strongSwan中的加密算法,添加对国密SM3、SM4算法的支持,并且将strongSwan移植到嵌入式平台下,搭建IPSec VPN开发环境,最后经过测试,分析了该网关的性能。
1 网关总体结构
网关结构如图1所示,包括加密模块和AM3-35x为核心的开发板。
图1 网关总体结构图
1.1 硬件加密模块设计
硬件加密模块是VPN网关实现的基础。传统的软件加密系统具有开发时间短、研发成本低等优点,但是硬件加密在抵御攻击、密钥的安全存储、运算速度等方面有更大的优势。所以加密模块的设计往往决定着VPN的性能的好坏。
本文通过美国德州仪器推出的OMAPL137[6]双核心芯片设计了加密模块,芯片包含ARM和DSP两部分。其中,ARM端负责通信机制的控制,而DSP端结合SSX0912安全加密芯片对密码算法进行处理。ARM和DSP端通信是基于Ti公司的DSPLINK技术。加密模块在功能上作为一个可接入多个通信终端的设备,并且加密模块的安全服务独立于通信系统,加密模块开发完成以后只向外界提供一些可用的 API 接口,外界通信终端只要调用 API 接口就能实现加解密等安全服务功能。
加密模块的设计采用了SSX0912安全加密芯片。SSX0912安全加密芯片可以实现SM2、SM3、SM4等国标密码算法,同时也带有UART总线接口、RS232总线接口、HSPI总线接口和USB2.0接口。用户可以根据应用选择不同的接口。
针对安全应用,SSX0912安全加密芯片参照了X.509V3的证书格式,自定义了证书结构,在模块中加入了证书和CA公钥存储,方便密钥协商和身份认证。
由于OMAPL137要通过USB和外界进行通信,要接收外界发过来的数据,所以软件方面驱动的编译是关键。安全模块相比于AM335x来说是一个从设备,这就要涉及到USB gadget的驱动开发。因为直接编写驱动程序会很困难,所以通过查阅资料,本设计决定修改Linux设备驱动程序gadget_serial.c来完成驱动程序。
通过对Linux设备驱动程序结构的分析,Linux虚拟串口设备驱动程序的程序框架和其他设备驱动的程序框架是一样的。所不同的是在设备驱动程序里添加一些支持字符处理的接口函数,并且在 USB 虚拟串口中添加关于串口通信的驱动模块。值得一提的是,读写速度有多大,串口不能控制,也就是说 USB 给出多大的速度,出口就能读写多大的速度。所以,虚拟串口的速度不受串口波特率的影响,只受 USB 协议读写速度的影响。
将修改好的程序加载到Linux内核,然后交叉编译内核,生成g_serial.ko。接着通过制作Ramdisk根文件系统把g_serial.ko文件拷贝进去,烧写文件系统,由超级终端重启开发板OMAPL137,使用命令insmodg_serial.ko加载驱动。通过cat /proc/devices可以查看到已加载驱动的设备号,最后用mknod /dev/ttyusb c 127 0创建设备节点。为了防止每次启动开发板系统都要重新加载驱动,可以在/etc/init.d/rcS程序自启动文件中输入以上命令,这样每次重启驱动就自动加载了。驱动加载完成之后就可以通过USB OTG接口和外界终端设备通信了。
1.2 AM335x驱动设计
根据图1所示网关结构,strongSwan开源程序在经过修改后,交叉编译到AM335x中,AM335x和加密模块通过USB接口进行通信,此时的AM335x相对于OMAPL137来说是主设备[7]。因为嵌入式系统内核是裁剪过的,许多设备驱动并没有,所以我们需要为主设备AM335x添加CDC-ACM驱动,CDC-ACM驱动允许任何通信设备去提供一个串口通信接口。具体步骤:
1) 在AM335x的Linux内核中找到CDC-ACM支持的选项,如图2所示。
图2 CDC-ACM内核选项
2) 选中module之后,使用AM335x的交叉编译工具编译内核,在./drivers/usb/class目录下可以找到cdc-acm.ko。
3) 将cdc-acm.ko移到AM335x中,insmod cdc-acm.ko,在插上USB数据线时会动态产生驱动ttyACM0。
2 网关软件设计
2.1 软件平台
VPN网关的操作系统是经过裁剪的实时Linux系统,通过对内核的裁剪和修改,去除了许多不必要的模块,保留了一些必要的驱动支持。操作系统由通用的Linux系统变为实时的操作系统,节省了空间,提升了便利性,使系统性能得到了很大的提高[8]。
2.2 strongSwan简介
strongSwan是一个完整的IPSec实现,支持的Linux内核为2.6、3.x和4.x。strongSwan的重点是其强大的身份认证机制,它还有很多优点,例如支持证书撤消列表和在线证书状态协议(OCSP),完全支持IPv6 IPSec隧道和传输连接,支持ESP(封装安全载荷)[9]单独使用时的NAT穿越,完美的PFS(前向保护性)等。和Openswan仅支持IKEv1协议相比,strongSwan同时支持IKEv1和IKEv2协议。
strongSwan中的IKEv2协议的消息协商对IKEv1进行了很大的改进。IKEv1协商过程非常复杂,分为两个阶段,四种模式。而IKEv2取消了模式的概念,消息交换包含三个基本交换类型:初始交换(Initial交换)、协商子SA交换(CREATE_ CHI-LD_SA交换)、信息交换(INFORMATION Exchang-e)[2-3]。
strongSwan使用daemon(守护进程)来控制IKE过程,如图3所示。不同的IKE版本daemon不同,IKEv1协议使用pluto,而IKEv2协议使用charon。
图3 strongSwan IKE 守护进程
2.3 strongSwan密码算法的替换
SSX0912加密芯片提供了SM3、SM4等国密算法的接口,外界通信终端只要调用这些接口就能实现加解密等安全服务功能。
通过分析strongSwan源码的结构,其中有许多插件(plugin),加载密码算法的插件在/src/libstrong-swan/目录中,libstrongswan结构如图4。在所加载的插件中,对称加密算法插件有aes、des等,完整性验证所用到的摘要算法有sha1、sha2、md4、md5等,除了这些密码算法外,还有openssl库、sqlite库等。其中一些不常用的算法会使用openssl中的函数来实现,strongSwan数字签名算法用的就是openssl函数库中的ECDSA,即椭圆曲线数字签名算法。
图4 基于plugin的libstrongswan模块结构
SM3、SM4算法的替换只是在原有算法的基础上更改了函数的接口,并且修改了算法的命名机制,将原有的“aes-128”和“sha-256”分别替换为“SM4”和“SM3”。算法替换完成后需要证明是否替换正确。
2.3.1 SM4算法的替换
strongSwan启动时默认加载的是aes-128算法,即密钥长度和数据长度均为16字节,这和SM4算法相对应,所以只需修改aes_crypter.c程序即可。通过研读aes_crypter.c,主要函数有:encrypt()和decrypt()。Encypt()函数是加密函数,decrypt()是解密函数,它们都包含encrypt_block()函数,就是用来加密一块数据的函数。SM4程序中对应的函数为sm4_crypt_ecb()和sm4_crypt_cbc(),这两个函数均为SSX0912中的算法接口,可以使用ioctl的方式调用这两个接口。因为SM4算法解密是加密的逆过程,所以只需将加密标志SM4_ENRYPT换为解密标志SM4_DECRYPT即可,具体代码不再赘述。
2.3.2 SM3算法的替换
strongSwan默认加载的杂凑算法为sha-1,sha-1输出的摘要值长度为96位或者160位,而SM3算法输出摘要值为256位。又因为sha-256算法的输出摘要值长度为256位,这样就能够和SM3算法相对应起来了。由于strongSwan结构的特殊性,提供sha-256函数源码的插件有两个:一个是plugin文件夹中的sha2插件,这里面包含sha-256、sha-384、sha-512三个杂凑函数;另一个是openssl插件,它是调用openssl库中的开源函数来实现杂凑函数的。但是在IKE和ESP过程中,默认加载的并不是sha2插件中的sha-256函数,而是openssl函数库中的sha-256函数。通过屏蔽openssl中调用sha-256函数的代码,strongSwan就开始调用sha2插件中的sha-256函数了,这时候只要修改sha2插件中的sha2_hasher.c程序即可。
在sha2_hasher.c程序中,有两个函数:get_hash- 256()、allocate_hash256(),主要功能分别是获取摘要值和分配哈希函数空间。它们都包含两个主要的接口:sha256_write()和sha256_final(),将它们替换成SM3算法的接口,即sm3_update()、sm3_finish(),它们均为SSX0912加密芯片的接口。同理,al-locate_hash256()函数替换方法与之相同。
2.4 移植strongSwan
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器。
strongSwan要想在AM335x上成功运行,这就需要进行交叉编译。移植之前,已经在Ubuntu Linux中安装好了AM335x的交叉编译工具。
2.4.1 strongSwan驱动编译
strongSwan运行时需要许多必要的驱动,这些驱动在AM335x的内核中并没有被加载,需要手动添加内核选项并且重新编译内核,根据strongSwan官网提供的内核编译选项进行添加,如图5所示。
图5 strongSwan需要的内核驱动选项
按照图5提供的内核选项,可以看出strongSwan需要加载AH传输、ESP传输、IPSec传输和隧道模式等必要的驱动。将这些驱动直接加载进内核中,交叉编译AM335x开发板内核,在./arm/boot文件夹中生成了新的内核zImage,根据开发板提供的烧写方法,重新烧写内核即可。
2.4.2 交叉编译strongSwan
通过阅读strongSwan在Ubuntu Linux上成功运行的日志,可以看到strongSwan需要加载一些插件。而有些插件例如openssl库、gmp库、sqilte库在嵌入式环境下是没有的,这时候就需要将这些必要的库移植进开发板。
交叉编译过程中需要注意的几点:
1) 从源码安装开始,也就是使用命令./configure,后面需要许多选项,包括不同的插件,交叉编译工具的路径,生成文件的路径,必须要链接的一些库。
2) 使用make命令编译安装:make&&make install。
3) 编译生成的strongSwan文件夹如果直接通过tftp协议传到开发板中,这样会比较麻烦,重新制作AM335x的文件系统再进行烧写会比较简单。
3 网关性能测试与分析
3.1 测试环境的搭建
在将strongSwan移植进AM335x开发板之后,搭建如图6所示站点到站点的VPN。
图6 测试环境
VPN网关是网关型安全设备,它可以访问公网,而不改变原配置局域网和路由器之间的网络结构[10]。AM335x开发板有两个网口,同时支持4G和WiFi,测试环境就选在WiFi中实现。如图6所示,终端PC A和PC B分别连接AM335x的eth1网口,两个eth0网口分别通过一个Router连接公网Internet。
Router1 WAN口IP地址:192.168.227.121,Router2 WAN口IP地址:192.168.227.122,PC C的IP地址:192.168.227.123。设置其他网卡的IP地址,其中PC A的IP地址:192.168.30.101,PC B的IP地址:192.168.31.101,与A连接的eth1网口IP地址:192.168.30.121,eth0网口IP地址:192.168.1.2,与B连接的eth1网口IP地址:192.168.31.121,eth0网口IP地址:192.168.2.2。
3.2 IKE协商过程测试
strongSwan成功移植进AM335x开发板后,使用IPSec pki命令生成证书来验证发起方和响应方的身份,经过对IPSec.conf、IPSec.secrets文件的配置,紧接着使用命令IPSec start-nofork分别启动两端的strongSwan,成功地产生了隧道“192.168. 30.121/24===192.168.31.121/24”,此时网关后面的主机A和B可以互相访问。
通过wireshark在PC C使用混杂模式进行抓包,可以捕捉到IKE三种消息交换的数据包。
IKEv2的初始交换分为了两对消息[2],其中第一对消息的IKE_SA_INIT过程协商了加密与杂凑算法,交换了nonce值,完成了Diffie-Hellman密钥协商。最后计算出了后面阶段需要的各种密钥值。在输出日志上可以看到协商出的加密算法为SM4,杂凑算法为SM3,这就是之前替换过的算法。
3.3 ESP过程测试
根据图6搭建的测试环境,在PC A上cmd命令行ping 192.168.31.101,也就是PC B的IP地址,再通过wireshark在PC C上抓包,使用混杂模式,就可以捕捉到了ESP包。
因为wireshark上抓到的ESP包是加密后的包,无法进行解密,通过设置strongSwan的日志等级为4级。查看一些敏感信息,就可以获得加密和HMAC所需的密钥,然后就可以进行SM4和SM3算法的验证了。
通过阅读日志得到的数据包和加密密钥,使用国密SM4算法软件进行加密,和wireshark抓到的加密包进行比较,结果完全相同,证明算法已经替换为了SM4国密算法。SM3算法经过验证,也是正确的。
经过对结果分析,SM3和SM4算法替换成功,已经成功在strongSwan中添加了国密标准。
3.4 网关性能分析
首先测试和比较了在开发环境下,有VPN隧道和没有VPN隧道时TCP和UDP传输的性能。首要的性能指数是Round-Trip Time(往返时延)[11],单位是ms。TCP一个特殊的性能指数是TCP吞吐量。UDP三个特殊的性能指标有UDP吞吐量、网络抖动时间、丢包率[11]。吞吐量单位是Mbit/s,抖动时间单位是ms。使用命令ping来测试往返时延,发送100次,结果表明,没有VPN隧道和有VPN隧道时平均往返时间分别为1和2 ms。
在VPN网关上使用命令iperf测试30M带宽下,TCP在有VPN隧道和没有VPN隧道时的吞吐量。分别设置发送数据大小为8、128、256、512 KB。结果如表1所示。
表1 不同数据下TCP吞吐量 Mbit·S-1
由表1可知,我们可知在没有VPN隧道的情况下,使用命令iperf读取256 KB数据时,TCP吞吐量最大,接近为28 Mbit/s,有VPN隧道时,TCP吞吐量为19.4 Mbit/s,减少了接近31%。
分别设置测试环境中带宽为1、10、30、50 M,使用命令iperf来测试UDP传输的性能。其中UDP吞吐量如表2所示。
表2 不同带宽下UDP吞吐量 Mbit·S-1
结果表示,当带宽设置为50 M,没有VPN隧道产生时,UDP吞吐量为29.8 Mbit/s,有VPN隧道时,UDP吞吐量为20.4 Mbit/s,减少量超过31%,而在小于30 M带宽时,UDP吞吐量变化相对较小。
影响VPN隧道产生时TCP和UDP吞吐量的主要因素可能有以下几点:
1) 加密模块加密程序是基于多线程设计的,每次使用都需要打开和关闭加密模块一次,这个步骤会使实际速度不能达到理论的峰值。
2) 根据表2结果分析,吞吐量的变化量和带宽有关系,当带宽为30 M时,吞吐量变化最小。
3) strongSwan程序在运行时也会消耗一定的时间,这样也会影响速率。
此外,用命令iperf测出的UDP抖动时间和UDP丢包率分别如表3、表4所示。
表3 不同带宽下UDP抖动时间 ms
表4 不同带宽下UDP丢包率 %
分析表3、表4结果可知,在VPN隧道产生的情况下,UDP抖动时间在减少,虽然丢包率相比无VPN隧道时有了增加,总体来说,网关运行很稳定。
4 结 语
本文在嵌入式平台下实现VPN网关,对系统内核进行了裁剪,去除了许多不必要的模块,实时性相比于简单的Linux上实现有较大的提高。使用开源软件strongSwan实现IPSec VPN,替换了密码算法,支持了国密标准,可以满足国家安全与经济发展的需求。srongSwan精简了Openswan中IKE协商SA的过程,增强了安全性,提高了使用的便利性。采用硬件加密模块,网关数据加解密、完整性验证过程都由加密模块来完成,实现了端到端的加密,相比于通信链路加密,进一步增强了安全性。根据文献[11]给出的方法测试,网关运行稳定,延时小,基本符合应用需求。在strongSwan算法库和Linux内核中注册国密算法[12]而不是替换国密算法成为下一步工作的重点。
[1] Harkins D,Carrel D.RFC2409:The Internet Key Exch-ange (IKE) [S].1998.
[2] 刘骥宇.IKEv2协议在Linux环境下的实现[D].河南大学,2007.
[3] Kaufman C.RFC4306:Internet Key Exchange (IKEv2) Protocol [S]. 2005.
[4] 王凤领.基于IPSec的VPN技术的应用研究[J].计算机技术与发展,2012,22(9):250-253.
[5] 郑艺斌.基于国密标准的IPSec VPN服务器设计与实现[D].西安电子科技大学,2014.
[6] TI.OMAP-L137 C6000 DSP+ARM Processor Technical Reference Manual[Z]. TI:2013.
[7] 李成龙.基于 USB通信的嵌入式主从机系统设计与应用[D].中南大学,2013.
[8] 杨黎斌,慕德俊.基于硬件加密的嵌入式VPN网关实现[J].计算机工程与应用,2007,43(4):122-124.
[9] KentS.RFC4303:IP Encapsulating Security Payload(ESP) [S].IETF.2005.
[10] Fei C, Wu K, Wei C, et al. The Research and Implementation of the VPN Gateway Based on SSL[C]// Fifth International Conference on Computational and Information Sciences. IEEE, 2013:1376-1379.
[11] Du Meng.Implementation of a Host-to-Host VPN based on UDP tunnel and Open VPN Tap Interface in Java and its performance Analysis[C].International Conference on Computer Science & Education.2013:940-943.
[12] 邓旻昊,汪海航.为IPSec添加新对称加密算法[J].计算机安全,2008,28(1):25-27.
AN IMPLEMENTATION OF IPSEC VPN GATEWAY BASED ON STRONGSWAN
Jiang Hua1,2Li Kangkang2Hu Ronglei1
1(BeijingElectronicsScienceandTechnologyInstitute,Beijing100070,China)2(XidianUniversity,Xi’an710071,Shaanxi,China)
IPSec VPN is a technology using IPSec protocol to implement virtual private network. Aiming at the problem that the application of secret algorithm in network security product is relatively small, a VPN gateway based on the open source IPSec project strongSwan is designed. The gateway replaces strongSwan’s encryption algorithm interface with the SSX0912 encryption chip, which implements the strongSwan support for the state security standard. The modified strongSwan is transplanted to AM335x as the core of the development board in the embedded hardware environment to achieve the IPSec VPN gateway. By setting up the development environment, it is found that the gateway runs stably and has little delay. Compared with the simple Linux system, the hardware encryption module is more secure and the application range is more extensive.
Virtual private network State secret algorithm StrongSwan Embedded
2016-07-20。中央高校基本科研业务费项目(328201502)。蒋华,教授,主研领域:通信与信息安全。李康康,硕士生。胡荣磊,副研究员。
TP393.08
A
10.3969/j.issn.1000-386x.2017.07.016