IETF 定義的 Private IP如下:
- Class A:
- 10.0.0.0/8 (255.0.0.0)
- 10.0.0.0 - 10.255.255.255
- Class B:
- 172.16.0.0/12 (255.240.0.0)
- 172.16.0.0 - 172.31.255.255
- Class C:
- 192.168.0.0/16 (255.255.0.0)
- 192.168.0.0 - 192.168.255.255
NAT分類
我們可以依據 NAT的限制方式,將其區分為四種:
- Full cone NAT(one-to-one)
- 只是單純的做位址轉換,並未對進出的封包設限
- Address-Restricted cone NAT
- NAT 對於封包進出稍加限制。從內部送出之封包的目的地 IP 位址會被記住。只有這些曾經收過這些封包的位址可以送封包進入 NAT。由其他位址送進來的封包,都會被檔下。
- Port-Restricted cone NAT
- 對於封包進出比Restricted Cone 增加了一個限制, 從內部送出之封包的目的地的IP 位址及 Port Number 會被記住。 由外部送進來的封包,除了由那些接收過內部所送出 的封包的IP 位址及 Port Number 所送來的封包之外,都會被檔下。
- Symmetric NAT
- 前三種NAT在做位址轉換時,無論封包是送往何處, NAT內部同一內部位址 都對應到同一個外部位址,但在Symmetric NAT內則每一內部位址對不同的目的地, 都對應到不同的外部位址。
- Symmetric NAT只允許先由私有網域內的使用者發送封包到網際網路中的使用者 可以回傳封包
NAT Traversal
NAT問題
穿透NAT方法,基於以下兩個概念
因為 NAT 所加上的限制,兩個皆位於 Private IP 區域內的設備,欲建立連線時,會因為不知道對方的 Public IP Address,而無法正確的建立連線。
穿透NAT方法,基於以下兩個概念
- 位於私有IP區域內的設備,向一個位於公有IP的伺服器,發出請求,請其告知本身的 Public IP Address 與 Port Number。例如:STUN。
- 位於私有IP區域內的設備,向一個位於公有IP的伺服器,發出請求,請其幫忙與欲連線的 peer 建立連線,並且幫忙傳遞所有封包。例如:TURN。
穿透NAT方法原理舉例
現今已發展了許多穿透NAT的方法。如下:
假設A為一台位於內網的 NVR,B是一台位於另一個內網的 IPCAM,NAT_A,NAT_B 分別為兩台設備對外的 NAT設備,Server_C則是一台提供 STUN 服務的伺服器。
Step1.
當 A 想要與 B 建立連線,首先必須先知道自己與對方的 Public Address,所以第一步驟,A先連接Server_C,得到A的Public Address與Port。 此時 NAT_A 上會建立一組 mapping 為
10.0.0.1:4000 <--> 5000 (for Server_C:1111)
Step2.
B連接Server_C,得到B的Public Address與Port。 此時 NAT_B 上會建立一組 mapping 為
10.0.0.2:7000 <-->6000 (for Server_C:1111)
Step3.
A 告知 Server_C,想要與B建立連線。(以NVR為例,可以手動輸入IPCAM對應的 Public Address)
Step4.
C透過NAT_B,告訴B A的Public Address與Port。
Step5.
B 連接 NAT_A,試圖與 A 建立連線,此時因為NAT_A上沒有正確的IP對應關係,因此連線失敗。但藉著此次連線,NAT_B上會新增一個mapping,使得後續NAT_A可以與NAT_B建立連線。 此時 NAT_B 的 mapping 如下
10.0.0.2:7000 <-->6000 (for Server_C:1111)
10.0.0.2:7000 <-->6000 (for NAT_A:5000)
Step6.
B 告知 Server_C,請其通知 A,已經可以開始連線了。
Step7.
Server_C通知 A
Step8.
A(經由140.123.0.1:5000) 連線至 B (經由140.123.0.2:6000),因為此時NAT_B(140.123.0.2) 已經有正確的mapping,10.0.0.2:7000 <-->140.123.0.2:6000 (for 140.123.0.1:5000),所以可以成功建立連線若 NAT 型態為 Symmetric NAT,則 port 會動態改變,所以無法使用STUN來幫助建立連線,例如:step5 建立的mapping可能如下。
10.0.0.2:7000 <-->6000 (for Server_C:1111)
10.0.0.2:7000 <-->6001 (for A:5000)
現今已發展了許多穿透NAT的方法。如下:
- UPnP(Universal Plug and Play)
- STUN(Simple Traversal of UDP Through Netwoek Address Translators)
- TURN(Traversal Using Relay NAT)
- ALG(Application Layer Gatewqy)
- ICE (STUN + TURN)
- Skype method
其他
以下摘錄與NAT有關的名詞解釋
- Hairpin_NAT
- 當一個擁有 public ip 的用戶,要訪問某個位於 NAT 內的伺服器。當進入與離開 NAT 時, IP 位址會分別被 NAT 各轉換一次。
- 當一個位於 NAT 內的用戶,使用public ip 訪問位於同一個 NAT 內的伺服器。當發出Request時, IP 位址只會被轉換一次,而當伺服器發出Response時,因為此時位於同一個網段,因此ip address不會被轉換,此情況會導致錯誤。
- 為了解決此問題,需要更改 routing table,使request/response封包的ip header都會被替換,此種方式稱為 Haripin NAT。
- 這個例子說明得很清楚 http://wiki.mikrotik.com/wiki/Hairpin_NAT
Reference
- http://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment
- STUN - Simple Traversal of User Datagram Protocol (UDP)
- Through Network Address Translators (NATs)
- http://wiki.mikrotik.com/wiki/Hairpin_NAT