【原理】
內部主機----->私有地址----->NAT----公網(wǎng)地址----->外部主機
就是替換IP報文頭部的地址信息
Network Address Translation,網(wǎng)絡地址轉換,用來將內網(wǎng)地址和端口號轉換成合法的公網(wǎng)地址和端口號,建立一個會話,與公網(wǎng)主機進行通信
NAT外部的主機無法主動跟位于NAT內部的主機通信,NAT內部主機想要通信,必須主動和公網(wǎng)的一個IP通信,路由器負責建立一個映射關系,從而實現(xiàn)數(shù)據(jù)的轉發(fā), 這就是NAT的工作原理。
RFC1918規(guī)定了三個保留地址段落:10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255。這三個范圍分別處于A,B,C類的地址段,不向特定的用戶分配,被IANA作為私有地址保留
- 網(wǎng)絡被分為私網(wǎng)和公網(wǎng)兩個部分,NAT網(wǎng)關設置在私網(wǎng)到公網(wǎng)的路由出口位置,雙向流量必須都要經(jīng)過NAT網(wǎng)關;
- 網(wǎng)絡訪問只能先由私網(wǎng)側發(fā)起,公網(wǎng)無法主動訪問私網(wǎng)主機;
- NAT網(wǎng)關在兩個訪問方向上完成兩次地址的轉換或翻譯,出方向做源信息替換,入方向做目的信息替換;
- NAT網(wǎng)關的存在對通信雙方是保持透明的;
- NAT網(wǎng)關為了實現(xiàn)雙向翻譯的功能,需要維護一張關聯(lián)表,把會話的信息保存下來。
【類別】
NAT(Network Address Translators):稱為基本的NAT,這種轉換的核心是地址而不是端口,基本很少見了
NAPT(Network Address/Port Translators):其實這種才是我們常說的 NAT
【實現(xiàn)方式】
① 靜態(tài)轉換(Static NAT)
將特定的公網(wǎng)地址和端口一對一的映射到特定的私網(wǎng)地址和端口,且每個私網(wǎng)地址都是確定的。
② 動態(tài)轉換(Dynamic Nat)
將內部地址與公網(wǎng)地址一對一的轉換,但是動態(tài)地址是從合法的地址池中動態(tài)的選擇未使用的公網(wǎng)地址,是隨機的;當用戶斷開連接后,再次連接,可能外部地址就會切換成了另一個
③ 端口多路復用(Port address Translation,PAT)
這也算是一種動態(tài)的,將多個內部地址轉換為同一個公網(wǎng)地址,用不同的端口來區(qū)別不同的主機,可以分為圓錐型NAT和對稱性NAT
【NAPT分類】
① 全錐NAT(Full Cone NAT)
一個私有地址(addr)映射到公網(wǎng)地址(addr)后,內部地址(addr)可以收到任意外部主機(host)發(fā)到所映射公網(wǎng)地址(addr)的數(shù)據(jù)報
② 限制性錐NAT(Restricted Cone NAT)
一個私有地址(addr)映射到公網(wǎng)地址(addr)后,只有當內部主機(host)先給該(任意)外部主機(host)發(fā)送數(shù)據(jù)包后,內部主機才能通過(所映射的)公網(wǎng)地址接收到
該(任意)外部主機 發(fā)送到 公網(wǎng)地址的數(shù)據(jù)包(不限端口)[外部主機從任意端口發(fā)送到公網(wǎng)地址的報文將會被轉發(fā)到私網(wǎng)地址]
③ 端口限制性錐NAT(PortRestricted Cone NAT)
這種實現(xiàn)方式與限制性錐NAT類似,只是多了端口的限制。一個私有地址(addr)映射到公網(wǎng)地址(addr)后,內部主機必須先向外部主機發(fā)過數(shù)據(jù)包之后,
外部主機才能夠通過對應的端口發(fā)包到達內部地址(從"哪"進從"哪"出)
④ 對稱NAT (Symmetric NAT)
這種實現(xiàn)方式不同于以上3種,就是不屬于錐NAT(Cone NAT)。當同一臺內部主機使用 相同的 端口與 不同的 外部主機通信時,對稱NAT會重新建立一個會話,為這個會話分配不同的端口;
只有收到報文的外部主機從其對應的端口發(fā)送回應的報文,才能被轉換(從"哪"來回"哪"去)。即使內部主機使用之前用過的地址端口去連接不同外部主機(或端口)時,NAT網(wǎng)關也會建立新的映射關系
【優(yōu)缺點】
① 完美地解決了lP地址不足的問題
② NAT不僅實現(xiàn)地址轉換,同時還起到防火墻的作用,隱藏內部網(wǎng)絡的拓撲結構,有效地避免來自網(wǎng)絡外部的攻擊,因為對于外部主機來說,內部主機是不可見的,
NAT 之內的 PC 聯(lián)機到 Internet 上面時,他所顯示的 IP 是 NAT 主機的公共 IP
③ 也對P2P這種端到端連接的應用造成了困擾
【NAT類型檢測】
前提條件:有一個公網(wǎng)的Server并且綁定了兩個公網(wǎng)IP(IP-1,IP-2)。這個Server做UDP監(jiān)聽(IP-1,Port-1),(IP-2,Port-2)并根據(jù)客戶端的要求進行應答。
第一步:檢測客戶端是否有能力進行UDP通信以及客戶端是否位于NAT后?
客戶端向(IP-1,Port-1)發(fā)送UDP報文,要求服務器返回客戶端的IP和Port。重復若干次,如果每次都超時,則客戶端無法進行UDP通信。
如果服務器返回的客戶端的IP和Port于發(fā)送UDP的localIP和Port相同,則客戶端不在NAT后,否則位于NAT后
第二步:檢測客戶端NAT是否是Full Cone NAT?
客戶端向服務器的(IP-1,Port-1)發(fā)送UDP報文,要求服務器用(IP-2,Port-2)響應客戶端的請求。重復若干次,若每次都超時,則不是Full Cone NAT;否則是
第三步:檢測客戶端NAT是否是Symmetric NAT?
客戶端向服務器(IP-1,Port-1)發(fā)送UDP報文,要求服務器返回客戶端的IP和Port??蛻舳耸褂闷渌鹲ocket向服務器發(fā)送(IP-2,Port-2),要求服務器返回客戶端的IP和Port。
如果兩次返回的IP和Port有一對不一致,則為Symmetric NAT,這樣的客戶端無法進行UDP-P2P通信。否則為限制型NAT
第四步:檢測客戶端NAT是否是Restricted Cone NAT還是Port Restricted Cone NAT?
客戶端向服務器(IP-1,Port-1)發(fā)送UDP報文,要求服務器用(IP-1,Port-x)發(fā)送UDP數(shù)據(jù)包響應。重復若干次,若每次都超時,則是端口限制。否則為限制型錐NAT。
【NAT穿透】
在不同NAT后面的兩個客戶端A和B,如果知道對方的NAT映射后的外網(wǎng)地址,就有可能直接發(fā)送UDP包給對方外網(wǎng)地址進行通訊。
但客戶端不能直接獲取自身的NAT外網(wǎng)地址,解決的辦法就是引入一個服務器S來協(xié)助客戶端獲取自身的外網(wǎng)地址。
NAT的類型有多種,類型兩兩組合有很多種,不是每種組合都可以被穿越的,我們來分析兩個典型的組合。
① 錐型VS錐型
S
A--NAT A(e)====NAT B(e)--B
B發(fā)送數(shù)據(jù)包給S詢問自身地址,S把B的外網(wǎng)地址eB返回給B
S把B的外網(wǎng)地址eB發(fā)送給A
S把A的外網(wǎng)地址eA發(fā)送給B
A發(fā)送數(shù)據(jù)包給eB,B發(fā)送數(shù)據(jù)包給eA,建立P2P通道
② 端口限制錐型 vs 對稱型
【STUN】
Simple Traversal of User Datagram Protocol Through Network Address Translators),即簡單的用UDP穿透NAT,是個輕量級的協(xié)議,是基于UDP的完整的穿透NAT的解決方案
它允許位于NAT(或多重NAT)后的客戶端找出自己的公網(wǎng)地址,
查出自己位于哪種類型的NAT之后以及NAT為某客戶端的一個本地端口所綁定的Internet端端口。這些信息被用來在兩個同時處于NAT路由器之后的主機之間創(chuàng)建UDP通信。
該協(xié)議由RFC 3489定義,RFC 5389 RFC 7350
STUN是一種Client/Server的協(xié)議,也是一種Request/Response的協(xié)議,默認端口號是3478
// 協(xié)議改變
STUN協(xié)議在RFC5389中被重新命名為Session Traversal Utilities for NAT,即NAT會話穿透效用。
在這里,NAT會話穿透效用被定位為一個用于其他解決NAT穿透問題協(xié)議的協(xié)議。它可以用于終端設備檢查由NAT分配給終端的IP地址和端口號。
同時,它也被用來檢查兩個終端之間的連接性,好比是一種維持NAT綁定表項的保活協(xié)議
STUN本身不再是一種完整的NAT穿透解決方案,它相當于是一種NAT穿透解決方案中的工具。這是與RFC3489/STUN版本相比最重要的改變。
RFC5389與RFC3489除了名稱變化外,最大的區(qū)別是支持TCP穿透。
【STUN用途】
① Interactive Connectivity Establishment(ICE)[MMUSIC-ICE],交互式連接建立
② Client-initiated connections for SIP [SIP-OUTBOUND],用于SIP的客戶端初始化連接
③ NAT Behavior Discovery [BEHAVE-NAT],NAT行為發(fā)現(xiàn)
國內免費使用的STUN服務器
stun:stun1.l.google.com:19302
stun:stun2.l.google.com:19302
stun:stun3.l.google.com:19302
stun:stun4.l.google.com:19302
stun:23.21.150.121
stun:stun01.sipphone.com
stun:stun.ekiga.net
stun:stun.fwdnet.net
stun:stun.ideasip.com
stun:stun.iptel.org
stun:stun.rixtelecom.se
stun:stun.schlund.de
stun:stunserver.org
stun:stun.softjoys.com
stun:stun.voiparound.com
stun:stun.voipbuster.com
stun:stun.voipstunt.com
stun:stun.voxgratia.org
stun:stun.xten.com
【TURN】
RFC5766
Traversal Using Relays around NAT(TURN):Relay Extensions to Session Traversal Utilities for NAT(STUN),即使用中繼穿透NAT:STUN的中繼擴展
TURN與STUN的共同點都是通過修改應用層中的私網(wǎng)地址達到NAT穿透的效果,異同點是TURN是通過兩方通訊的“中間人”方式實現(xiàn)穿透。
TURN協(xié)議就是用來允許主機控制中繼的操作并且使用中繼與對端交換數(shù)據(jù)。TURN與其他中繼控制協(xié)議不同的是它能夠允許一個客戶端使用一個中繼地址與多個對端連接。
TURN協(xié)議被設計為ICE的一部分,用于NAT穿越,雖然如此,它也可以在沒有ICE的地方單獨使用。
【ICE】
Interactive Connectivity Establishment(互動式連接建立),由IETF的MMUSIC工作組開發(fā)出來的,它所提供的是一種框架,使各種NAT穿透技術可以實現(xiàn)統(tǒng)一。
ICE跟STUN和TURN不一樣,ICE不是一種協(xié)議,而是一個框架(Framework),它整合了STUN和TURN。
如果A想與B通信,那么其過程如下:
1)A收集所有的IP地址,并找出其中可以從STUN服務器和TURN服務器收到流量的地址;
2)A向STUN服務器發(fā)送一份地址列表,然后按照排序的地址列表向B發(fā)送啟動信息,目的是實現(xiàn)節(jié)點間的通信;
3)B向啟動信息中的每一個地址發(fā)送一條STUN請求;
4)A將第一條接收到的STUN請求的回復信息發(fā)送給B;
5)B接到STUN回復后,從中找出那些可在A和B之間實現(xiàn)通信的地址;
6)利用列表中的排序列最高的地址進一步的設備間通信。
ICE協(xié)議下NAT穿越的實現(xiàn)(STUN&TURN):










