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

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

我有一个系统,有两个具有不同 IP 地址的网络接口,这两个接口都在公共地址范围内(尽管第一个接口是通过 NAT 实现的),并且都有不同的网关。 (说来话长,仅供测试)

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

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

答案1

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

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

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

echo 200 <NAME1> >> /etc/iproute2/rt_tables
echo 201 <NAME2> >> /etc/iproute2/rt_tables

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

ip route add <NET1> dev <DEV1> src <SRC1> table <NAME1>
ip route add <NET2> dev <DEV2> src <SRC2> table <NAME2>

然后是默认路由:

ip route add default via <IP1> table <NAME1>
ip route add default via <IP2> table <NAME2>

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

ip rule add from <IP1> table <NAME1>
ip rule add from <IP2> table <NAME2>

多个上行链路/提供商的路由更多细节。

答案2

David Schwartz 的答案非常好,但是您可以通过仅使用一个额外的表并使用另一个表的默认路由来稍微简化路由规则。我有一台服务器位于两个 NAT 网关后面,最近我经历了在一堆虚拟机之间重新创建该场景的过程。我的/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

(这是针对两个 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,但类似的操作应该仍然有效。另外,在其中执行这些操作然后 git 管理该文件要容易得多/etc/network/interfaces,而不是在两年后必须重新启动系统时尝试记住它是如何设置的!

答案3

双网络示例

此示例展示了如何将eth1带有10.130.0.2网络掩码255.255.255.255和网关的附加设备10.130.0.1提供给绑定到它的服务,例如ping -I eth1 8.8.8.8

从技术上讲,我们是:

  • 添加具有更大指标的其他网关
  • 添加/使用表 100 并进行设置
  • 添加规则以通过 eth1 路由流量到/从 eth1
ip addr add 10.130.0.2/32 broadcast 10.130.0.2 dev eth1
ip link set eth1 up
ip route add 10.130.0.1 src 10.130.0.2 dev eth1
ip route add 10.130.0.1 src 10.130.0.2 dev eth1 table 100
ip route add default via 10.130.0.1 dev eth1 metric 10
ip route add default via 10.130.0.1 dev eth1 table 100
ip rule add from 10.130.0.2/32 table 100
ip rule add to 10.130.0.2/32 table 100
curl --interface eth1 ifconfig.co
curl --interface eth0 ifconfig.co
ping -I eth1 8.8.8.8

相关内容