不猜測埠,UDP協議是否可以穿透symmetric NAT?

關於因為symmetric NAT埠號不同所以難以實現UDP「打洞」我有些無法理解:站在我們的視角看待這個問題是可以解決的——首先A訪問B的公網IP(如圖中紅線所示),因此產生了session埠假設為6001;然後A訪問伺服器S請求S向B下達訪問A的命令(如圖中黑線所示),因此產生另一個session埠假設為6002。在上述過程中A是否可以將6001埠號作為信息放在6002埠的請求中,這樣B就可以知道與A建立連接的準確埠號,那麼就不存在該埠無法為伺服器和對方所知的情況了。

站在我們的視角是可以這樣看待,但是對於網路而言,是否能夠像這樣操作從而實現基於symmetric NAT的UDP「打洞」呢?

參考鏈接:NAT原理與NAT穿越 - comeby - 博客園


我假設你對網路足夠了解並且對NAT穿透有一些基本認識,至少閱讀過相關rfc,否則下面的描述理解會略為困難。

NAT UDP打洞有如下問題。

假設A給B發了一個包,表示為ipA":portA『-&>ipB:portB。ipA":portA"表示內網ip和內網port,也即從A機器網卡出來時的ip和port。ipB和portB是B所對應的公網的ip和port,通常就是B所在NAT設備的IP。一開始你並不知道portB是多少,假設你隨機選擇了一個portB。

1,A訪問B,A前端的NAT把src_port"映射為src_port(6001),這個信息A,B和S都不知道。通常這個包會發到B前端的NAT設備上,並且被B前端的NAT設備丟棄。所以沒人知道6001。如果這個包不被丟棄,並且成功的被B收到,那除非B是一個public類型或者full cone類型或者B打開了NAT設備的upnp。那並非你希望討論的雙symmetric NAT打洞的場景。

2,即便你通過某種方法知道了6001(下面我會說哪些情況下你能知道),那麼你知道了如下信息:由於ipA和ipB是不變的,所以該信息可以表示為portA"(發出的源埠)-&>portB被映射為portA(6001)-&>portB。隨後你可以通過S把6001發給B。這時候B還是無法做太多。因為B必須找到一個portB",並且讓它前端的NAT設備把portB"-&>portA(6001)映射為portB-&>portA。這個通常很難做到。如果B前段的NAT設備是一個port restricted,那麼這很容易做到。但是對於純粹意義上的Symmetric,這很難做到。

3,以上兩個問題從某種程度上來說是一個問題,這個問題就是,通過S的輔助,A怎麼才知道portA"-&>ipB:portB的映射portA?


你可以仔細思考一下3所總結的問題,下面我簡要描述一下在實際環境中的情況。


1,大多數情況下NAT設備並非symmetric,或者雖然是symmetric,但是存在一些額外的特性,這些額外的特性可以幫助你解決問題2。很典型的就是linux。linux的映射演算法是一個port類型,也即,它在選擇portA時不參考portB,只看ipA"和portA"。那麼為什麼兩個linux NAT(例如openwrt)之間的穿越往往難以成功呢?那是因為它還有一個連接跟蹤的防火牆。你可以找一個環境仔細抓包看一下(拿2個openwrt的router,用2根電話線撥號)。你會發現當A先給B發了第一個包之後,B再給A發包,src_port會變化。這是因為第一個包會觸發natB的防火牆模塊,並且在deny列表中增加一項,隨後B給A發包,natB會發現portB已經存在,就會選擇另一個portB2。明白問題之後,要解決就很容易。一開始A給B發包時,你可以設置IP TTL為3,這個數大到足夠通過前端的natA,又小到一定會被中間的某個運營商router丟棄。這樣以來,這個包不會驚動natB的防火牆,同時又建立了natA的埠映射。因此演算法是,S同時通知A,B給對方發送3個TTL=3的包,然後各自等待2s,向對方發送正常TTL的包。另外有些NAT設備雖然是symmetric,但是它有一些可愛的特性,例如same port。也就是說,對於沒有被佔用的埠,它會盡量讓portA==portA",只有portA已經被佔用才開始symmetric的選擇埠。另外還有一些NAT設備的symmetric演算法很簡單,例如我見到過一個設備是這樣的:portA = (portA"+portB"+ipA"+ipB")%65535。對於這些能夠逆向出演算法的設備,都不難穿透。如果兩邊你都掌握了演算法,那麼你就只要解一個方程而已。


2,有些NAT設備的實現有BUG。假設你對外發出了一個TTL=3的包,每通過一個路由器,TTL-=1。到了0之後路由器就會丟棄這個包並且返回一個ICMP。這個ICMP的payload里至少包含了被丟棄包的前28位元組。除了20位元組的ip頭,還包含udp頭。注意這28個位元組里的port是nat設備映射之後的。因此這裡面的src port就是你想要知道的portA』。這個icmp回到natA時,natA會把ipA"修改回ipA,同時portA"修改回portA,最後機器A得到的是ipA:portA-&>ipB":portB"的icmp回應。看上去毫無痕迹了,但是別忘了,還有一個28位元組里還有一個udp checksum。實現正確的NAT設備會同時把這個chksum也還原到原始的chksum,但是某些NAT設備沒有。通過這個chksum,你可以還原出portA『。從而完美解決這個問題。

