首先给出一个简单的拓扑图:
<client>eth0:192.168.10.1
|
|
eth0:192.168.10.254
<FWD>[NAT BOX]
eth1:192.168.184.254
|
|
eth0:192.168.184.1
<FWD>
eth1:192.168.1.1
|
|
<server>eth0:192.168.1.8
在上面简单的拓扑中,我希望的是在client可以拉取1.2.1.2上的网页,而1.2.1.2是映射到server上的,此外,端口由12345映射到80。这个映射是完全无状态的,用我的static stateless 2-way NAT来完成。
在我还没有做好iptables接口之前,我使用procfs文件系统接口,那个时候还没有dev支持,命令如下:
echo '+1.2.1.2 192.168.1.8 dst tcp port-map 12345 80 ' >/proc/net/static_nat
echo '+192.168.184.250 192.168.184.154 src tcp' >/proc/net/static_nat
后来有了更为方便的iptables接口,事情起了变化,我可以用熟悉的iptables命令来配置了,依然在nat表配置规则:
root@abcd:~# iptables-save
# Generated by iptables-save v1.4.21 on Sun Dec 28 03:23:22 2014
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [1484:204554]
-A PREROUTING -j STATIC-2-WAY-NAT --mapaddr 192.168.184.250-192.168.184.154 --type src --proto all --mapport 0-0 --dev eth1
-A POSTROUTING -j STATIC-2-WAY-NAT --mapaddr 1.2.1.2-192.168.1.8 --type dst --proto tcp --mapport 12345-80 --dev eth0
COMMIT
# Completed on Sun Dec 28 03:23:22 2014
root@abcd:~#
除了可以完成配置之外,我保留了一个统计信息,可以看出有多少个数据包以及多少个字节经历了NAT。统计信息的查看方式如下:
root@abcd:~# cat /proc/net/static_nat Source trans table:
From:192.168.184.250 To:192.168.184.154 [ALL STATIC] [eth1] [Bytes:1080 Packet:23]
From:192.168.1.8 To:1.2.1.2 [TCP AUTO] Port map[From:80 To:12345] [eth0] [Bytes:124 Packet:3]
Destination trans table:
From:1.2.1.2 To:192.168.1.8 [TCP STATIC] Port map[From:12345 To:80 ] [eth0] [Bytes:180 Packet:4]
From:192.168.184.154 To:192.168.184.250 [ALL AUTO] [eth1] [Bytes:5348 Packet:90]
root@abcd:~#
展示统计信息的粒度是很重要的,当然,如果能表示都有哪些数据包经历了NAT并可以打印数据包的超级详细信息,那是再好不过的了,但是那样会损失大量的时间和空间,所以只能求取舍了。
本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1598622