2015-08-01

NAT traversal

所謂NAT traversal,又叫做NAT穿透。指的是虛擬IP如何直接連線到另一個虛擬IP。在此必須要先了解何謂NAT/虛擬IP/實體IP。

最原始的網路只有實體IP的設計,只要知道對方的IP即可傳送資料給對方。當然對方電腦有無開機,對方電腦收到之後會不會回應,我這邊無法控制。後來上網 人口增多,IP數量不夠用,IP價格也變貴。到最後NAT技術就因應而生。


NAT目的就是讓多台電腦共用一個實體IP。如圖所示,兩台電腦192開頭的IP都是虛擬IP。
在這裡的NAT設備是一台無線AP,有實體IP  114.25.8.46。對外連到伺服器202.43.195.521。

NAT設備所要做的事便是記住內部IP與外部如何對應。
192.168.0.100想要用port 2000傳訊給伺服器202.43.195.521:6000。
會先傳給無線AP,然後無線AP打開port4000對伺服器202.43.195.521:6000通訊。
伺服器回傳給無線AP的實體IP 114.25.8.46:4000。然後無線AP再把資料轉給192.168.0.100 : 2000。

對於NAT設備來講,都會要求內部電腦先對外通訊,NAT設備會開啟一個port,然後外部伺服器的訊息才可以轉發進來。

如果一台電腦,從頭到尾沒有發出任何訊息,外面的人是無法主動通訊的。

對於內部兩台電腦,無線AP會打開兩個不同的port,在此例是4000,5000。

在NAT設備底下,內部電腦無法直接得知NAT的對外IP,對外port。
外部的伺服器也無法知道NAT背後藏了幾台電腦,也無法直接得知每台電腦的虛擬IP。

NAT技術可以節省大量的實體IP,同時NAT可兼做防火牆設備,比較安全。2015目前NAT技術已經到處都在用。
在家裡架設Wifi,手機連上Wifi,會配虛擬IP。
手機4G跟基地台連線,基地台還是配虛擬IP。

但是NAT技術嚴重妨礙到一般電腦的直接通訊。對於p2p影響超大。emule/BT很難用,通常可以連線的點會非常少。
也妨礙到網路電話VOIP使用,兩支手機不能直接連線,很麻煩。

分析一下各種狀況
1.雙方均是實體IP,只要知道對方IP即可通訊。
2.一方實體,一方虛擬。由虛擬IP先發起通訊即可。
3.兩台電腦都是虛擬IP,連到同一台NAT設備。可直接使用虛擬IP通訊。
4.兩台電腦都是虛擬IP,連到不同NAT設備。無法單純直接連線。

本文要探討的便是最麻煩的情況4。此技術就是所謂的NAT traversal。

當然可以用一種最簡單的方法,就是中間利用一台伺服器轉發資料。但是伺服器網路頻寬要錢。更何況網路電話/p2p軟體傳輸資料量大。伺服器錢誰要出?

由於NAT設備的轉發資料規則,並沒有國際規範。完全由廠商自由心證。故這世界上沒有完美的NAT traversal。兩個虛擬IP未必能成功建立連線。

NAT設備的行為大致分成四種。

1.Full cone NAT
NAT設備對於同一台內部電腦,永遠打開同一個port。例如說port 5000。
port打開之後,任何外部的人傳訊到port 5000,都會轉發給同一台內部電腦。

2.Address-Restricted cone NAT
NAT設備對於同一台內部電腦,永遠打開同一個port。例如說port 5000。
內部電腦傳訊給伺服器202.43.195.521:6000。
伺服器202.43.195.521可以用任何port傳訊到NAT設備的port 5000,都會轉發給同一台內部電腦。

3.Port-Restricted cone NAT
NAT設備對於同一台內部電腦,永遠打開同一個port。例如說port 5000。
內部電腦傳訊給伺服器202.43.195.521:6000。
伺服器202.43.195.521只能用自己的port 6000傳訊到NAT設備port 5000,才會轉發給同一台內部電腦。

4.Symmetric NAT
內部電腦對外連線,根據不同伺服器IP,NAT設備會打開不同的port。
例如說:

內部電腦傳訊給伺服器202.43.195.521:6000。
NAT打開port 4000。伺服器回傳資料必須用port 6000回傳給NAT的port 4000,才可正確送達NAT背後的電腦。
內部電腦傳訊給伺服器202.43.195.522:7000。
NAT打開port 5000。伺服器回傳資料必須用port 7000回傳給NAT的port 5000,才可正確送達NAT背後的電腦。