3,有些NAT設備的映射演算法難以猜到,但是在埠被佔用之後的演算法很簡單,例如就是簡單的不停的+1。那麼這種也是可以利用的,只不過略微麻煩一些。


站在網路的角度,壓根就看不明白你這個NAT是個啥NAT…我們講NAT無非就是一對一靜態或者埠地址轉換PAT一類…

————補充線————

「然後A訪問伺服器S請求S向B下達訪問A的命令(如圖中黑線所示),因此產生另一個session埠假設為6002。」


以我僅有的網路設備上實施NAT的思路回答你一下,S向B訪問,那麼你的B那一端的網關映射怎麼做呢,網路設備的NAT都是有方向性的,A訪問S的時候,是一個隨機埠的源地址轉換,而你要S去訪問B,在我的理解里,你要把B提前映射好,而如果B也是和A一樣只是個NAT後的主機,S是無法直接訪問B的,除非B也去主動訪問S,S在中間做一個翻譯角色


前面有朋友技術上已經講得很明白了,我就從宏觀上談談對NAT穿透的理解。

NAT穿透有一個大的原則:高層協議穿透低層協議。(站得高,看得遠)

怎麼理解呢? NAT可以理解成三層協議,那麼能穿透它的,必然是四層或者四層以上的協議。


比如:基於UPD的 CAPWAP和VXLAN都可以天然穿透NAT(前者效果:AC部署在北京,AP在全國分支都可以)有人可能會問,IPSEC也是三層VPN,為什麼也可以做NAT穿透呢? 有興趣可以去研究一下思科NAT-T,他實質上也是用了UDP封裝,對IPSEC做了改造。


NAT穿透常用的幾張方法:

1. 中間人代理:AB不直接通信,都與公網伺服器S先建立連接,進行通信。伺服器S在整個通信過程中,充當中間人,類似翻譯的效果。(QQ/微信都是這種原理,我們都是先與騰訊伺服器進行通信)


2. 媒人原理:剛開始AB不直接通信,先與媒人S(也就是公網伺服器S)進行通信,後經S介紹,AB認識後,開始直接通信。 (Skype,視頻會議一般都是這種原理)

3. DDNS:黑客常用的捉雞手段,可以自行百度了。


謝邀。

嗯,已經很多年不做技術了,所以一開始都沒搞懂什麼叫做symmetric NAT。

我還是按自己以前對nat的理解來給你解釋下吧:

1、一個基於IP的通信可以理解為一個五元組的全相關:

(協議,源IP,源埠號,目的IP,目的埠號),你這裡的協議是UDP

2、nat的原理:

源端發出的包:(udp,IP_s,Port_s,IP_gd,Port_gd),當這個包經過網關時,網關將之轉換為(udp,IP_gs,Port_gs,IP_gd,Port_gd)然後將這個包發給目的端

同時在自己的nat表中添加一個條目:(內,IP_s,Port_s)=(外,IP_gs,Port_gs)

現在你的問題來了:

1、請問源端發出的包中的目的埠是多少?

按你的描述,你這時並不知道,所以你只能隨便填一個,假定是10000,那麼源端發出的包是(udp,IP_s,Port_s,IP_gd,10000)

2、然後這個包到了自己的網關的時候,網關進行了轉換,但這個6001是網關自己從可用埠中隨便挑選的,源端是怎麼知道的?轉換後的包是(udp,IP_gs,6001,IP_gd,10000)

3、這個包到達B側網關的時候,由於10000並未做固定映射,也就是說B側網關的nat表中沒有這個條目:(內,IP_d,Port_d)=(外,IP_gd,10000),所以B側網關沒辦法將(udp,IP_gs,6001,IP_gd,10000)轉換為(udp,IP_gs,6001,IP_d,Port_d)然後發給目的端,那就只能丟包

4、這種情況下,目的端根本就不知道源端發包給他了,後面還有伺服器什麼事呢

其實你都有一個源目都知道的伺服器了,幹嘛不由伺服器中轉呢?


兩端對稱打穿的概率實在是太低了。訪問另一個IP或埠就會建立一個新的session。
基於這樣的情況,你那個想法幾乎沒辦法實現。之前查過不少資料,聽說生日演算法能夠提高對稱型NAT的打穿概率。可以去了解下。


兩端都是對稱的是不行的,至少有一個是cone才可以。
現在路由器都默認開啟upnp,用upnp多方便。而且,大部分家用路由器都是cone型的。


推薦閱讀:

思科是一家怎樣的公司?
微軟(中國)待遇如何?
研發經理、副經理、產品經理、項目經理都走了,身在這個項目的我,最應該做些什麼?
出口公司會用到哪些軟體或電腦技術?
TCP協議存在那些缺陷?

TAG:信息技術IT | UDP | 計算機網路 | TCPIP | NAT網路地址轉換協議 |