IPSec VPN是目前應(yīng)用最廣泛、最安全的VPN,從個人手機(jī)到平板電腦再到路由器、企業(yè)的防火墻都能輕松的創(chuàng)建IPSec VPN,保護(hù)使用者的數(shù)據(jù)安全防止數(shù)據(jù)被劫持,嗅探,因此掌握IPSec VPN原理以及常見問題排查對于運維及開發(fā)人員來說都至關(guān)重要。本期華云數(shù)據(jù)“智匯華云”專欄將為您奉上IPSec VPN原理介紹與實現(xiàn)。
IPSec全稱是Internet Protocol Security,是由(Internet Engineering Task Force)制定的一組開放的網(wǎng)絡(luò)安全協(xié)議。它并不是一個單獨的協(xié)議,而是一系列為IP網(wǎng)絡(luò)提供安全性的協(xié)議和服務(wù)的集合,主要包括:
1.IKE(Internet Key Exchange 因特網(wǎng)密鑰交換協(xié)議)
2.ESP(encapsulating security payload 封裝安全載荷)
3.AH(Authentication Header 認(rèn)證頭協(xié)議,無法經(jīng)過NAT,基本不使用)
IKE因特網(wǎng)密鑰交換
IKE協(xié)議有v1版本和v2版本,目前我們主要使用v1版本,v1版本是基于UDP500 和4500(NAT使用)端口號的應(yīng)用層協(xié)議。IKE協(xié)議的主要作用是交換IPSec對等體兩端的SA(Security Association),SA一般包括:
1.使用哪種協(xié)議(AH、ESP還是兩者結(jié)合使用)
2.協(xié)議的封裝模式(傳輸模式和隧道模式)
3.認(rèn)證算法(MD5、SHA-1)
4.加密算法(DES、3DES和AES128、aes256)對稱加密,用于加密數(shù)據(jù)
5.pfsgroup(diffie-hellman group)modp1024,modp1536,modp2048非對稱加密,用于安全交換密鑰
6.特定流中保護(hù)數(shù)據(jù)的共享密鑰以及密鑰的生存周期等
IKEv1版本的協(xié)商過程分為兩個階段。

第一階段叫做IKE(ISAKMP) SA,協(xié)商出來的SA給第二階段使用,這一階段又有兩種協(xié)商模式,使用中一般使用主模式,比較安全
main mode,安全,但是要6個數(shù)據(jù)包
aggressive(野蠻模式),只需要4個數(shù)據(jù)包,由于不安全容易被暴力破解,一般不使用
第二階段叫做IPSec SA,協(xié)商出來的SA給用戶數(shù)據(jù)流加密使用
封裝協(xié)議(安全協(xié)議)
IPSec的封裝協(xié)議有兩種:
1.AH(Authentication Header) 認(rèn)證頭協(xié)議,協(xié)議號為51。工作原理是在每一個數(shù)據(jù)包的標(biāo)準(zhǔn)IP報頭后面添加一個AH報文頭,基本不使用。
2.ESP(encapsulating security payload) 封裝安全載荷,協(xié)議號為50。工作原理是在每一個數(shù)據(jù)包的標(biāo)準(zhǔn)IP報頭后面添加一個ESP報文頭,并在數(shù)據(jù)包后面追加一個ESP尾(ESP Tail和ESP Auth data)。
*與AH不同的是,ESP將數(shù)據(jù)中的有效載荷進(jìn)行加密后再封裝到數(shù)據(jù)包中,以保證數(shù)據(jù)的機(jī)密性,但ESP沒有對IP頭的內(nèi)容進(jìn)行保護(hù)。
封裝模式
IPSec的封裝模式也有兩種,實際使用的時候雙方協(xié)商出封裝協(xié)議和封裝模式,一并使用:
1.傳輸模式(host-to-host transport mode),在傳輸模式中,AH頭或ESP頭被插入到IP頭與傳輸層協(xié)議頭之間,保護(hù)TCP/UDP/ICMP負(fù)載。傳輸模式不改變報文頭,基本不使用。

2.隧道模式(tunneling mode ),隧道模式下,AH協(xié)議的完整性驗證范圍為包括新增IP頭在內(nèi)的整個IP報文。ESP協(xié)議驗證報文的完整性檢查部分包括ESP頭、原IP頭、傳輸層協(xié)議頭、數(shù)據(jù)和ESP報尾,但不包括新IP頭,因此ESP協(xié)議無法保證新IP頭的安全。ESP的加密部分包括原IP頭、傳輸層協(xié)議頭、數(shù)據(jù)和ESP報尾。