此種情況是最困難的NAT。

電腦連上網路之後,無法直接判斷自己是否在NAT底下。也無法知道NAT的對外IP對外port。必須要跟伺服器通訊,由伺服器告知。而且需要兩台伺服器 幫忙。兩台伺服器需要有不同的IP。

內部電腦定為A,兩台伺服器分別是S1,S2

流程如下:

A傳訊給S1,S1回傳自己看到的IP,port。
A收到後若是IP,port均一致,代表A是實體IP。

A傳訊給S1,要求S1找另一台伺服器(S2)傳訊給A。且S2需用不同的port傳訊。
若A可以收到S2的訊息,代表A在Full cone NAT底下。

A傳訊給S2,S2回傳自己看到的IP,port。
若兩個伺服器回傳的port不一樣,代表A在Symmetric NAT底下。

A傳訊給S1,要求S1用不同的port回傳。
若A收到,代表A在Address-Restricted cone NAT底下。
若收不到,代表A在Port-Restricted cone NAT底下。

NAT traversal基本原理

兩台虛擬IP要直接連線,還是需要伺服器幫忙握手。兩台電腦都連到同一台伺服器。因為伺服器是實體IP,連線到伺服器不成問題。然後伺服器互相告知AB的 對外IP,port。這時候AB都知道對方的IP,port了。

1.使用UDP協定:A發訊息給114.25.8.47:3000。此訊息會在NAT設備B被擋掉。無所謂,此步驟目的是打開NAT A的通道。
2.使用TCP協定:A發訊息給伺服器,告知我已經打開通道。
3.使用TCP協定:伺服器發訊息給B,告知B可以開始傳輸。
4.使用TCP/UDP協定:B發訊息給114.25.8.46:2000

四個步驟全部做完,AB便可直接連線。AB互相連線的時候是傳訊給NAT的對外IP,port。不需要知道對方的虛擬IP。

TCP協定需要三次握手,UDP不用。
與伺服器本來就可以直接連線,可以通通用TCP沒問題。

步驟2因為連不到電腦B,所以一定要用UDP。
步驟4可成功建立連線,故TCP/UDP均可。

此方法對於這三種NAT通通都適用。不論AB分別是哪種NAT,都可用此方法。
Full cone NAT
Address-Restricted cone NAT
Port-Restricted cone NAT

當然聰明的你已經猜到,如果雙方都是Port-Restricted cone NAT這4個步驟才要全部都做。如果是比較寬鬆的兩種NAT。可以省略一些步驟。

再來是最麻煩的Symmetric NAT 。因為Symmetric NAT 的port會變化,必須要猜測下次打開port,猜中才可傳輸。實務上NAT por可能是規律變化,每次都+1而已。所以很好猜!

電腦要與兩台伺服器S1,S2通訊,利用兩台伺服器的回傳訊息,可以知道NAT兩次對外傳訊的對外port,利用這點來猜下次打開port。
服器互相告知AB的對外IP。也互相告知「對方下次打開的port」。

以圖片的範例來看

A傳訊給S1使用port 2000
A傳訊給S2使用port 2001
那A下次會打開2002

B傳訊給S1使用port 3000
B傳訊給S2使用port 3001
那B下次會打開3002

流程如下:
1.使用UDP協定:A發訊息給114.25.8.47:3002。此訊息會在NAT設備B被擋掉。無所謂,此步驟目的是打開NAT A的通道。
2.使用TCP協定:A發訊息給伺服器,告知我已經打開通道。
3.使用TCP協定:伺服器發訊息給B,告知B可以開始傳輸。
4.使用TCP/UDP協定:B發訊息給114.25.8.46:2002

四個步驟是一樣的,只是port有差異而已。

實務上有個變形方法,步驟1,4,沒人規定只能送一次訊息。
步驟1除了送出114.25.8.47:3002,也可以順便猜測一下其他的port,例如說把3002正負500的port都試過一遍。(使用UDP)
步驟4除了送出114.25.8.46:2002,也可以順便猜測一下其他的port,例如說把2002正負500的port都試過一遍。(使用UDP)

當然port只有65535個,如果你不在乎速度很慢,可以全部都試過一遍。

那如果Symmetric NAT的port變化是不規律的,port也猜不到,那就真的沒轍!只能回到最笨的方法,所有資料都利用伺服器轉送。

沒有留言: