|
发表于 2005-10-27 08:56:40
|
显示全部楼层
Post by ruiqingzheng
当匹配了一条规则以后,对于后面的规则是否还需要匹配我也不是很清楚,
按照iptables的工作机制,在一个chain里面一般来说匹配一条规则后就不匹配后面的规则了,但是也有里外的
如:
iptables -N test
iptables -A INPUT -j test
iptables -A INPUT -s 192.168.0.0/24 -j DROP
iptables -A INPUT -j ACCEPT
iptables -A test -s 192.168.1.1 -j RETURN
iptables -A test -s 192.168.0.1 -j ACCEPT
这样,原地址是192.168.1.1这个规则在INPUT这个chain里面就匹配至少2次
第一次iptables -A INPUT -j test
第二次iptables -A INPUT -j ACCEPT
Post by ruiqingzheng
所以这里假设匹配了PREROUTING里面的规则后,不是发送给LOCAL的包 在经过FORWARD和POSTROUTING时还需要匹配处理
因为 按照两位在上面所讲的情况 觉得 当匹配了一个chain的规则后 在经过后面的chains时应该是还需要处理的
按三种情况理解了一下上面两位的RULES 因为我也理解不是很清楚 望高手赐教
但是 我觉得 如果不要第三条规则不是很好吗 什么事有没有, 不知道diekiss这第三条规则到底想要干什么(难道是避免回路吗?但是去掉第三条规则,应该一切正常吧,但是我没有试过)
iptables -t nat -A POSTROUTING -s 10.168.172.0/24 -o eth1 -j SNAT --to 61.143.A.B
iptables -t nat -A PREROUTING -d 61.143.A.C -p tcp --dport 80 -j DNAT --to 10.168.172.242
iptables -t nat -A POSTROUTING -d 10.168.172.242 -p tcp --dport 80 -j SNAT --to 10.168.172.254
系统必须经过的chain是那是没有什么可说的,如果作路由的话 PREROUTING FORWARD POSTROUTING是必须经过的
如果没有第三条规则,外网访问61.143.A.C是没有问题的,内网就有问题了,因为内网的路径不对称,来回的路径不一致。
Post by ruiqingzheng
(1)
从内网访问10.168.172.242,直接交付
如果内网用户希望和外网一样,不想在DNS下功夫,如: 外网用户 解析www.xxx.com 是 61.143.A.C 内网用户解析的是 10.168.172.242
在这个情况下没有第三条的SNAT就有问题了
Post by ruiqingzheng
(2)
从内网10.168.172.3访问61.143.A.C或者www.xxx.com
从eth0收到包 SIP=10.168.172.3 DIP=61.143.A.C
进入PREROUTING 第二条规则生效
SIP=10.168.172.3 DIP=10.168.172.242
根据DIP查ROUTE TABEL,连接10.168.172.242的包的DEV是eth0,因为这个包不是给LOCAL的所以再经过FORWARD,
经过POSTROUTING 第三条规则生效
SIP=10.168.172.254 于是WEB纪录的是这个IP
由eth0把这个包交到10.168.172.242
nod,有第三条规则的时候一切正常
Post by ruiqingzheng
(3)
从外网219.140.X.X访问61.143.A.C或者www.xxx.com
从eth1:0收到包 SIP=10.168.172.3 DIP=61.143.A.C
进入PREROUTING 第二条规则生效
SIP=219.140.X.X DIP=10.168.172.242
根据DIP查ROUTE TABEL,连接10.168.172.242的包的DEV是eth0,因为这个包不是给LOCAL的所以再经过FORWARD,
经过POSTROUTING 第三条规则生效
SIP=10.168.172.254 于是WEB纪录的是这个IP
由eth0把这个包交到10.168.172.242
nod,按照楼主的配置是这样记录的
Post by ruiqingzheng
假如按wenzk改掉第三条
iptables -t nat -A POSTROUTING -s 10.168.172.0/24 -o eth1 -j SNAT --to 61.143.A.B
iptables -t nat -A PREROUTING -d 61.143.A.C -p tcp --dport 80 -j DNAT --to 10.168.172.242
iptables -t nat -A POSTROUTING -s 10.168.172.0/24 -d 10.168.172.242 -p tcp --dport 80 -j SNAT --to 10.168.172.254
对于上面的3种情况 (1)情况下 没有影响
(2)
从内网10.168.172.3访问61.143.A.C或者www.xxx.com
从eth0收到包 SIP=10.168.172.3 DIP=61.143.A.C
进入PREROUTING 第二条规则生效
SIP=10.168.172.3 DIP=10.168.172.242
根据DIP查ROUTE TABEL,连接10.168.172.242的包的DEV是eth0,因为这个包不是给LOCAL的所以再经过FORWARD,
经过POSTROUTING 第三条规则生效 SIP 是 10.168.172.0/24网络的 所以改变
SIP=10.168.172.254
由eth0把这个包交到10.168.172.242
这时没有真实纪录IP
nod,否则内网用户访问这个地址肯定有问题
假设没有第三条SNAT的规则
client发出去的报是:
SIP=10.168.172.3 DIP=61.143.A.C
web服务器收到的包是:
SIP=10.168.172.3 DIP=10.168.172.242
所以web服务器的回应的包是:
SIP=10.168.172.242 DIP=10.168.172.3
由于web回应的包的原地址和目的地址都是在一个LAN配,匹配web服务器上的路由表的10.168.172.0/24这条路由,经过本地连接直接递交给client主机10.168.172.3
所以cliet接收的到包是:
SIP=10.168.172.242 DIP=10.168.172.3
而和client发出去的包作比较,client期望收到的数据包是:
SIP=61.143.A.C DIP=10.168.172.3
所以握手不成功,无法建立连接。
Post by ruiqingzheng
(3)
从外网219.140.X.X访问61.143.A.C或者www.xxx.com
从eth1:0收到包 SIP=10.168.172.3 DIP=61.143.A.C
进入PREROUTING 第二条规则生效
SIP=219.140.X.X DIP=10.168.172.242
根据DIP查ROUTE TABEL,连接10.168.172.242的包的DEV是eth0,因为这个包不是给LOCAL的所以再经过FORWARD,
经过POSTROUTING 第三条规则生效,SIP=219.140.X.X 不匹配这条规则 , 于是按照默认处理被DENY掉了
所以从外网连接就访问不了了
楼主在写规则的时候没有作特殊说明
没有提到楼主的POSTROUTING这个chain的默认动作是DROP,所以我按照系统默认的处理,都是ACCEPT,如果一个chain没有任何一条规则匹配,则执行默认动作
ps:我所用那台机器的 nat table内容
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 202.118.0.251 tcp dpt:8080 to:192.168.11.18:80
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 192.168.0.0/16
SNAT all -- 192.168.8.0/22 0.0.0.0/0 to:202.118.0.251
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
大家访问http://elm.freetcp.com:8080的时候在POSTROUTING这个Chain也没有规则是匹配的,因为我的路由表是这样的:
202.118.0.192 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.11.0 192.168.11.2 255.255.255.0 UG 0 0 0 tun0
0.0.0.0 202.118.0.xxx 0.0.0.0 UG 0 0 0 eth0
上面的POSTROUGING两条规则都指明了 -o eth0 所以对我的tun0来说没有效果 |
|