一、IPSec协议简介
IPSec
是IETF
制定的为保证在Internet
上传送数据的安全保密性能的三层隧道加密协议。IPSec
是应用于IP
层上网络数据安全的一整套体系结构,他包括报文首部认证协议( Authentication Header, AH)
、封装安全载荷协议(Encapsulating Security Payload, ESP)
、互联网间密钥交换协议(Internet Key Exchange, IKE)
和一些用于网络认证及加密的算法等。IPSec
协议本身定义了如何在IP
数据包中增加字段来保证IP
包的完整性、私有性和真实性,以及如何加密数据包。
IPSec
有传输(transport)
和隧道(tunnel)
两种工作方式,其中,传输模式适用于主机之间建立IPSec
安全传输,隧道模式更适合网关之间的通信,常用来实现虚拟专用网VPN
。
二、IPSec-VPN搭建
详细教程请参考:https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/README-zh.md
以 Ubuntu 16.04
为例,首先执行:
1 | wget https://git.io/vpnsetup -O vpnsetup.sh |
之后,在vpnsetup.sh
文件中,设置YOUR_IPSEC_PSK, YOUR_USERNAME 和 YOUR_PASSWORD
三个字段,如下图:
最后,通过命令 sudo sh vpnsetup.sh
启动服务器的 ipsec vpn
服务。接下来,就是客户端的配置,以安卓手机为例:
选择对应的 VPN
添加类型,其中IPSec Xauth
类型也称 Cisco IPsec
模式,更加高效一些。填写好服务器地址、预共享密钥(PSK)
、用户名和密码后,即可使用该 VPN
,如果服务器在香港或国外的话,即可实现翻墙
的功能。
三、IPSec
协议解析
IPSec
主要包括两部分协议,分别是 ISAKMP
协议和 ESP
协议,可使用wireshark
采集以上两种协议的报文。
(1) ISAKMP
协议
第一阶段,通信双方彼此间建立一个已通过身份认证和安全保护的通道,即建立一个
ISAKMP SA
。第一阶段有主模式(Main Mode)
和野蛮模式(Aggressive Mode)
两种IKE
交换方法。第二阶段,使用在第一阶段建立的安全隧道为
IPsec
协商安全服务,即为IPsec
协商具体的SA
,建立用于最终的IP
数据安全传输的IPsec SA
。
第一阶段的主模式交换过程:
对应的数据包为点我下载:
- 消息①和②用于策略交换(包为明文)
发起方发送一个或多个
IKE
安全提议,响应方查找最先匹配的IKE
安全提议,并将这个IKE
安全提议回应给发起方。匹配的原则为协商双方具有相同的加密算法、认证算法、认证方法和Diffie-Hellman
组标识。
- 消息③和④用于密钥信息交换(包为明文)
双方交换
Diffie-Hellman
公共值和nonce
值,用于IKE SA
的认证和加密密钥在这个阶段产生。
- 消息⑤和⑥用于身份和认证信息交换(包为密文)
双方使用生成的密钥发送信息,双方进行身份认证和对整个主模式交换内容的认证。
第二阶段的IPSEC SA
协商:
上图中的 8、9、10 号包使用快速模式,进行IPSec SA
的协商。
最后的 11、12、13、14
号数据包为断开连接。
(2) ESP
协议
因为 IPSec
协议要求通信双方建立单工的安全联盟,所以两个SPI
分别标识了两个方向的通信报文。
四、IPSec穿越NAT
IPSec VPN
中标准身份标识是IP
地址,NAT
处理过程中会改变IP
地址,因此IPSec
的身份确认机制必须能够适应IP
地址变化。IPSec
的身份确认最常见是通过IKE
协议代劳,IKE
支持的身份认证机制有两种:
数字证书方式,通过CA数字证书体系确认身份,是最为安全、可靠的方式。
身份标识+预共享密钥方式,通过发起方和响应方预先配置相同的密钥,完成双方对彼此身份的认证,这是最为常见的方式。在预共享秘密钥认证机制中,身份标识则可以分为几类:
指定
IP
地址,使用IP
地址作为身份标识,是IKE
的默认方式,响应方只允许指定IP
地址发起协商,安全性比较高。指定
IP
地址范围,这种方式依然使用IP
地址作为身份标识,由于发起方必须要指定IP
地址,否则无法发起协商,指定IP
地址范围是响应方特性,如响应方可以指定2.0.0.0/8
范围内的地址都可以发起协商,而不是只允许2.1.1.2
发起协商,能够减少配置,但安全性略有下降。什么都不指定,也是使用IP地址作为身份标识,但允许任意IP地址发起协商,只要预共享密钥一致,双方就能够通过身份确认,这种方式虽然不是非常安全,但是可以简化配置,安全性再次下降;
指定对端名字,发起方和响应方都预先配置好本端名字,使用该名字作为身份标识,与指定
IP
地址类似,通过指定对端名字方式,即使双方预共享密钥一致,只要对端名字不合法,立即中断协商,由于名字未与IP
地址进行绑定,而且名字在网络中明文传递,故安全性不如指定IP
地址方式高,但这种身份标识方式可以穿NAT
。
具体过程如下:
1、开启NAT
穿越时,协商第一阶段的前两个消息会发送标识NAT
穿越(NAT Traversal
,简称NAT-T
)能力的Vendor ID
载荷。用于检查通信双方是否支持NAT-T
。
当双方都在各自的消息中包含了该载荷时,才会进行相关的NAT-T
协商。
2、主模式消息3和消息4中发送NAT-D(NAT Discovery)
载荷。NAT-D
载荷用于探测两个要建立IPSec
隧道的网关之间是否存在NAT
网关以及NAT
网关的位置。
通过协商双方向对端发送源和目的的IP
地址与端口的Hash
值,就可以检测到地址和端口在传输过程中是否发生变化。若果协商双方计算出来的Hash
值与它收到的Hash
值一样,则表示它们之间没有NAT
。否则,则说明传输过程中对IP
或端口进行了NAT
转换。
第一个NAT-D
载荷为对端IP
和端口的Hash
值,第二个NAT-D载
荷为本端IP
和端口的Hash
值。
3、发现NAT
网关后,后续ISAKMP
消息的端口号转换为4500。ISAKMP
报文标识了“Non-ESP Marker”
。
4、在第二阶段会启用NAT
穿越协商。在IKE
中增加了两种IPSec
报文封装模式:UDP
封装隧道模式报文(UDP-Encapsulated-Tunnel
)和UDP
封装传输模式报文(UDP-Encapsulated-Transport
)。通过为ESP
报文封装UDP
头,当封装后的报文通过NAT
设备时,NAT
设备对该报文的外层IP
头和增加的UDP
头进行地址和端口号转换。UDP
报文端口号修改为4500
。
五、IPSec
协议流量特征分析
在上图 4.14 (a) 中,IPSec
流量与原始流量几乎完全重合,这符合ESP
协议的特性,即一一对应,一条ESP
报文封装一条原始报文,然后进行转发。折线的重合说明IPSec
不会对原始流量进行分片等操作,且自身不会产生大量与传输内容无关的流量,它在得到一条原始报文后,仅对其进行加密并加上IPSec
头部,然后忠实地发送到目的地。
在上图 4.14 (b) 中,IPSec
流量与原始流量基本重合,但是IPSec
流量的字节数到达速率在每个峰值处均比原始流量高。这说明IPSec
每条报文的大小都要大于原始报文,这符合IPSec
协议的封装特征。加密与完整性保护会产生额外的数据开销,同时无论在隧道模式还是传输模式下,IPSec
协议都会对报文进行重新封装,再加上额外的头部,使得讲IPSec
处理后的报文数据量大于原始报文。
在上图 4.15 (a) 中,不论是IPSec
流量还是原始流量,其报文大小分布都是U
形,即报文大小多集中在0--200
字节与1400--1500
字节之间,尤其是1400--1500
的部分,而200--1400
字节的报文数量明显较少。U
形分布原因有以下几点:1、有大量数据正在传输;2、网络状况理想,TCP
链路极少堵塞,可以持续以较大的发送窗口传输数据;3、左边部分为大量的ACK
报文与相关协议的控制报文,以及数据量较小的报文。然后再对比IPSec
流量与原始流量,可以观察到其报文大小分布模式及其相似,原始流量相较IPSec
流量整体左偏,说明原始流量的报文教IPSec
流量较小,这和折线图的结论一致。
在上图 4.15 (b) 中,可以看到横坐标的报文到达时间间隔范围较大。这与流量采集的方法与环境相关,偶发性的网络阻塞,可能瞬间将报文到达时间间隔提升到千毫秒级。当然,还有很多原因会导致报文到达时间间隔发生异常,因此,报文到达时间间隔时间是一种很不稳定的特征。从图中还可以看到,大部分的到达间隔时间极小,且IPSec
流量和原始流量的到达间隔时间分布及其相似。