我正在尝试配置一个 Linux PC 路由器,它必须处理路由并使用 NAT 来提供与内部网络的连接(它也是 DHCP 服务器和防火墙)。在外部,计算机有 2 个接口,连接了 2 个电缆调制解调器(它通过 DHCP 在两个接口中获取公共 IP)。
该场景如下:http://img810.imageshack.us/img810/411/filer.jpg
考虑到外部接口的动态作用,我必须向 /etc/network/if-up.d 和 /etc/network/if-down.d 添加一些脚本以建立正确的值,但现在我只想确保它能起作用。
因此,对于基本配置我使用这个:http://pastebin.com/raw.php?i=tvSj0d5S
在我进行的测试中,其中一台计算机可以连接到互联网,但另一台则不能。通过使用 wireshark 进行嗅探,我看到了不工作的 PC 如何发送数据包,路由器在应用 NAT 后重定向它们,并且响应确实再次到达路由器,但 NAT 并未“撤消”,PC 从未收到它们。相反,另一台 PC 运行正常。当然,我有 2 个默认网关(每个提供商一个),它们确实通过显示路由列表 (route -n) 出现。
假设两个外部接口都有众所周知的地址和网关(我总是得到相同的地址,所以对于测试来说它应该以相同的方式工作)这里失败了什么?我应该使用 SNAT 目标而不是 MASQUERADE 目标吗?我应该使用 iproute2 的“路由自”功能而不是 fwmark 吗?
提前致谢并致以问候
答案1
如果您在脚本中发布的内容就是您所做的全部,那么您就缺少了一些步骤。
在查看您的脚本时,我首先关注的是以下几行。该文件/etc/iproute2/rt_tables
通常不会在每次重新启动时重新创建。您可能反复向该文件添加相同的内容。这将在将来导致问题。特别是如果您更改了使用的数字。
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
当你创建新表时,它是完全空的。这意味着它甚至不包含本地网络的路由。
所以如果你运行这样的命令,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
这些是本地路由,是路由工作所必需的,您必须在每个表上重新创建它们。
通用命令如下所示。您需要为每个表上的每个接口运行此命令。
/sbin/ip route add table ${TABLE} scope link proto kernel dev ${IFACE} ${ROUTE}
答案2
首先,dhcp 服务器的池是什么?(在配置中,您已硬输入 192.168.3.[2,3]。您是否检查过其中一台 PC 从中获取 IP 的情况?)
另外,您是否启用了 iptables 日志?他们可以为您提供帮助。
我知道这没有多大帮助,但只是一些故障排除的提示:>
答案3
尝试使用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
,但如果不进行测试我就无法确定。
编辑:--to
指的是接口地址,而不是GW地址。
答案4
在 DHCP 没有结果后,我决定测试一些东西:我确实使用我一直获得的相同地址为外部接口建立了静态配置。我已经从路由器本身测试了两者,当然可以,但对 PC 仍然没有结果。事实上,即使辅助表有自己的 GW,删除主表中的默认 GW 也无法正常工作。只要我再次建立默认 GW,它就会再次仅适用于默认接口。
所以我的猜测是,当有多个接口(表)时,fwmark 系统无法与 NAT 混合工作。
我将再次尝试添加 2 个全局范围来实现流量平衡,就像 LARTC 指南中显示的那样。
问候