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

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

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

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

2.xfrm狀態(tài),存儲在內核的SADB(security association database)中。表示單向流量,包含加密密鑰,標志,請求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 抓包
抓包看兩臺機器之間的ping包,可以發(fā)現(xiàn)ping包已經被加密為ESP報文。
