一:為什么需要NAT
由于IP地址隨著互聯網的發展而逐漸稀缺,難以使得每臺主機都擁有一個公網上的IP地址,且并不是所有主機都需要一個公網上的地址,于是就有了NAT技術。NAT(The IP Network Address Translator)網絡地址轉換,其基本工作原理是:當私有網主機與公共網逐漸通信的IP經過NAT網關時,將IP包中的源IP或目的IP在私有IP和NAT的公共IP之間進行轉換。
假設NAT網關有2個網絡端口,其中公共網絡端口的IP地址是統一分配的公共IP,為202.204.65.2;私有網絡端口的IP地址是保留地址,為192.168.1.1。私有網中的主機 192.168.1.2向公共網中的主機166.111.80.200發送了1個IP包(Des=166.111.80.200,Src=192.168.1.2)。
當IP包經過NAT網關時,NAT會將IP包的源IP轉換為NAT的公共 IP并轉發到公共網,此時IP包(Des=166.111.80.200,Src=202.204.65.2)中已經不含任何私有網IP的信息。由于IP 包的源IP已經被轉換成NAT的公共IP,響應的IP包(Des=202.204.65.2,Src=166.111.80.200)將被發送到NAT。 這時,NAT會將IP包的目的IP轉換成私有網中主機的IP,然后將IP包(Des=192.168.1.2,Src=166.111.80.200)轉 發到私有網。對于通信雙方而言,這種地址的轉換過程是完全透明的。
二、NAT類型
(一)Full-cone NAT:
一旦一個內網地址 (iAddr:iPort) 被映射到一個外部地址 (eAddr:ePort), 來自 iAddr:iPort 的任何數據包將通過 eAddr:ePort 發送。
任何外部主機能夠通過eAdder:ePort這個地址發送數據包到iAddr:iPort
(二)Address-restricted-cone NAT:
一旦一個內網地址(iAdder:iPort)被映射到一個外部地址(eAddr:ePort),來自iAddr:iPort的任何數據包將通過eAddr:ePort發送。
僅只有接收到主機(iAddr:iPort)通過eAddr:ePort發送的數據包的外部主機通過該主機的任何端口發送到eAddr:ePort的數據包才能夠被正確的轉發到iAddr:iPort.也就是說主機有關端口無關
(三)Port-restricted cone NAT
類似于address restricted cone NAT, 但是端口號有限制.一旦一個內網地址 (iAddr:iPort) 被映射到一個外部地址 (eAddr:ePort), 來自 iAddr:iPort 的任何數據包將通過 eAddr:ePort 發送.
僅只有接收到主機(iAddr:iPort)通過eAddr:ePort發送的數據包的外部主機通過該主機的相同端口發送到eAddr:ePort的數據包才能夠被正確的轉發到iAddr:iPort.
(四)Symmetric NAT
來自相同內部ip和port發送到相同目的地ip和port的請求被映射到唯一的外部ip和port地址;如果相同的內部主機采用相同的ip和port地址發送到不同的目的地,那么重新分配映射地址。只有先前收到內部主機發送包的外部主機才能夠發送返回包到內部主機。
針對前面三種NAT類型,只要通信雙方彼此知道對方的內部地址和外部地址的映射關系,然后通過UDP打洞的方式就可以建立相互連接的通信;但是第四種也就是Symmetric NAT的話由于每次向不同目的地發送數據包時采用不同的外部地址,也就沒辦法通過直接的方式建立P2P連接。
三:為什么要做NAT穿透:
我們知道在日常的互聯網交互中,所有的信息流必須要通過NAT,經過服務器,而這對服務器的壓力可想而知。這時就有人提出,我們能不能不從服務器經過,直接對兩個端口進行連接。這樣不僅能減輕服務器壓力,也可以節省大量的流量。這時發現,之前幫助端口實現“溝通”的NAT現在成了直接連接的阻力。NAT穿透是實現P2P所需的基礎。
四:如何做NAT穿透:
NAT穿透目前主要有:ALG、MII3COM、STUN、TURN、ICE和Full Proxy等6種方式,這里主要介紹一下ICE方式:
ICE是一種NAT穿透技術,通過offer/answer模型建立基于UDP的媒介流。ICE是offer/answer模型的擴展,通過在offer和answer的SDP里面包含的IP地址和端口,然后對本地SDP和遠程SDP里面的IP地址進行配對,然后通過P2P連通性檢查進行連通性測試工作,如果測試通過即表明該傳輸地址對可以建立連接。其中IP地址和端口有以下幾種:本機地址、通過STUN服務器反射后獲取的server-reflexive地址(內網地址被NAT映射后的地址)、relayed地址(和TURN轉發服務器相對應的地址)及Peer reflexive地址等。
在通常的ICE部署環境中,我們有兩個端想要建立通信連接,他們可以直接通過signaling服務器(如SIP服務器)執行offer/answer過程來交換SDP消息。
在ICE過程開始的時候,客服端會忽略他們各自的網絡拓撲結構,不管是不是在NAT或多個NAT后面,ICE允許客服端發現他們所在網絡的拓撲結構的信息,然后找出一個或更多可以建立通信連接的路徑。