2013年12月16日 星期一

NAT Router 架設實驗記錄

以下將架設 NAT router 的過程作一記錄。

1. 首先準備一台有兩張網卡的電腦。
最方便的作法便是直接拿台Notebook,同時有wired與wireless。

2. 安裝軟體
先安裝 VM (此處我使用VirtualBox),並在 VM上安裝 ubuntu 12.04,接著要針對此 VM 分別新增兩張網路卡,一個與內網溝通,一張與 Internet溝通。網路的配置如下:



 
3. 設定 ubuntu 的 routing table
在有兩張網卡的 ubuntu 中,預設便會針對這兩張網卡建立 routing table,但是此時的 routing table 可能無法正常作用,需要修改才能使得網路如預期的方式進行 routing 
以我的測試環境環境,LinuxRouter 的 routint table 如下 :(可使用 "./route -n" 指令檢視 ) 
Kernel IP routing table
Destination     Gateway             Genmask           Flags Metric Ref    Use Iface
0.0.0.0          172.20.10.1       0.0.0.0              UG    0        0        0 eth1
169.254.0.0   0.0.0.0              255.255.0.0       U     1000   0        0 eth0
192.168.0.0   192.168.0.200   255.255.255.0   UG    0        0        0 eth0
172.20.10.0   0.0.0.0              255.255.255.0   U      1        0        0 eth1   
此時在 NATRouter 分別 ping 192.168.0.169 與 172.20.10.6 應該都要可以成功。

4. 設定 NAT 功能
  • 首先需啟動 ip forward 功能
$ vi /etc/sysctl.conf
   net.ipv4.ip_forward = 1
$ sysctl -p 
  • 接著使用 iptables 設定所需要的 NAT 類型,
為了方便說明,設定幾個變數如下: 
EXNIC="eth0" 表示 interface to internet
INNIC="eth1" 表示 interface to lan
EXIP = 42.74.185.215  (public ip address of NAT router)
INIP  = 192.168.1.1     (private ip address of NAT router)
CLIENTIP="192.168.0.0/24" 
各種 NTA 設定方式如下:
/-"Full Cone NAT":/
iptables -t nat -A POSTROUTING -o $EXNIC -j SNAT --to-source $EXIP
iptables -t nat -A PREROUTING -i $EXNIC -j DNAT --to-destination $CLIENTIP 
/-"Port Restricted Cone NAT":/
iptables -t nat -A POSTROUTING -o $EXNIC -j SNAT --to-source $EXIP 
/-"Restricted Cone NAT", assume only 107.23.105.92 is permitted :/
iptables -t nat -A POSTROUTING -o $EXNIC -j SNAT --to-source $EXIP
iptables -t nat -A PREROUTING -i 
$EXNIC -j DNAT --to-destination $CLIENTIP
iptables -I -FORWARD 1 -i $EXTNIC ! -s 168.95.1.1 -j DROP
iptables -I FORWARD 1 -i $EXTIF -s 107.23.105.92/32 -j ACCEPT
/-"Symmetric NAT":/
iptables -t nat -A POSTROUTING -o $EXNIC -j MASQUERADE --random
可將上述設定寫成 Script,以方便切換為不同的 NAT 類型,方便測試。

5. 使用 stund 程式,測試是否 NAT 已經設定成功。
  • 先至 http://sourceforge.net/projects/stun/ 下載 stun 程式,並編譯為執行檔。
  • 首先在 NATRouter 先執行 ./client stun.stunprotocol.org,確認 LinuxRouter 的對外網路屬於一個 Open Internet 或是屬於 Full-Cone NAT。若此時屬於其他 NAT,則接下來的實驗結果便會受到此NAT的限制,而產生不同的測試結果。根據 stun 測試結果,可判斷NAT種類,其判斷依據如下。
  • "Independent Mapping, Independent Filter" = Full Cone NAT
  • "Independedt Mapping, Address Dependendent Filter" = Restricted Core NAT
  • "Indepndent Mapping, Port Dependent Filter" = Port Restricted Core NAT
  • "Dependent Mapping" = Symmetric NAT
  • 將 NATRouter 設定為不同種類的 NAT,並在 Client 端執行 stun 判斷 NAT type 是否設定成功。 可參考這裡以檢視四種 NA的測試結果
6. 問題
對於"Restricted Cone NAT"的設定方式,現在使用固定的 ip 進行限制。正確做法應該是透過 iptables 的 "-m recent","-m state"或是 "-m conntrack" 進行判斷,但目前仍未測試成功。


7. 若 iptables 所設定的 NAT 不符合需求,可以考慮直接購買支援不同類型 NAT 的機器。
這裡提供了一份各種機器的 NAT 測試報告 http://tools.ietf.org/html/draft-jennings-behave-test-results-04

參考資料
  1. Iptables 指南 1.1.19
  2. Passive FTP 設定方式
  3. Linux 上多條對外連線(Multi-Path)實作
  4. 利用raw表实现iptables调试 (重要)
  5. netfilter-extensions-HOWTO.a4.pdf
  6. 洞悉Linux下的 Netfilter & iptables