在多个上行链路场景中NAT的问题

我试图configuration一个linux pc路由器,必须处理路由和使用NAT来提供连接到内部networking(它也是DHCP服务器和防火墙)。 在外部计算机有2个接口连接2个cablemodem(它通过DHCP获得公共IP)。

该scheme如下所示: http : //img810.imageshack.us/img810/411/filer.jpg

考虑到外部接口的dynamicangular色,我将不得不添加一些脚本到/etc/network/if-up.d和/etc/network/if-down.d,以build立正确的值,但现在我只是想确保它的工作。

所以,我使用这个基本的configuration: http : //pastebin.com/raw.php?i=tvSj0d5S

在testing中,我所做的一台电脑可以连接到互联网,但另一台却不能。 通过与wireshark嗅探,我已经看到非工作PC如何发送它的数据包,路由器redirect后,应用NAT和响应再次到达路由器,但NAT不是“撤消”,并且PC从不接收它们。 在另一台电脑相反,完美的作品。 当然,我有两个默认网关(每个提供商一个),通过显示路由列表(route -n)出现。

假设这两个外部接口都有众所周知的地址和网关(我总是得到相同的地址,所以testing它应该以同样的方式工作)什么是在这里失败? 我应该使用SNAT目标而不是MASQUERADE吗? 我应该使用iproute2的“route from”function而不是fwmark吗?

在此先感谢和问候

如果您在脚本中发布的内容是您所做的所有事情,那么您缺less一些步骤。

看看你的剧本我首先关心的是以下几行。 文件/etc/iproute2/rt_tables通常不会在每次重新启动时重新创build。 您可能会反复向该文件添加相同的内容。 这将在未来造成问题。 特别是如果你改变你使用的数字。

 echo "201 $TABLE1" >> /etc/iproute2/rt_tables echo "202 $TABLE2" >> /etc/iproute2/rt_tables 

接下来的问题是你使用这些命令添加到新表的路线。

 ip route add default via $GW1 dev $DEV1 table $TABLE1 ip route add default via $GW2 dev $DEV2 table $TABLE2 

当你创build一个新表时,它是完全空的。 这意味着它甚至不包括你本地networking的路由。

所以如果你运行一个像这样的ip route show table main scope link你应该看到这样的行。

 192.168.1.0/24 dev eth1 proto kernel src 192.168.1.100 192.168.2.0/24 dev eth2 proto kernel src 192.168.2.100 192.168.3.0/24 dev eth3 proto kernel src 192.168.3.1 

这些是本地路由,需要路由才能工作,并且必须在每个表上重新创build它们。

通用命令将如下所示。 您需要为每个表上的每个接口运行此命令。

 /sbin/ip route add table ${TABLE} scope link proto kernel dev ${IFACE} ${ROUTE} 

首先,dhcp服务器的池是什么? (在configuration中你有192.168.3。[2,3] hardtyped。你是否检查过其中一台PC得到ip的情况?)

你也有启用iptables的日志? 他们可以帮助你。

我知道这并没有什么帮助,只是提供了一些排除故障的提示:>

尝试使用SNAT而不是MASQUERADE ,并使用--to选项将源地址更改为其中一个网关地址。

喜欢:

 iptables -t nat -o $DEV1 -A POSTROUTING -p tcp -j SNAT --to <ethX ip> iptables -t nat -o $DEV2 -A POSTROUTING -p tcp -j SNAT --to <ethY ip> 

也许你也需要添加-s ,但是我不能确定没有testing。

编辑--to指的是接口地址,而不是GW地址。

如果你为两个网关都使用DHCP,你是否确认了你的提供商的DHCP服务器不会向你发送网关信息,并且会修改你的路由表? 默认情况下,至lessdhclient是这样做的。

在没有使用DHCP的结果之后,我决定testing一下:我确实使用了相同的地址来为外部接口build立一个静态configuration。 我已经从路由器本身进行了testing,当然还有工作,但是对于PC来说还是没有结果。 事实上,通过删除主表中的默认GW,即使辅助表具有自己的GW,也不起作用。 而且只要我重新build立默认的GW,它只能用于默认的接口。

所以我的猜测是,当有多个接口(表)时,fwmark系统不能和NAT混合使用。

我将再次尝试添加2个全局范围的stream量平衡,与LARTC指南中出现的方式相同。

问候