两个接口,两个地址,两个网关?

Sha*_*dur 17 networking debian ipv4

我有一个系统,它有两个不同 IP 地址的网络接口,它们都在公共地址范围内(尽管在第一个的情况下通过 NAT)并且它们都有不同的网关。(长话短说,用于测试目的)

现在的问题是,如果我尝试 ping 第二个接口上的地址,默认路由会通过第一个接口指出 - 并且永远不会正确到达。

是否可以确保响应始终通过相同的网络接口(并具有相同的源 IP)发出?如果是这样,如何?

Dav*_*rtz 19

你误解了这个问题。并非每个数据包都是响应,也不是每个数据包都可以与其他数据包匹配,因此“与它们进入时相同的网络接口”是有道理的。您要做的是根据数据包的源 IP 地址为数据包选择网关。

这称为基于源的路由或策略路由。您可以使用简单的iptables规则来实现,但最好的方法是设置两个路由表,一个用于每个公共源地址:

首先,创建两个表(将 <NAME1> 和 <NAME2> 替换为您的两个提供程序的合理名称,与 IP1、DEV1 等相同):

echo 200 <NAME1> >> /etc/iproute2/rt_tables
echo 201 <NAME2> >> /etc/iproute2/rt_tables
Run Code Online (Sandbox Code Playgroud)

为每个路由表添加一个网关(如果需要):

ip route add <NET1> dev <DEV1> src <SRC1> table <NAME1>
ip route add <NET2> dev <DEV2> src <SRC2> table <NAME2>
Run Code Online (Sandbox Code Playgroud)

然后是默认路由:

ip route add default via <IP1> table <NAME1>
ip route add default via <IP2> table <NAME2>
Run Code Online (Sandbox Code Playgroud)

然后根据源地址选择路由表的规则:

ip rule add from <IP1> table <NAME1>
ip rule add from <IP2> table <NAME2>
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅多个上行链路/提供商的路由


ros*_*uav 7

David Schwartz 的回答非常好,但是您可以通过只添加一张表并为另一个表使用默认路由来稍微简化路由规则。我有一个位于两个 NAT 网关后面的服务器,我最近经历了在一堆 VM 之间重新创建该场景的过程。我的/etc/network/interfaces看起来像这样:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.13.13
    netmask 255.255.255.0
    up ip route add table optus default via 192.168.13.10
    up ip rule add from 192.168.13.213 table optus
    up ip route add default via 192.168.13.11

auto eth0:0
iface eth0:0 inet static
    address 192.168.13.213
    netmask 255.255.255.0
Run Code Online (Sandbox Code Playgroud)

(这是针对两个 ISP 是 Optus 和 iiNet 的设置,因此表名为“optus”)

这一点,加上/etc/iproute2/rt_tables创建表格的那一行,应该就是你所需要的。您将有两个 IP 地址;来自 192.168.13.13 的流量将通过 192.168.13.11 流出,来自 192.168.13.213 的流量将通过 192.168.13.10 流出。配置这两个网关以适当地进行端口转发(192.168.13.11 将内容转发到 192.168.13.13,而 192.168.13.10 将内容转发到 192.168.13.213),其余的应该自己处理。

您可能需要根据自己的情况稍微调整一下,因为您直接使用公共 IP,但这样的事情应该仍然有效。此外,在/etc/network/interfaces两年后必须重新启动系统时,在其中执行这些操作然后 git 管理该文件要容易得多,而不是尝试记住您是如何设置它的!