免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5905 | 回复: 8
打印 上一主题 下一主题

[网络管理] 关于iptables的SNAT疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-19 22:10 |只看该作者 |倒序浏览
我知道,DNAT的过程是数据包先进行DNAT,再经过路由,由于路由是根据目标网络地址进行路由表查找的,只有这样路由才能找到内部网络私有IP(目标网络);
我不明白的是SNAT为什么要先经过路由,再进行SNAT?可是先进行SNAT并不影响路由器查找目的网络地址。

比如我有一个内网ip是192.168.1.1,想访问外网的202.203.1.1,网关对内IP是192.168.1.254,对外IP是202.203.1.254

拓扑如下:
192.168.1.1--->(192.168.1.254--202.203.1.254)--->202.203.1.1
()内代表路由器

要想做SNAT规则应该如下:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 202.203.1.254

分析数据包的变化及流程
正常的SNAT数据包开始是这样的:
初始数据包:192.168.1.1--->202.203.1.1
经过查路由表不变
再经过SNAT数据包就变成
202.203.1.254--->202.203.1.1

那么假如可以先经过SNAT再经过路由
初始数据包:192.168.1.1--->202.203.1.1
经过SNAT:202.203.1.254--->202.203.1.1
再查路由表,按说也是可以的。

问题:
为什么不可以在路由前进行SNAT?
也就是为什么不能在PREROUTING链进行SNAT?
即 iptables -t nat -A PREROUTING -s 192.168.1.0/24 -j SNAT --to 202.203.1.254
希望大家能帮我解决疑惑
一路征程一路笑 该用户已被删除
2 [报告]
发表于 2010-02-20 09:26 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2010-02-20 11:26 |只看该作者
回复 2# 一路征程一路笑


   
192.168.1.1--->(192.168.1.254--202.203.1.254)--->202.203.1.1
如果你不想让192.168.1.1 访问 202.203.1.1, 在你的SNAT先于路由的前提下,你的 规则该怎么写呢?


你的意思是说:
先进行SNAT,数据包就变成了202.203.1.254--->202.203.1.1
这样就不能对原来的私有源IP192.168.1.1进行过滤?

那我可不可以在PREROUTING链添加过滤规则
# iptables -t nat -A PREROUTING -s 192.168.1.1 -d 202.203.1.1 -j DROP

然后添加这条错误规则(假如成立)
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -j SNAT --to 202.203.1.254

也就是我在进行SNAT之前,把它过滤掉,这样不是也起到源地址过滤的功能了吗?

第一次发贴,多谢指点!

论坛徽章:
0
4 [报告]
发表于 2010-02-20 14:56 |只看该作者
等待回复啊

论坛徽章:
0
5 [报告]
发表于 2010-02-20 20:22 |只看该作者
回复 2# 一路征程一路笑


   我有一个想法,不知道是否合理, 就是假如在路由前进行的SNAT,但是这个数据包正好又是要发给防火墙本身,而不是往墙外发,防火墙也能收下这个包,
但是根本没必要进行地址转换,这样做等于浪费,不知道有没有道理;
那个“路由”其实就是判断是发往本地的还是要转发的,假如是发往本地的,就没必要进行地址转换了,
不然所有经过防火墙的包(不管是发往防火墙本身还是转发的),在PREROUTING时都进行地址转换一下,那防火墙负载就高了。
不知道是否有道理?

论坛徽章:
0
6 [报告]
发表于 2010-02-20 21:06 |只看该作者
数据包每到一个网络节点都要进行路由

论坛徽章:
0
7 [报告]
发表于 2010-02-20 21:16 |只看该作者
你可以查看iptables网络流程图,
routing是在进来的接口处处理,SNAT则是在出口处了。
既是两个网络节点,一个是对内,一个是对外,
只不过防火墙看起来是一个网络节点而以。
一路征程一路笑 该用户已被删除
8 [报告]
发表于 2010-02-20 21:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2010-02-21 09:48 |只看该作者
回复 8# 一路征程一路笑

兄弟说的确实有道理,我的那种方法确实不能对包进行过滤,以下是来自CU的iptables中文指南http://man.chinaunix.net/network ... tml#HOWARULEISBUILT
    nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行 的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自 动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就 是我们为什么不应该在这个表中做任何过滤的主要原因。

多谢仁兄指点!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP