LinuxSir.cn,穿越时空的Linuxsir!

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

请教iproute2和iptables

[复制链接]
发表于 2006-5-30 22:38:06 | 显示全部楼层 |阅读模式
我有一台rh9的服务器。三张网卡eth0接内部lan,eth1接电信,eth2接网通。地址和网关如下:eth0:192.168.0.1/24  eth1:61.153.4.2/30 gw 61.153.4.1/30 eth2:221.101.104.2/30 gw 221.101.104.1/30 需要两条线路做负载均衡,并且保证内网机器如果选择从网通出去访问网站,那么回路包也应该从网通线路进来。内部有一台web供外网访问,要保证两个外部地址均能访问。我的代码如下:
-A POSTROUTING  -o eth1 -j MASQUERADE
-A POSTROUTING  -o eth2 -j MASQUERADE
-A PREROUTING   -d 221.101.104.2 -i eth2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.5:80
-A PREROUTING   -d 61.153.4.2 -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.5:80
路由表如下:
default equalize
        nexthop via 221.101.104.1  dev eth2 weight 1
        nexthop via 61.153.4.1  dev eth1 weight 1
现在的问题是我从外面访问web时总是不能正常访问,请求解决方法。
 楼主| 发表于 2006-5-31 07:33:14 | 显示全部楼层
自己顶一下。请求帮助阿.
回复 支持 反对

使用道具 举报

发表于 2006-5-31 10:37:57 | 显示全部楼层
你这个配置能工作吗?看着怪怪的,-m tcp是什么,不懂。
你要求的从那个口出去从那个回来,着不是你能决定的,反过来从哪回来的下次从哪出去,还要看服务商给不给你路由信息,一般也没戏。

我只会最简单的
-t nat -A POSTROUTING -s 192.168.0.0/24  -o  eth1 -j MASQUERADE
-t nat -A PREROUTING -i eth2 -p tcp -d 221.101.104.2 --dport 80 -j DNAT --to-destination 192.168.0.5:80
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-31 15:24:42 | 显示全部楼层
我从外网访问221.101.104.2:80,数据包从eth2进来到达192.168.0.5后,数据包返回的时候有可能从61.153.4.2。eth1接口出去。怎样保证回来的包也从eth2出去?
回复 支持 反对

使用道具 举报

发表于 2006-5-31 17:11:11 | 显示全部楼层
这样应该可以:
服务器加一个地址,比如192.168.0.6
路由进来的时候eth2 nat 到.6,eth1 nat到.5
路由出去的时候多表路由,192.168.0.6从eth2,192.168.0.5从eth1
回复 支持 反对

使用道具 举报

发表于 2006-5-31 17:15:13 | 显示全部楼层
仔细想想好像不对,从外网访问221.101.104.2:80,数据包从eth2进来到达192.168.0.5后,数据包返回的时候有可能从61.153.4.2。eth1接口出去
这种情况似乎不应该出现,你最好抓包确认一下,记得iptables nat时会自动辨认回去的包
回复 支持 反对

使用道具 举报

发表于 2006-6-1 09:42:33 | 显示全部楼层
来自Client端口为Port的数据包:Clientort->A:80,经过防火墙PREROUTING的DNAT,数据包变为:Clientort->192.168.0.5:80,数据包到达192.168.0.5,HTTP服务器返回数据包:192.168.0.5:80->Clientort,数据包到达防火墙,经过DNAT的逆过程UN-DNAT,变为A:80->Clientort,这个过程与MASQUERADE无关.
我试验了一下,就是把防火墙上的MASQUERDE关上,只有DNAT,从外网也可以访问内网提供的服务(我试验了telnet和www服务),只不过内网不能访问INTERNAT而已,因为是私有地址.试验时要注意把FORWARD链打开为允许,比如我的iptables这几项如下:

        iptables -P FORWARD ACCEPT
     1 iptables -A FORWARD -i ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
     2 iptables -A FORWARD -i ppp0 -p tcp -m multiport --dports 23,80,3389 -j ACCEPT
     3 iptables -A FORWARD -i ppp0 -j DROP

     4 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 23 -j DNAT --to-destination 192.168.0.2:23
     5 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.2:80
Post by startredhat
我从外网访问221.101.104.2:80,数据包从eth2进来到达192.168.0.5后,数据包返回的时候有可能从61.153.4.2。eth1接口出去。怎样保证回来的包也从eth2出去?

为什么一定要保证来自eth2的包一定从eth2包出去呢?我很困惑,来自内网的返回数据包到这里之后就UN-DNAT为A:80->Clientort,或是B:80->Clientort(如果Client开始是通过B地址访问内网的WWW服务时),至少从那个口出去没有大的影响,只是路由而已,源地址不会变,因为与MASQUERADE没有关系,上面已经说过的.
以上是我的想法,欢迎讨论!(看看你的FORWARD链是否允许访问内网的服务)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-1 15:10:57 | 显示全部楼层
多谢各位。
按照楼上的意思。是否是这样(除了192.168.0.5以外的可以上Internet):
-A POSTROUTING  -s !192.168.0.5 -o eth2 -j SNAT  --to 221.101.104.2
-A POSTROUTING  -s !192.168.0.5 -o eth1 -j SNAT  --to 61.153.4.2
我的forward默认是打开的。
回复 支持 反对

使用道具 举报

发表于 2006-6-1 18:23:12 | 显示全部楼层
Post by startredhat
多谢各位。
按照楼上的意思。是否是这样(除了192.168.0.5以外的可以上Internet):
-A POSTROUTING  -s !192.168.0.5 -o eth2 -j SNAT  --to 221.101.104.2
-A POSTROUTING  -s !192.168.0.5 -o eth1 -j SNAT  --to 61.153.4.2
我的forward默认是打开的。

--to 是否应该是--to-source(--to好象是-j NETMAP的选项)
嗯,这样可以实现内网的机器(除192.168.0.5)产生的访问INTERNET的数据包,在被防火墙路由出去之前,其数据包的源地址会转换成公网IP地址,从而实现内网机器访问INTERNET,当然防火墙的路由功能要开启(/proc/sys/net/ipv4/ip_forward设为1),以及内网机器的网关要设为防火墙上的内网IP地址.因为你有两个INTERNET IP,内网访问INTERNET的数据包路由出去时会转换成哪一个,那就看数据包从那个公网接口出去,这涉及到防火墙上的策略路由的问题(可以用iproute来做),祝你好运!
做好后,能否把你的经验(策略路由)贴出来分享一下或发给我一份!欢迎跟我联系,交流学习心得.我的QQ是58506778
回复 支持 反对

使用道具 举报

发表于 2006-6-1 18:47:48 | 显示全部楼层
应该用iproute2做策略路由,网通、电信各行其道。具体做法需要查iproute的教程了,比较长。
回复 支持 反对

使用道具 举报

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

本版积分规则

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