如何理解NAT使Ipsec更複雜?

在查詢維基百科NAT條目時,發現這條。 一直以為這兩個是兩回事情,不會有什麼關聯呢。IPsec配置不多,這條看得不是很明白。請高手指點

=================

在一百個具有NAT功能的路由器下的主機並沒有建立真正的IP地址,並且不能參與一些網際網路協議。一些需要初始化從外部網路建立的TCP連接和使用無狀態協議,比如UDP的服務將被中斷。除非NAT路由器作一些具體的努力,否則送來的數據包將不能到達正確的目的地址。一些協議有時可以在應用層網關(見下)的輔助下,在參與NAT的主機之間容納一個NAT的實例,比如FTP。NAT也會使安全協議變的複雜,比如IPsec。


無論是維基男科還是維基女科,寫的東西要讓大多數人看的明白,如果看完了更加迷惑了,算不算掉進了盤絲洞?

先來科普什麼是NAT?

NAT,Network Address Translation,網路地址轉換。通俗地說,就是將區域網里普遍使用的私有IP地址,在區域網網路出口路由器上轉換為公網IP,因為只有公網IP才可以在Internet上自由溜達,等溜達完了,回程途徑出口路由器,再將公網IP轉換為私有IP,再繼續在區域網行走,一直走到最原始的主機。

舉例說明:

A(10.1.1.2)----|

B(10.1.1.3) ---|

C(10.1.1.4)---| -GW(1.1.1.1)-Internet -Server 2.2.2.2

A 使用TCP Port 1025 訪問 server TCP 80

B 使用TCP Port 1025 訪問 server TCP 80

C 使用TCP Port 2000 訪問 server TCP 443

Gateway 上的NAT table 如下:

10.1.1.2 + TCP 1025 &<----&> 1.1.1.1 + TCP 1025

10.1.1.3 + TCP 1025 &<----&> 1.1.1.1 + TCP 1026

10.1.1.4 + TCP 2000 &<----&> 1.1.1.1 + TCP 1027

通過以上IP地址+ TCP埠號的映射,Gateway 可以唯一區分任何一個host。

但是用NAT有幾點不足:

1)區域網主機需要主動發起連接

如果host ABC 不主動發起連接,則 NAT table 是空的,外部無法訪問這些只有私網地址的host ABC

2) NAT Table 有超時機制

如果超時,NAT Table 沒有host A 的映射,即使TCP連接是 active 的,server 也無法發數據給 host A。需要host A 周期性發送 keepalive 消息,避免NAT Table超時。

3)NAT通常不轉換 application層的IP地址

這是最致命的,通常NAT只對 IP層 + 傳輸層 做轉換,而不對application 層里嵌入的私有IP 進行轉換。比如 SIP,比如DNS,為了保證這些協議正常工作,需要配置 Application Layer Gateway 來和NAT協同工作,ALG專門負責application 內嵌入的私有IP轉換為公網IP,NAT負責三層、四層的轉換。

談完NAT,才可以談 IP sec,通常IP sec 工作在兩個通道:

控制通道IKE,Internet Key Exchange,工作在IP / UDP 500,這個可以無障礙通過NAT設備

數據通道ESP,Encryption Security Payload,工作在IP/50,因為ESP頭沒有可以像TCP Port一樣可以唯一區分host的欄位,有些NAT設備不支持ESP N:1地址轉換,所以ESP流量無法通過某些NAT路由器。

解決方案:NAT-Transversal

IKE控制協商階段,host會把自己的IP + 埠號 生成一個 hash,附在IKE消息里,到達對方,對方也把接收到的IKE里IP+ 埠號 生成自己的hash,如果兩者相等,則路徑中沒有NAT設備,繼續按照正常的雙通道模式建立IP Sec 隧道。

如果不一致,則說明中間有NAT設備,自動切換到單通道模式,即 IP/UDP 4500,由於控制、數據通道都工作在UDP Port 4500,所以可以無障礙通過NAT路由器。


因為ah和esp模式都不允許改變ip頭


isakmp協商的階段需要使用一個埠號500,這裡是協議預先分配好的,而這個埠號在穿越NAT的時候會發生變化;另一方面,無論是AH封裝還是ESP封裝,都是4層協議類型,而在NAT的時候這些協議編號是不被支持的,所以只能把這些報文也封裝到UDP裡面去,為了區分NAT之後被封裝的報文和普通的未被NAT的500埠報文,isakmp將埠號變更成4500,同時預留SPI編號用於區分ike的報文和ESP/AH的報文。

另一方面,如果使用了傳輸模式的情況下,由於報文的IP發生了變更,導致UDP/TCP的校驗和也會發生變更,但是NAT網關並不能獲知AH校驗的參數,修改checksum後AH的驗證肯定會失敗,所以此處的checksum不能修改,而在解密的時候需要用到原來的IP進行計算,同樣需要修改協議來規避這裡的影響。

具體細節不清楚了,請參考RFC3715 3947 3948


nat和ipsec結合的兩個場景:

第一個是nat網關和ipsec網關在一台設備上,配置上要注意誰先誰後,先做nat,那都去上網了,所以想要匹配ipsec的流量必須做no-nat

第二個是nat網關位於ipsec網關之後,也就是我們俗稱的nat穿越,ah肯定被pass掉,因為會驗證ip頭,esp會加密傳輸層,而napt會修改傳輸層,所以需要進行nat穿越配置協商,具體怎麼解決的隨便找個設備廠商看看案例都有


簡單的講,NAT無論是SNAT還是DNAT都是要修改包頭,改變地址的;IPSec無論是AH還是ESP都是要保證包的完整性,不被篡改的。

原則來講,二者是矛盾的,這裡AH肯定不可以兼容了,這個演算法要計算包頭的。ESP還是可以用的,可以在報文加一個UDP頭,完美。


推薦閱讀:

吳軍博士是一個怎樣的人?
隨身攜帶什麼東西可以標榜你喜歡數學or物理or計算機科學or ... ?
為什麼要開源?
請教高手,這種曲線是什麼曲線,用什麼函數控制?
打了ACM以後對其他課程失去了興趣怎麼辦?

TAG:計算機網路 | 計算機科學 | 網路工程 | IPsec | 如何理解X |