话说,DNAT用于公网计算机访问内网的服务器所用。
所SNAT用来做甚?
设想一种情形 :
图2.
I-------S_L
I
internet ---G_W===G_L---I 交换机
S_W---- I
I-------C_L
|
当我们内网的机器C_L要访问S_W时的情景。
C_L发出数据包:
src:C_L:xx
dst:S_W:80
如果G不对此数据包做处理,直接交给了S_W;
S_W回复数据包时的目的地址会是一个内网地址。。
所以,G会将数据包的源src替换成G_W:xxx
这样数据包才能从S_W处返回。
注意,src的替换是在POSTROUTING中完成的。
当数据包从S_W返回后在G中须得做一次un-SNAT将数据包的目标地址换成C_L,才能完成数据包的交付。
所谓的un-SNAT,就是指DNAT,它是在POSTROUTING中完成的。。
数据包变化如下:
SNAT
src:G_W:xxx
dst:S_W:80
返回
src:S_W:80
dst:G_W:xxx
un-SNAT
src:S_W:80
dst:C_L:xx
至此完成内网的机器C_L对S_W的访问。
iptables -t nat -A POSTROUTING -p tcp --dst --dport 80 -j SNAT
--to-source $G_W
|
于此,可以得出结论:
DNAT用于隐藏服务器
SNAT用于隐藏客户端
当前面的DNAT规则与这里的SNAT规则同时被添加,C_L访问G_W:80会是什么情形。
src:C_L:xx
dst:G_W:80
进入PREROUTING,执行DNAT
src:C_L:xx
dst:S_L:80
选路之后,进入POSTROUTING,执行SNAT
src:G_W:xxx
dst:S_L:80
S_L收到请求后回复:
src:S_L:80
dst:G_W:xxx
然后到达G,进入PREROUTING,执行un-SNAT;
src:S_L:80
dst:C_L:xx
确定选路,到达POSTROUTING,执行un-DNAT;
src:G_W:80
dst:C_L:xx
而此连接的ct->tuplehash[]=
{{
src:C_L:xx
dst:G_W:80
},
{
src:S_L:80
dst:G_W:xxx
}}
下篇看看代码来验证这个想法
阅读(1559) | 评论(0) | 转发(0) |