为 2 个网络和 3 个网关上有 2 个接口的主机寻找优雅的 iproute2 解决方案

为 2 个网络和 3 个网关上有 2 个接口的主机寻找优雅的 iproute2 解决方案

我有一个 Linux 网络服务器,192.168.0.2/24 分配给 eth0,172.16.0.2/24 分配给 eth1。我决不能改变这一点。这是到目前为止的路由:

172.16.0.0/24 dev eth1 proto kernel scope link src 172.16.0.2
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.2
172.16.0.0/16 via 172.16.0.1 dev eth1
default via 192.168.0.1 dev eth0

默认路由通向互联网,机器需要访问该互联网来下载内容。现在也有数据包(请求)通过 172.16.0.254 从 Internet 传入。我必须如何设置路由表和规则才能响应这些请求?iptables在这里不可能。

更新:看起来这可行,但对我来说看起来并不优雅:

ip r a 172.16.0.0/24 dev eth1 table 10
ip r a 172.16.0.0/16 via 10.16.0.1 t 10
ip r a default via 172.16.0.254 t 10
ip rule add from 172.16.0.2 t 10

答案1

这称为简单的基于源的路由,LARTC HOWTO 中对此进行了介绍:

http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.rpdb.simple.html

如果您发现原始路由表(没有默认网关)内容的复制和粘贴不优雅,则不必这样做,您可以使用一个简单的脚本:

ip route flush table 10
ip route show table main | grep -v ^default | while read ROUTE; do ip route add table 10 $ROUTE; done
ip route add table 10 default via 172.16.0.254
ip rule add from 172.16.0.2 table 10
ip route flush cache

答案2

我认为你不能。

当应用程序(Web 服务器)回复时,这些是内核的新数据包,它将仅遵循路由表。您不能拥有多个默认网关,并根据数据包到达哪个接口来触发应用程序发送此响应来选择一个默认网关。

请仅使用一个默认网关。不要像这样在多个子网上进行 NAT。你的网络设计有问题。真的。

如果您这样做,那么就不要指望端口转发可以在这里发挥作用。

相关内容