2013年1月8日 星期二

NAT -- 基本概念

NAT (Network Address Translation) 是用來解決IPv4位址不足的一個方法,當IP封包通過路由器或防火牆時,建立一個Private IP與Public IP的對應表格,並且重寫封包內的源IP地址或/和目的IP地址的技術。這種技術被普遍使用在有多台主機但只通過一個公有IP位址訪問網際網路的私有網路中。

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 NATone-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 所加上的限制,兩個皆位於 Private IP 區域內的設備,欲建立連線時,會因為不知道對方的 Public IP Address,而無法正確的建立連線。

穿透NAT方法,基於以下兩個概念
  • 位於私有IP區域內的設備,向一個位於公有IP的伺服器,發出請求,請其告知本身的 Public IP Address 與  Port Number。例如:STUN。
  • 位於私有IP區域內的設備,向一個位於公有IP的伺服器,發出請求,請其幫忙與欲連線的 peer 建立連線,並且幫忙傳遞所有封包。例如:TURN。

穿透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
其運作方式可參考 http://www.cs.nccu.edu.tw/~lien/Writing/NGN/firewall.htm


其他

以下摘錄與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