程序员人生 网站导航

static stateless 2-way NAT on Linux with iptables的应用实例

栏目:服务器时间:2015-01-16 08:07:26
前面几天,我完成了1个static stateless 2-way NAT,写了几篇文章,但是侧重于理论分析,本文来展现1个利用实例。在具体展现实例之前,先说1个static stateless 2-way NAT和Linux原生conntrack NAT的区分,static stateless 2-way NAT其实不会限制连接的数量,由于它不用保护连接状态,也就没有了最大值的限制,其次,如果static stateless 2-way NAT的算法更好些,它的效力会更高。在哈尔滨长春旅游的那些天,我曾想过,能不能用这类stateless的方式实现1个NAPT呢?后来觉得很难,由于在TCP/IP协议层面,1个特定的连接中的5元组是不能产生变化的(UDP协议视情况而定),这就要求NAPT在完成5元组唯1性映照的时候需要辨认出1个连接,这就不再是stateless了,而是stateful了,1个例子就能够说明这类情况,假定连接A的数据包a的5元组被映照到了{sip⑴,dip⑴,tcp,sport⑴,dport⑴},尔后这个连接断开了,问题是如果过去很久以后又有相同5元组的TCP连接来到怎样办呢?解决这个问题的办法就是为1个entry保护1个timer,这样...这样还不如直接用conntrack NAT呢....
       首先给出1个简单的拓扑图:
<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⑵-WAY-NAT --mapaddr 192.168.184.250⑴92.168.184.154 --type src --proto all --mapport 0-0 --dev eth1
-A POSTROUTING -j STATIC⑵-WAY-NAT --mapaddr 1.2.1.2⑴92.168.1.8 --type dst --proto tcp --mapport 12345⑻0 --dev eth0
COMMIT
# Completed on Sun Dec 28 03:23:22 2014
root@abcd:~#
除可以完成配置以外,我保存了1个统计信息,可以看出有多少个数据包和多少个字节经历了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并可以打印数据包的超级详细信息,那是再好不过的了,但是那样会损失大量的时间和空间,所以只能求取舍了。
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