為了搞清楚iptables NAT的過程,做了這個實驗。使用了1臺雙網(wǎng)卡服務(wù)器和1臺單網(wǎng)卡服務(wù)器,2個網(wǎng)段。服務(wù)器信息如下:

IP配置信息如下:
服務(wù)器 | 操作系統(tǒng) | 網(wǎng)卡 | IP |
調(diào)度服務(wù)器 | Centos | eth0 | 192.168.18.58 |
eth1 | 192.168.2.90 |
實際服務(wù)器 | Centos | eth0 | 192.168.2.73 |
1. 為了看到調(diào)度服務(wù)器上的數(shù)據(jù)轉(zhuǎn)發(fā)過程,首先在調(diào)度服務(wù)器上分出內(nèi)核的debug日志:
l 在/etc/rsyslog.conf最后增加:kern.debug /var/log/iptables.log
l 重啟日志服務(wù):/etc/init.d/rsyslog restart
2. 啟動調(diào)度服務(wù)器的iptables并清空規(guī)則
service iptables start
iptables -F
3. 增加調(diào)度服務(wù)器的iptables特定日志輸出
假設(shè)要將對調(diào)度服務(wù)器8888端口的訪問轉(zhuǎn)發(fā)給實際服務(wù)器的9999端口處理,在iptables中增加與這2個端口相關(guān)的日志輸出:
iptables -t mangle -A PREROUTING -p tcp --dport 8888 -j LOG --log-level debug --log-prefix "<<<<< PER IN:"
iptables -t mangle -A PREROUTING -p tcp --sport 9999 -j LOG --log-level debug --log-prefix "<<<<< PER IN:"
iptables -t mangle -A POSTROUTING -p tcp --sport 8888 -j LOG --log-level debug --log-prefix ">>>>> POST OUT:"
iptables -t mangle -A POSTROUTING -p tcp --dport 9999 -j LOG --log-level debug --log-prefix ">>>>> POST OUT:"
iptables -t mangle -A POSTROUTING -p tcp --sport 9999 -j LOG --log-level debug --log-prefix ">>>>> POST OUT:"
這時,通過瀏覽器訪問http://192.168.18.58:8888可以看到iptables.log中打印出下面的日志:
Apr 24 16:24:35 route-server1 kernel: <<<<< PER IN:IN=eth0 OUT= MAC=00:1f:c6:cb:eb:e0:00:1f:33:de:29:ad:08:00 SRC=192.168.18.25 DST=192.168.18.58 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=28721 DF PROTO=TCP SPT=50270 DPT=8888 WINDOW=14600 RES=0x00 SYN URGP=0
Apr 24 16:24:35 route-server1 kernel: <<<<< POST OUT:IN= OUT=eth0 SRC=192.168.18.58 DST=192.168.18.25 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=8888 DPT=50270 WINDOW=0 RES=0x00 ACK RST URGP=0
雖然這個端口上即沒有應(yīng)用,也沒有將請求轉(zhuǎn)發(fā)出去,但日志打印出了內(nèi)核獲取到的對這個端口的請求。
4. 配置iptables將對8888的請求轉(zhuǎn)發(fā)到192.168.2.73:9999
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8888 -j DNAT --to-destination 192.168.2.73:9999
訪問http://192.168.18.58:8888,日志中打印如下信息:
Apr 24 16:39:21 route-server1 kernel: <<<<< PER IN:IN=eth0 OUT= MAC=00:1f:c6:cb:eb:e0:00:1f:33:de:29:ad:08:00 SRC=192.168.18.25 DST=192.168.18.58 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=56888 DF PROTO=TCP SPT=50274 DPT=8888 WINDOW=14600 RES=0x00 SYN URGP=0
日志中只打印了從eth0收到的對8888端口的請求,這是因為當(dāng)數(shù)據(jù)要被轉(zhuǎn)發(fā)到192.168.2.73:9999時,默認(rèn)情況下被禁止了。
5. 打開數(shù)據(jù)包轉(zhuǎn)發(fā)功能
echo 1 > /proc/sys/net/ipv4/ip_forward
訪問http://192.168.18.58:8888,日志中打印如下信息:
Apr 24 16:39:21 route-server1 kernel: <<<<< PER IN:IN=eth0 OUT= MAC=00:1f:c6:cb:eb:e0:00:1f:33:de:29:ad:08:00 SRC=192.168.18.25 DST=192.168.18.58 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=56888 DF PROTO=TCP SPT=50274 DPT=8888 WINDOW=14600 RES=0x00 SYN URGP=0
Apr 24 16:39:21 route-server1 kernel: <<<<< POST OUT:IN= OUT=eth1 SRC=192.168.18.25 DST=192.168.2.73 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=56888 DF PROTO=TCP SPT=50274 DPT=9999 WINDOW=14600 RES=0x00 SYN URGP=0
第一條日志顯示從eth0收到了對8888端口的請求,第二條日志顯示iptables已經(jīng)更改了數(shù)據(jù)包的目的地為192.168.2.73:9999,并通過eth1發(fā)出去。
但這時請求雖然已經(jīng)被轉(zhuǎn)發(fā)到實際處理的服務(wù)器,但調(diào)度服務(wù)器收不到響應(yīng),瀏覽器仍在不停重試,日志也在不斷打印。這是因為實際服務(wù)器收到的數(shù)據(jù)包的來源IP是另一個網(wǎng)段的,實際服務(wù)器回復(fù)時,發(fā)現(xiàn)不是本網(wǎng)段的就把數(shù)據(jù)包發(fā)給網(wǎng)關(guān),網(wǎng)關(guān)設(shè)置的是192.168.2.1,這時數(shù)據(jù)就丟了。
6. 將實際服務(wù)器的默認(rèn)網(wǎng)關(guān)設(shè)置為192.168.2.90
在實際服務(wù)器上執(zhí)行以下命令:
route del default
route add default gw 192.168.2.90
再次訪問http://192.168.18.58:8888,日志打印如下信息:
Apr 24 16:47:27 route-server1 kernel: <<<<< PER IN:IN=eth0 OUT= MAC=00:1f:c6:cb:eb:e0:00:1f:33:de:29:ad:08:00 SRC=192.168.18.25 DST=192.168.18.58 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=37000 DF PROTO=TCP SPT=50279 DPT=8888 WINDOW=14600 RES=0x00 SYN URGP=0
Apr 24 16:47:27 route-server1 kernel: <<<<< POST OUT:IN= OUT=eth1 SRC=192.168.18.25 DST=192.168.2.73 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=37000 DF PROTO=TCP SPT=50279 DPT=9999 WINDOW=14600 RES=0x00 SYN URGP=0
Apr 24 16:47:27 route-server1 kernel: <<<<< PER IN:IN=eth1 OUT= MAC=00:22:b0:de:f7:49:00:24:8c:b4:a1:8c:08:00 SRC=192.168.2.73 DST=192.168.18.25 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=9999 DPT=50279 WINDOW=0 RES=0x00 ACK RST URGP=0
Apr 24 16:47:27 route-server1 kernel: <<<<< POST OUT:IN= OUT=eth0 SRC=192.168.2.73 DST=192.168.18.25 LEN=40 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=9999 DPT=50279 WINDOW=0 RES=0x00 ACK RST URGP=0
上面第一條第二條日志和之前一樣,iptables將目地址更改后,通過eth1網(wǎng)卡發(fā)送出去。第三條日志通過eth1網(wǎng)卡接收到了實際服務(wù)器發(fā)送過來的數(shù)據(jù),并在第四條日志中通過eth0發(fā)回請求方。