IPSec實現(xiàn)-控制面
上面講的都是IPSec協(xié)議上的定義和規(guī)范,具體到IPSec在linux系統(tǒng)的實現(xiàn)上主要有各種swan(openswan,strongswan,libreswan),這些應(yīng)用程序負(fù)責(zé)協(xié)商雙方的加密算法,加密方式,隧道模式,路由策略。并通過linux的xfrm內(nèi)核接口調(diào)用下發(fā)到數(shù)據(jù)面中。
IPSec實現(xiàn)-數(shù)據(jù)面
IPSec在Linux上有兩種數(shù)據(jù)面,目前一般使用第二種Linux內(nèi)核的XFRM框架,除非是很老的機(jī)器沒有這個的時候會用第一種:
1.KLIPS ,很古老,2.6版本以前的Linux版本使用。通過創(chuàng)建出虛擬IPSec接口,路由IPSec數(shù)據(jù)包,可以很方便添加firewall規(guī)則。
2.Linux內(nèi)核XFRM/NETKEY(ipsec transform),執(zhí)行具體的轉(zhuǎn)發(fā)策略和封包解包,如果有offload還要執(zhí)行offload提升速度。新版本內(nèi)核也支持創(chuàng)建出虛擬IPSec接口,方便添加firewall規(guī)則。
控制面-Libreswan
這里我們主要講一下libreswan,libreswan是目前使用較多的IPSec控制面實現(xiàn),平常使用中需要掌握libreswan中的pluto和whack命令
1.pluto 命令是IPsec IKE keying守護(hù)進(jìn)程,負(fù)責(zé)自動化ipsec之間的SA協(xié)商。
啟動pluto守護(hù)進(jìn)程命令:ipsec pluto
2.whack命令是用戶和pluto守護(hù)進(jìn)程進(jìn)行交互使用的命令
# 添加一條ipsec連接(vpn1的具體配置寫在文件中)
ipsec whack addconn vpn1 –config ipsec.config
# 允許pluto守護(hù)進(jìn)程開始監(jiān)聽
ipsec whack –listen
# 初始化ipsec連接
ipsec whack –initiate –name vpn1
數(shù)據(jù)面-XFRM
Linux內(nèi)核通過XFRM框架來支持IPSec的數(shù)據(jù)面實現(xiàn),xfrm框架支持Linux的網(wǎng)絡(luò)namespace。
xfrm使用兩個數(shù)據(jù)庫記錄ipsec的數(shù)據(jù)面信息。
1.xfrm策略,存儲在內(nèi)核的SPD(security policy database)中。告訴ipsec哪些流量需要進(jìn)行ipsec處理。

2.xfrm狀態(tài),存儲在內(nèi)核的SADB(security association database)中。表示單向流量,包含加密密鑰,標(biāo)志,請求ID,統(tǒng)計信息等信息。

手動創(chuàng)建ipsec隧道
ip xfrm命令可以手動創(chuàng)建兩臺之間使用ipsec隧道通信,跳過libreswan的控制面SA協(xié)商
192.168.0.6 <=======> 192.168.0.28,腳本如下:
A=192.168.0.6
B=192.168.0.28
ip xfrm state add src $A dst $B proto esp spi 0x00000301 mode tunnel auth md5 0x96358c90783bbfa3d7b196ceabe0536b
enc des3_ede 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df
ip xfrm state add src $B dst $A proto esp spi 0x00000302 mode tunnel auth md5 0x99358c90783bbfa3d7b196ceabe0536b
enc des3_ede 0xffddb555acfd9d77b03ea3843f2653255afe8eb5573965df
ip xfrm policy add src $A dst $B dir out ptype main tmpl src $A dst $B proto esp mode tunnel
ip xfrm policy add src $B dst $A dir in ptype main tmpl src $B dst $A proto esp mode tunnel
ip xfrm state add src $A dst $B proto esp spi 0x00000301 mode tunnel auth md5 0x96358c90783bbfa3d7b196ceabe0536b
enc des3_ede 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df
ip xfrm state add src $B dst $A proto esp spi 0x00000302 mode tunnel auth md5 0x99358c90783bbfa3d7b196ceabe0536b
enc des3_ede 0xffddb555acfd9d77b03ea3843f2653255afe8eb5573965df
ip xfrm policy add src $A dst $B dir in ptype main tmpl src $A dst $B proto esp mode tunnel
ip xfrm policy add src $B dst $A dir out ptype main tmpl src $B dst $A proto esp mode tunnel
tcpdump 抓包
抓包看兩臺機(jī)器之間的ping包,可以發(fā)現(xiàn)ping包已經(jīng)被加密為ESP報文。
