部署IPSec VPN網(wǎng)絡(luò)時(shí),如果發(fā)起者位于一個(gè)私網(wǎng)內(nèi)部(也就是IPSec的一個(gè)端點(diǎn)接口的IP地址是私網(wǎng)IP地址,如圖1中的Router A),遠(yuǎn)端位于公網(wǎng)側(cè)(如圖1中的Router B),而它希望與遠(yuǎn)端響應(yīng)者直接建立一條IPSec隧道。為保證存在NAT設(shè)備的IPSec隧道能夠正常建立,就需要配置IPSec的NAT穿越功能。
圖1 IPSec的NAT穿越示意
因?yàn)锳H協(xié)議會(huì)對(duì)整個(gè)封裝后的IP報(bào)文(包括IP報(bào)頭)進(jìn)行認(rèn)證保護(hù),如果AH報(bào)文經(jīng)過NAT網(wǎng)關(guān),則報(bào)頭部分的IP地址肯定會(huì)發(fā)生變化,這時(shí)傳輸?shù)竭_(dá)IPSec隧道對(duì)端時(shí),肯定不能通過AH認(rèn)證,所以IPSec采用AH作為安全協(xié)議時(shí)是不支持NAT的。但是ESP協(xié)議與AH協(xié)議不同,它無論是對(duì)IP報(bào)文進(jìn)行認(rèn)證保護(hù),還是進(jìn)行加密保護(hù)都不會(huì)包括最外層IP報(bào)頭,所以ESP報(bào)文經(jīng)過NAT網(wǎng)關(guān)時(shí)IP報(bào)頭部分發(fā)生IP地址改變不會(huì)導(dǎo)致在對(duì)端進(jìn)行ESP認(rèn)證、數(shù)據(jù)解密時(shí)失敗,所以理論上來說采用ESP作為安全協(xié)議時(shí)是支持NAT的。
但是這里又涉及到一個(gè)非?,F(xiàn)實(shí)的問題,無論是AH(IP協(xié)議號(hào)為51),還是ESP(IP協(xié)議號(hào)為50)協(xié)議其都是網(wǎng)絡(luò)層的協(xié)議,它們發(fā)送的報(bào)文不會(huì)經(jīng)過上面的傳輸層協(xié)議封裝。因此當(dāng)NAT網(wǎng)關(guān)背后存在多個(gè)ESP應(yīng)用端時(shí)(即實(shí)現(xiàn)多對(duì)一的地址映射時(shí)),也無法只根據(jù)IP地址進(jìn)行反向映射,必須依靠傳輸層的UDP或TCP端口號(hào)。此處通過借用UDP的方式,巧妙地實(shí)現(xiàn)了NAT地址復(fù)用。此時(shí)要使用UDP 500端口(IKE協(xié)商協(xié)議ISAKMP所使用端口)來插入一個(gè)新的UDP報(bào)頭。
IPSec NAT穿越簡單來說就是在原報(bào)文的IP報(bào)頭和ESP報(bào)頭間增加一個(gè)標(biāo)準(zhǔn)的UDP報(bào)頭。這樣,當(dāng)ESP報(bào)文穿越NAT網(wǎng)關(guān)時(shí),NAT對(duì)該報(bào)文的外層IP報(bào)頭和增加的UDP報(bào)頭同時(shí)進(jìn)行地址和端口號(hào)轉(zhuǎn)換(把私網(wǎng)IP地址、端口號(hào)都轉(zhuǎn)換成公網(wǎng));轉(zhuǎn)換后的報(bào)文到達(dá)IPSec隧道對(duì)端后,與普通IPSec報(bào)文處理方式相同。
在IPSec NAT穿越應(yīng)用中,如果采用的是預(yù)共享密鑰或數(shù)字證書認(rèn)證方法,則要同時(shí)在部署了NAT網(wǎng)關(guān)設(shè)備的這端IKE對(duì)等體配置中采用名稱類型標(biāo)識(shí)ID(即配置local-id-type fqdn命令),在發(fā)起方的IKE對(duì)等體配置中采用IP地址方式標(biāo)識(shí)對(duì)端ID。