- 论坛徽章:
- 0
|
原帖由 recoilest 于 2006-3-29 21:57 发表
请教白金
还是这个问题,又做了一个星期的测试.
发现 如果SNAT 的话,有些时候内网直接连接内网地址端口服务不能连接,例如:
telnet 192.168.0.100 22,竟然没有回应,有时候非常正常.
但是如果用MASQUERADE一直没有问题.
iptables -t nat POSTROUTING -p tcp -s 192.168.0.100 -d 192.168.0.0/24 --sport 110 -j MASQUERADE
不解?
我一般的做法是 SNAT 全部,DNAT 才是个别端口,过滤用 filter 表的 FORWARD
不会像你这样单独 SNAT 或者 DNAT 某个 IP 某个端口,这样很容易出问题
我的做法是 DNAT 某个,但 SNAT 一片,这样可以保证先通,之后才是用 filter 表的 FORWARD 去堵
同时还想请教一个问题.有一些文档说POSTROUTING链是在路由之后的.我做了一个实验和这个理论好象有一些冲突,也可能是我理解不够深入
环境:
linux slackware ,kernel 2.6.13,补丁过equal
if0 add:221.0.0.1
if1 add:218.0.0.1
if2 add:218.0.0.2
if3 add:192.168.0.1
如果在linux本地路由表中增加下静态路由
route add -net 10.88.0.0/16 gw 221.0.0.1
在iptables脚本中增加:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0.0.0.0 -j SNAT --to 218.0.0.1-218.0.0.2
那么在192.168.0.0/24 网络中的任意终端运行下:
ping 10.88.0.254
如果10.88.0.254允许icmp ping.并且网络也正常,防火墙也允许icmp出入包.
数据请问是从哪个接口出去的呢? 是否"POSTROUTING链是在路由之后的"?
你要访问的是 10.88.0.0/16
而你的路由表里明确给出 route add -net 10.88.0.0/16 gw 221.0.0.1
你的网路卡上 if0 add:221.0.0.1
因此,只要满足这个 routing 的包,都会从 if0 出去
routing 之后才是 POSTROUTING,只是你将 source IP 改为了 218.0.0.1-218.0.0.2 而已
另外,你这里还有一个问题,if1 和 if2 一定是同一网段的 IP(因为就算是 252 的掩码,也要包含 0~3 共 4 个 IP)
因此,你的路由表里肯定会出现直通路由冲突的情况,也就是说,你的 if1/if2 实际有一块网卡是不能正常工作的
抛开这个问题,若 if1 与 if2 非同一网段,或者他们的直通路由在路由表中不冲突,那么 SNAT 相当于动态修改源地址
那么数据能不能回来呢?
10.88.0.254 被 ping 后,会向 source IP 返回 type 0 的 pong 包,此时若 10.88.0.254 没有路由可以到达 221.0.0.0/xx,那么你就无法 ping 通 |
|