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的測試結果
對於"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
參考資料