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