Chinaunix首页 | 论坛 | 博客
  • 博客访问: 451172
  • 博文数量: 64
  • 博客积分: 3271
  • 博客等级: 中校
  • 技术积分: 727
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 18:42
文章分类

全部博文(64)

文章存档

2013年(1)

2011年(19)

2010年(42)

2009年(2)

分类: LINUX

2010-04-17 13:04:58

话说,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
}}

下篇看看代码来验证这个想法
阅读(1521) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~