考慮到UDP的無狀態(tài)特性坑鱼,目前針對其的NAT實現(xiàn)大致可分為Full Cone膘流、Restricted Cone、Port Restricted Cone和Symmetric NAT四種。值得指出的是呼股,對于TCP協(xié)議而言耕魄,一般來說,目前NAT中針對TCP的實現(xiàn)基本上是一致的彭谁,其間并不存在太大差異屎开,這是因為TCP協(xié)議本身 便是面向連接的,因此無需考慮網(wǎng)絡(luò)連接無狀態(tài)所帶來復(fù)雜性马靠。
用語定義
- 內(nèi)部Tuple:指內(nèi)部主機(jī)的私有地址和端口號所構(gòu)成的二元組,即內(nèi)部主機(jī)所發(fā)送報文的源地址蔼两、端口所構(gòu)成的二元組
- 外部Tuple:指內(nèi)部Tuple經(jīng)過NAT的源地址/端口轉(zhuǎn)換之后甩鳄,所獲得的外部地址、端口所構(gòu)成的二元組额划,即外部主機(jī)收到經(jīng)NAT轉(zhuǎn)換之后的報文時妙啃,它所看到的該報文的源地址(通常是NAT設(shè)備的地址)和源端口
- 目標(biāo)Tuple:指外部主機(jī)的地址、端口所構(gòu)成的二元組俊戳,即內(nèi)部主機(jī)所發(fā)送報文的目標(biāo)地址揖赴、端口所構(gòu)成的二元組
詳細(xì)釋義
- Full Cone NAT:“全錐形NAT”,所有來自同一 個內(nèi)部Tuple X的請求均被NAT轉(zhuǎn)換至同一個外部Tuple Y抑胎,而不管這些請求是不是屬于同一個應(yīng)用或者是多個應(yīng)用的燥滑。除此之外,當(dāng)X-Y的轉(zhuǎn)換關(guān)系建立之后阿逃,任意外部主機(jī)均可隨時將Y中的地址和端口作為目標(biāo)地址 和目標(biāo)端口铭拧,向內(nèi)部主機(jī)發(fā)送UDP報文,由于對外部請求的來源無任何限制恃锉,因此這種方式雖然足夠簡單搀菩,但卻不那么安全
- Restricted Cone NAT: “限制錐形NAT”,它是Full Cone的受限版本:所有來自同一個內(nèi)部Tuple X的請求均被NAT轉(zhuǎn)換至同一個外部Tuple Y破托,這與Full Cone相同肪跋,但不同的是,只有當(dāng)內(nèi)部主機(jī)曾經(jīng)發(fā)送過報文給外部主機(jī)(假設(shè)其IP地址為Z)后土砂,外部主機(jī)才能以Y中的信息作為目標(biāo)地址和目標(biāo)端口州既,向內(nèi)部 主機(jī)發(fā)送UDP請求報文,這意味著萝映,NAT設(shè)備只向內(nèi)轉(zhuǎn)發(fā)(目標(biāo)地址/端口轉(zhuǎn)換)那些來自于當(dāng)前已知的外部主機(jī)的UDP報文易桃,從而保障了外部請求來源的安 全性
- Port Restricted Cone NAT:“端口限制錐形NAT”,它是Restricted Cone NAT的進(jìn)一步受限版锌俱。只有當(dāng)內(nèi)部主機(jī)曾經(jīng)發(fā)送過報文給外部主機(jī)(假設(shè)其IP地址為Z且端口為P)之后晤郑,外部主機(jī)才能以Y中的信息作為目標(biāo)地址和目標(biāo)端 口,向內(nèi)部主機(jī)發(fā)送UDP報文,同時造寝,其請求報文的源端口必須為P磕洪,這一要求進(jìn)一步強(qiáng)化了對外部報文請求來源的限制,從而較Restrictd Cone更具安全性
- Symmetric NAT:“對稱型NAT”诫龙,這是一種比所有Cone NAT都要更為靈活的轉(zhuǎn)換方式:在Cone NAT中析显,內(nèi)部主機(jī)的內(nèi)部Tuple與外部Tuple的轉(zhuǎn)換映射關(guān)系是獨立于內(nèi)部主機(jī)所發(fā)出的UDP報文中的目標(biāo)地址及端口的,即與目標(biāo)Tuple無關(guān)签赃; 在Symmetric NAT中谷异,目標(biāo)Tuple則成為了NAT設(shè)備建立轉(zhuǎn)換關(guān)系的一個重要考量:只有來自于同一個內(nèi)部Tuple 、且針對同一目標(biāo)Tuple的請求才被NAT轉(zhuǎn)換至同一個外部Tuple锦聊,否則的話歹嘹,NAT將為之分配一個新的外部Tuple;打個比方孔庭,當(dāng)內(nèi)部主機(jī)以相 同的內(nèi)部Tuple對2個不同的目標(biāo)Tuple發(fā)送UDP報文時尺上,此時NAT將會為內(nèi)部主機(jī)分配兩個不同的外部Tuple,并且建立起兩個不同的內(nèi)圆到、外部 Tuple轉(zhuǎn)換關(guān)系怎抛。與此同時,只有接收到了內(nèi)部主機(jī)所發(fā)送的數(shù)據(jù)包的外部主機(jī)才能向內(nèi)部主機(jī)返回UDP報文芽淡,這里對外部返回報文來源的限制是與Port Restricted Cone一致的马绝。不難看出,如果說Full Cone是要求最寬松NAT UDP轉(zhuǎn)換方式挣菲,那么迹淌,Symmetric NAT則是要求最嚴(yán)格的NAT方式,其不僅體現(xiàn)在轉(zhuǎn)換關(guān)系的建立上己单,而且還體現(xiàn)在對外部報文來源的限制方面唉窃。
P2P的NAT研究
第一部分:NAT介紹
第二部分:NAT類型檢測
第一部分: NAT介紹
各種不同類型的NAT(according to RFC)
Full Cone NAT:
內(nèi)網(wǎng)主機(jī)建立一個UDP socket(LocalIP:LocalPort) 第一次使用這個socket給外部主機(jī)發(fā)送數(shù)據(jù)時NAT會給其分配一個公網(wǎng)(PublicIP:PublicPort),以后用這個socket向外面任何主機(jī)發(fā)送數(shù)據(jù)都將使用這對(PublicIP:PublicPort)。此外纹笼,任何外部主機(jī)只要知道這個(PublicIP:PublicPort)就可以發(fā)送數(shù)據(jù)給(PublicIP:PublicPort)纹份,內(nèi)網(wǎng)的主機(jī)就能收到這個數(shù)據(jù)包
Restricted Cone NAT:
內(nèi)網(wǎng)主機(jī)建立一個UDP socket(LocalIP:LocalPort) 第一次使用這個socket給外部主機(jī)發(fā)送數(shù)據(jù)時NAT會給其分配一個公網(wǎng)(PublicIP:PublicPort),以后用這個socket向外面任何主機(jī)發(fā)送數(shù)據(jù)都將使用這對(PublicIP:PublicPort)。此外廷痘,如果任何外部主機(jī)想要發(fā)送數(shù)據(jù)給這個內(nèi)網(wǎng)主機(jī)蔓涧,只要知道這個(PublicIP:PublicPort)并且內(nèi)網(wǎng)主機(jī)之前用這個socket曾向這個外部主機(jī)IP發(fā)送過數(shù)據(jù)。只要滿足這兩個條件笋额,這個外部主機(jī)就可以用自己的(IP,任何端口)發(fā)送數(shù)據(jù)給(PublicIP:PublicPort)元暴,內(nèi)網(wǎng)的主機(jī)就能收到這個數(shù)據(jù)包
Port Restricted Cone NAT:
內(nèi)網(wǎng)主機(jī)建立一個UDP socket(LocalIP:LocalPort) 第一次使用這個socket給外部主機(jī)發(fā)送數(shù)據(jù)時NAT會給其分配一個公網(wǎng)(PublicIP:PublicPort),以后用這個socket向外面任何主機(jī)發(fā)送數(shù)據(jù)都將使用這對(PublicIP:PublicPort)。此外兄猩,如果任何外部主機(jī)想要發(fā)送數(shù)據(jù)給這個內(nèi)網(wǎng)主機(jī)茉盏,只要知道這個(PublicIP:PublicPort)并且內(nèi)網(wǎng)主機(jī)之前用這個socket曾向這個外部主機(jī)(IP,Port)發(fā)送過數(shù)據(jù)鉴未。只要滿足這兩個條件,這個外部主機(jī)就可以用自己的(IP,Port)發(fā)送數(shù)據(jù)給(PublicIP:PublicPort)鸠姨,內(nèi)網(wǎng)的主機(jī)就能收到這個數(shù)據(jù)包
Symmetric NAT:
內(nèi)網(wǎng)主機(jī)建立一個UDP socket(LocalIP,LocalPort),當(dāng)用這個socket第一次發(fā)數(shù)據(jù)給外部主機(jī)1時,NAT為其映射一個(PublicIP-1,Port-1),以后內(nèi)網(wǎng)主機(jī)發(fā)送給外部主機(jī)1的所有數(shù)據(jù)都是用這個(PublicIP-1,Port-1)铜秆,如果內(nèi)網(wǎng)主機(jī)同時用這個socket給外部主機(jī)2發(fā)送數(shù)據(jù),第一次發(fā)送時讶迁,NAT會為其分配一個(PublicIP-2,Port-2), 以后內(nèi)網(wǎng)主機(jī)發(fā)送給外部主機(jī)2的所有數(shù)據(jù)都是用這個(PublicIP-2,Port-2).如果NAT有多于一個公網(wǎng)IP连茧,則PublicIP-1和PublicIP-2可能不同,如果NAT只有一個公網(wǎng)IP,則Port-1和Port-2肯定不同巍糯,也就是說一定不能是PublicIP-1等于 PublicIP-2且Port-1等于Port-2啸驯。此外,如果任何外部主機(jī)想要發(fā)送數(shù)據(jù)給這個內(nèi)網(wǎng)主機(jī)祟峦,那么它首先應(yīng)該收到內(nèi)網(wǎng)主機(jī)發(fā)給他的數(shù)據(jù)罚斗,然后才能往回發(fā)送,否則即使他知道內(nèi)網(wǎng)主機(jī)的一個(PublicIP,Port)也不能發(fā)送數(shù)據(jù)給內(nèi)網(wǎng)主機(jī)搀愧,這種NAT無法實現(xiàn)UDP-P2P通信。
第二部:NAT類型檢測(探針技術(shù))
前提條件:有一個公網(wǎng)的Server并且綁定了兩個公網(wǎng)IP(IP-1,IP-2)疆偿。這個Server做UDP監(jiān)聽(IP-1,Port-1),(IP-2,Port-2)并根據(jù)客戶端的要求進(jìn)行應(yīng)答咱筛。
第一步:檢測客戶端是否有能力進(jìn)行UDP通信以及客戶端是否位于NAT后?
客戶端建立UDP socket然后用這個socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶端的IP和Port, 客戶端發(fā)送請求后立即開始接受數(shù)據(jù)包杆故,要設(shè)定socket Timeout(300ms)迅箩,防止無限堵塞. 重復(fù)這個過程若干次。如果每次都超時处铛,無法接受到服務(wù)器的回應(yīng)饲趋,則說明客戶端無法進(jìn)行UDP通信,可能是防火墻或NAT阻止UDP通信撤蟆,這樣的客戶端也就 不能P2P了(檢測停止)奕塑。
當(dāng)客戶端能夠接收到服務(wù)器的回應(yīng)時,需要把服務(wù)器返回的客戶端(IP,Port)和這個客戶端socket的 (LocalIP家肯,LocalPort)比較龄砰。如果完全相同則客戶端不在NAT后,這樣的客戶端具有公網(wǎng)IP可以直接監(jiān)聽UDP端口接收數(shù)據(jù)進(jìn)行通信(檢 測停止)讨衣。否則客戶端在NAT后要做進(jìn)一步的NAT類型檢測(繼續(xù))换棚。
第二步:檢測客戶端NAT是否是Full Cone NAT?
客戶端建立UDP socket然后用這個socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器用另一對(IP-2,Port-2)響應(yīng)客戶端的請求往回 發(fā)一個數(shù)據(jù)包,客戶端發(fā)送請求后立即開始接受數(shù)據(jù)包反镇,要設(shè)定socket Timeout(300ms)固蚤,防止無限堵塞. 重復(fù)這個過程若干次。如果每次都超時歹茶,無法接受到服務(wù)器的回應(yīng)夕玩,則說明客戶端的NAT不是一個Full Cone NAT你弦,具體類型有待下一步檢測(繼續(xù))。如果能夠接受到服務(wù)器從(IP-2,Port-2)返回的應(yīng)答UDP包风秤,則說明客戶端是一個Full Cone NAT鳖目,這樣的客戶端能夠進(jìn)行UDP-P2P通信(檢測停止)。
第三步:檢測客戶端NAT是否是Symmetric NAT缤弦?
客戶端建立UDP socket然后用這個socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶端的IP和Port, 客戶端發(fā)送請求后立即開始接受數(shù)據(jù)包领迈,要設(shè)定socket Timeout(300ms),防止無限堵塞. 重復(fù)這個過程直到收到回應(yīng)(一定能夠收到碍沐,因為第一步保證了這個客戶端可以進(jìn)行UDP通信)狸捅。
用同樣的方法用一個socket向服務(wù)器的(IP-2,Port-2)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶端的IP和Port。
比 較上面兩個過程從服務(wù)器返回的客戶端(IP,Port),如果兩個過程返回的(IP,Port)有一對不同則說明客戶端為Symmetric NAT累提,這樣的客戶端無法進(jìn)行UDP-P2P通信(檢測停止)尘喝。否則是Restricted Cone NAT,是否為Port Restricted Cone NAT有待檢測(繼續(xù))斋陪。
第四步:檢測客戶端NAT是否是Restricted Cone NAT還是Port Restricted Cone NAT朽褪?
客戶端建立UDP socket然后用這個socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器用IP-1和一個不同于Port-1的端口發(fā)送一個UDP 數(shù)據(jù)包響應(yīng)客戶端, 客戶端發(fā)送請求后立即開始接受數(shù)據(jù)包,要設(shè)定socket Timeout(300ms)无虚,防止無限堵塞. 重復(fù)這個過程若干次。如果每次都超時友题,無法接受到服務(wù)器的回應(yīng),則說明客戶端是一個Port Restricted Cone NAT度宦,如果能夠收到服務(wù)器的響應(yīng)則說明客戶端是一個Restricted Cone NAT。以上兩種NAT都可以進(jìn)行UDP-P2P通信戈抄。
注:以上檢測過程中只說明了可否進(jìn)行UDP-P2P的打洞通信离唬,具體怎么通信一般要借助于Rendezvous Server。另外對于Symmetric NAT不是說完全不能進(jìn)行UDP-P2P達(dá)洞通信划鸽,可以進(jìn)行端口預(yù)測打洞,不過不能保證成功模闲。
上面的NAT類型檢測過程惫霸,實際上是一種常見的NAT穿越技術(shù):探針技術(shù)
葫督,關(guān)于探針技術(shù)STUN和TURN:
所謂探針技術(shù)穗泵,是通過在所有參與通信的實體上安裝探測插件囊拜,以檢測網(wǎng)絡(luò)中是否存在NAT網(wǎng)關(guān)戒幔,并對不同NAT模型實施不同穿越方法的一種技術(shù)访递。
STUN
服務(wù)器被部署在公網(wǎng)上亮航,用于接收來自通信實體的探測請求,服務(wù)器會記錄收到請求的報文地址和端口准给,并填寫到回送的響應(yīng)報文中÷兜客戶端根據(jù)接收到的響應(yīng)消息中記錄的地址和端口與本地選擇的地址和端口進(jìn)行比較钟沛,就能識別出是否存在NAT網(wǎng)關(guān)。如果存在NAT網(wǎng)關(guān)恨统,客戶端會使用之前的地址和端口向服務(wù)器的另外一個IP發(fā)起請求,重復(fù)前面的探測畜埋。然后再比較兩次響應(yīng)返回的結(jié)果判斷出NAT工作的模式。由前述的一對多轉(zhuǎn)換模型得知兔综,除 對稱型NAT 以外的模型狞玛,NAT網(wǎng)關(guān)對內(nèi)部主機(jī)地址端口的映射都是相對固定的涧窒,所以比較容易實現(xiàn)NAT穿越。而 對稱型NAT 為每個連接提供一個映射纠吴,使得轉(zhuǎn)換后的公網(wǎng)地址和端口對不可預(yù)測。
此時戴已,就用到了TURN
轉(zhuǎn)發(fā)服務(wù)器固该,TURN
可以與STUN
綁定實現(xiàn)穿越NAT的服務(wù)糖儡,即在公網(wǎng)服務(wù)器上提供一個“地址端口對”,所有此“地址端口對”接收到的數(shù)據(jù)會經(jīng)由探測建立的連接轉(zhuǎn)發(fā)到內(nèi)網(wǎng)主機(jī)上桦沉。TURN分配的這個映射“地址端口對”會通過STUN響應(yīng)轉(zhuǎn)發(fā)給內(nèi)部主機(jī),后者將此信息放入建立連接的信令中通知通信的對端纯露。這種探針技術(shù)是一種通用方法,不用在NAT設(shè)備上為每種應(yīng)用協(xié)議開發(fā)功能埠褪,相對于ALG方式有一定普遍性浓利。但是TURN中繼服務(wù)會成為通信瓶頸组橄。而且在客戶端中增加探針功能要求每個應(yīng)用都要增加代碼才能支持。
延伸閱讀: