LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1223|回复: 8

请教一个iptables规则

[复制链接]
发表于 2006-4-19 10:58:09 | 显示全部楼层 |阅读模式
LANs的概况是这样:

网关gateway有4个接口(有4块以太网卡):
内接口:
211.100.100.1
192.168.199.1
外接口:
211.100.1.1(接CERNET)
ppp0(网通的ADSL,IP不定)

两个LAN:
192.168.199.0/24
211.100.100.0/24
在211.100.100.0/24中会有一些server(cvs, sshd)在运行。

gateway的route表的原则是:[color="Red"]目的站在CERNET的流量走接口211.100.1.1(eth0),目的站在CERNET外的走接口ppp0.
gateway的iptables有如下的配置

  1. iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE   #*
  2. iptables -t nat -A POSTROUTING -o eth0 -s 192.168.199.0/24 -j SNAT --to 211.100.1.1
复制代码


我从某个[color="Red"]网通ADSL的机器上要登录211.100.100.0/24中的server,结果从211.100.100.0/24返回的流量都被gateway作了SNAT(应该是由于#*那条规则)。

我想请问,怎样才能指定iptables对于某台主机(如211.100.100.0/24中的某个主机)不作MASQUERADE?
发表于 2006-4-19 11:09:17 | 显示全部楼层
-s 192.168.199.0/24
=>
-s 192.168.199.11/32

一台机器的。。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-19 11:16:00 | 显示全部楼层
Post by 终极幻想
-s 192.168.199.0/24
=>
-s 192.168.199.11/32

一台机器的。。。。。。

谢谢。直接
-s 192.168.199.11 是不是也可以?我看man里[/mask]是可选的。

另外:我的疑问是怎么对于一台主机 (通过-s选项指定好了的) 去掉NAT或者MASQUERADE?
回复 支持 反对

使用道具 举报

发表于 2006-4-19 15:29:46 | 显示全部楼层
在你的网关上设置策略路由,使得从211.100.100.0/24来的IP数据包都走教育网的路由。
回复 支持 反对

使用道具 举报

发表于 2006-4-19 15:41:54 | 显示全部楼层
Post by Illidan
谢谢。直接
-s 192.168.199.11 是不是也可以?我看man里[/mask]是可选的。

另外:我的疑问是怎么对于一台主机 (通过-s选项指定好了的) 去掉NAT或者MASQUERADE?


去掉 192.168.199.111:
iptables -t nat -A POSTROUTING -s 192.168.199.111  -j RETURN
其他允许:
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.199.0/24 -j SNAT --to 211.100.1.1
回复 支持 反对

使用道具 举报

发表于 2006-4-19 20:22:38 | 显示全部楼层
你现在的结构是双出口(教育网和网通)
在你的内网中有一部分属于教育网的公网地址(211.100.100.0/24),还有一部分是私网地址(192.168.199.0),如果你只是让内网能够访问公网,只需要做nat就可以了。

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.199.0/24 -j MASQUERADE

即内网中具有私网地址的主机访问公网时,不管是从教育网的出口还是从网通的出口,都是需要做地址伪装的。

而内网中具有公网地址的主机访问公网时,从教育网出口时,不需要进行伪装,因为IP数据包返回时,肯定是从教育网的出口回来的,因为它在公网上的路由就是通过教育网。从网通出口时,需要进行地址伪装(但不是必须的,只是不进行地址伪装时,某种情况下,可能对速度有影响。)

而现在你又要对外网提供服务,那么就出现一个问题:
假设在你的网关上有这么一个路由设置,目的地址为A.A.A.A的地址走网通的出口。现在假设A.A.A.A这台主机访问211.100.100.A这个主机,首先,它的数据包从教育网的出口进入你的网关,并路由到你的211.100.100.A这个主机上,现在你的211.100.100.A主机进行回应,数据包到达网关的时候,按照你的路由规则,必须走网通的出口,而你的网通的出口是全部进行地址转换的,因此,网关将数据包的源地址改为PPP0的地址,这种数据包是能够送到A.A.A.A这个主机上的,但是,A.A.A.A的状态表中并没有对PPP0这个地址做任何请求,因此对这个应答包是不予理睬的。因此A.A.A.A与211.100.100.A这个主机就无法进行连接会话。

因此,现在就有两个解决方案
一、在网通的出口修改地址转换规则,从211.100.100.0/24的地址出去的数据包不进行伪装。
   iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE
   iptables -t nat -A POSTROUTING -o eth0 -s 192.168.199.0/24 -j MASQUERADE
二、在网关上设置策略路由(即源路由),让从211.100.100.A(这是需要对外提供服务的主机)出去的所有数据包,都走教育网的出口。

对于数据包的流向,你可以在外网和内网通过互追路由就可以看出来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-19 23:04:02 | 显示全部楼层
非常感谢。你的分析很细致。源路由怎么设?我看了route(8)的man,应该是不行的吧。看来得用iptables来做源路由。命令行应该怎么写呢?

Post by springwind426
你现在的结构是双出口(教育网和网通)
在你的内网中有一部分属于教育网的公网地址(211.100.100.0/24),还有一部分是私网地址(192.168.199.0),如果你只是让内网能够访问公网,只需要做nat就可以了。

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.199.0/24 -j MASQUERADE

即内网中具有私网地址的主机访问公网时,不管是从教育网的出口还是从网通的出口,都是需要做地址伪装的。

而内网中具有公网地址的主机访问公网时,从教育网出口时,不需要进行伪装,因为IP数据包返回时,肯定是从教育网的出口回来的,因为它在公网上的路由就是通过教育网。从网通出口时,需要进行地址伪装(但不是必须的,只是不进行地址伪装时,某种情况下,可能对速度有影响。)

而现在你又要对外网提供服务,那么就出现一个问题:
假设在你的网关上有这么一个路由设置,目的地址为A.A.A.A的地址走网通的出口。现在假设A.A.A.A这台主机访问211.100.100.A这个主机,首先,它的数据包从教育网的出口进入你的网关,并路由到你的211.100.100.A这个主机上,现在你的211.100.100.A主机进行回应,数据包到达网关的时候,按照你的路由规则,必须走网通的出口,而你的网通的出口是全部进行地址转换的,因此,网关将数据包的源地址改为PPP0的地址,这种数据包是能够送到A.A.A.A这个主机上的,但是,A.A.A.A的状态表中并没有对PPP0这个地址做任何请求,因此对这个应答包是不予理睬的。因此A.A.A.A与211.100.100.A这个主机就无法进行连接会话。

因此,现在就有两个解决方案
一、在网通的出口修改地址转换规则,从211.100.100.0/24的地址出去的数据包不进行伪装。
   iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE
   iptables -t nat -A POSTROUTING -o eth0 -s 192.168.199.0/24 -j MASQUERADE
二、在网关上设置策略路由(即源路由),让从211.100.100.A(这是需要对外提供服务的主机)出去的所有数据包,都走教育网的出口。

对于数据包的流向,你可以在外网和内网通过互追路由就可以看出来。
回复 支持 反对

使用道具 举报

发表于 2006-4-20 20:47:14 | 显示全部楼层
查询一下 iptables 规则 关于mark 和源路由结合的设置
我想有你需要的答案
回复 支持 反对

使用道具 举报

发表于 2006-4-22 14:29:49 | 显示全部楼层
源路由的设置用ip工具就可以设置,属于iproute2这个软件。

添加一个路由表:
ip route add default table local2cernet via 教育网的路由地址 dev 教育网的接口名
ip route add 192.168.199.0/24 table local2cernet dev 地址为192.168.199.1的接口名
ip route add 211.100.100.0/24 table local2cernet dev 地址为211.100.100.1的接口名

现在添加路由规则:
ip rule add from 211.100.100.10(需要设置源路由的IP) pref 200 table local2cernet

这样设置以后,211.100.100.10这个地址访问任何外网都从教育网出去,因此,任何外网地址访问它也就不会出现任何问题了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表