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


15

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

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

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


Answers:


17

您误解了问题。并非每个数据包都是响应,也不是每个数据包都可以与其他数据包匹配,因此“与传入的网络接口相同”才有意义。您要做的是根据其源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>

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


您写道:“并非每个数据包都是响应,也不是每个数据包都可以与其他数据包匹配,因此“与传入的网络接口相同”才有意义。'您能进一步解释一下吗?我知道,不是每个数据包都是响应,也不是每个数据包都可以与另一个“源”数据包匹配。如果我们不考虑这些数据包,因为它们不会引起任何问题,因此与我们无关,那么为什么剩余的数据包无法路由到“传入时所使用的相同网络接口”?
Andrew Savinykh '18

@AndrewSavinykh不能解决所有问题。特别是,只要本地发出的出站数据包(例如出站ping请求)从其源IP地址的错误接口传出并被网关丢弃,它就会中断。正如我所解释的,问题实际上是关于确保数据包从与其源IP地址相对应的网关流出。
大卫·史瓦兹

大卫,我想实现与OP相同的功能,但是我做不到。我在这里发布了一个问题:serverfault.com/questions/992624/…,如果您可以看一下,那就太好了
Housemd

6

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

(这是用于两个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-manage管理要容易得多,而不是试图记住您的设置方式。


1

双网示例

此示例显示了如何使eth1具有10.130.0.2netmask 255.255.255.255和网关的附加功能10.130.0.1可用于绑定到该网络的服务,例如ping -I eth1 8.8.8.8

从技术上讲,我们是:

  • 添加具有更高指标的其他网关
  • 添加/使用表格100并进行设置
  • 添加规则以将流量通过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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.