是否可以有多个默认网关用于出站连接?


15

我想在同一子网中有多个NIC(eth0和wlan0),如果其中一个NIC出现故障,可以用作主机上应用程序的备份。因此,我创建了一个附加的路由表。这是怎样/etc/network/interfaces的外观:

iface eth0 inet static
address 192.168.178.2
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.2
    post-up ip route add default via 192.168.178.1 dev eth0
    post-up ip rule add from 192.168.178.2/32
    post-up ip rule add to 192.168.178.2/32

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.3 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.3/32 table rt2
    post-up ip rule add to 192.168.178.3/32 table rt2

这适用于连接到主机:如果接口之一出现故障,我仍然可以通过SSH进入主机。但是,如果主机断开,主机上的应用程序将无法初始化与外界的连接eth0。那是我的问题。

我研究了该主题并发现了以下有趣的信息:

当程序启动出站连接时,使用通配符源地址(0.0.0.0)是正常的,如果相关的目标地址可访问,则表明对于使用哪个接口没有任何偏好。在做出路由决定之前,不会用特定的源地址替换它。因此,与此类连接关联的流量将不匹配上述任何策略规则,也不会被定向到任何新添加的路由表。假设采用其他正常配置,它将直接进入主路由表。 http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html

我想要的是主路由表具有多个默认网关(一个打开eth0,一个打开wlan0),并eth0通过默认(wlan0如果eth0关闭)通过默认网关。

那可能吗?我需要做什么才能实现这种功能?


非常简短:多个默认路由将随机选择一个接口,这会导致麻烦,因为分配的IP不同。您想要的是多宿主捆绑,这很难做到,请参见例如此处
dirkt

1
您可以结合使用动态故障转移。无需摆弄默认路由。

Answers:


17

我自己解决了。关于Linux可以做的网络工作的信息似乎很少,因此我决定详细记录和解释我的解决方案。这是我的最终设置:

  • 3个NIC:eth0(有线),wlan0(内置wifi,弱),wlan1(usb wifi适配器,比wlan0强的信号)
  • 所有这些都在一个子网中,每个都有自己的IP地址。
  • 默认情况下,eth0应该同时用于传入和传出流量。
  • 如果eth0失败,则应使用wlan1。
  • 如果wlan1失败,则应使用wlan0。

第一步:为中的每个接口创建一个新的路由表/etc/iproute2/rt_tables。我们称它们为rt1,rt2和rt3

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1  inr.ruhep
1 rt1
2 rt2
3 rt3

第二步:在.NET中进行网络配置/etc/network/interfaces。这是主要部分,我将尽力解释:

auto eth0 wlan0
allow-hotplug wlan1

iface lo inet loopback

iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
    post-up ip route add default via 192.168.178.1 dev eth0 table rt1
    post-up ip rule add from 192.168.178.99/32 table rt1
    post-up ip rule add to 192.168.178.99/32 table rt1
    post-up ip route add default via 192.168.178.1 metric 100 dev eth0
    post-down ip rule del from 0/0 to 0/0 table rt1
    post-down ip rule del from 0/0 to 0/0 table rt1

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.97/32 table rt2
    post-up ip rule add to 192.168.178.97/32 table rt2
    post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
    post-down ip rule del from 0/0 to 0/0 table rt2
    post-down ip rule del from 0/0 to 0/0 table rt2

iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
    post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
    post-up ip rule add from 192.168.178.98/32 table rt3
    post-up ip rule add to 192.168.178.98/32 table rt3
    post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
    post-down ip rule del from 0/0 to 0/0 table rt3
    post-down ip rule del from 0/0 to 0/0 table rt3

如果键入,ip rule show您将看到以下内容:

0:  from all lookup local 
32756:  from all to 192.168.178.98 lookup rt3 
32757:  from 192.168.178.98 lookup rt3 
32758:  from all to 192.168.178.99 lookup rt1 
32759:  from 192.168.178.99 lookup rt1 
32762:  from all to 192.168.178.97 lookup rt2 
32763:  from 192.168.178.97 lookup rt2 
32766:  from all lookup main 
32767:  from all lookup default 

这告诉我们,从IP地址“ 192.168.178.99”传入或传出的流量将使用rt1路由表。到目前为止,一切都很好。但是本地生成的流量(例如,您要从计算机ping或ssh到其他地方)需要特殊处理(请参阅问题中的大引号)。

前四行张贴/etc/network/interfaces很简单,可以在Internet上找到解释,第五行也是最后一条是使魔术发生的行:

post-up ip r add default via 192.168.178.1 metric 100 dev eth0

请注意,我们如何尚未为该后继线路指定路线表。如果您未指定路由表,则信息将保存在main我们在中看到的路由表中ip rule show。此后置代码行将默认路由放入“主”路由表中,该默认路由用于本地生成的流量,而不是对传入流量的响应。(例如,您服务器上的MTA尝试发送电子邮件。)

这三个接口都将默认路由放入主路由表中,尽管度量标准不同。让我们看一下带有的main路由表ip route show

default via 192.168.178.1 dev eth0  metric 100 
default via 192.168.178.1 dev wlan1  metric 101 
default via 192.168.178.1 dev wlan0  metric 102 
192.168.178.0/24 dev wlan0  proto kernel  scope link  src 192.168.178.97 
192.168.178.0/24 dev eth0  proto kernel  scope link  src 192.168.178.99 
192.168.178.0/24 dev wlan1  proto kernel  scope link  src 192.168.178.98

我们可以看到,主路由表具有三个默认路由,尽管它们具有不同的度量。最高优先级是eth0,然后是wlan1,然后是wlan0,因为较低的度量标准编号表示较高的优先级。由于eth0度量最低,因此这是将一直使用的默认路由eth0。如果eth0出现故障,传出流量将切换为wlan1

通过此设置,我们可以ping 8.8.8.8在一个终端ifdown eth0中输入另一个终端。ping仍然应该工作,因为因为ifdown eth0将删除与之相关的默认路由eth0,传出流量将切换到wlan1

向下发布的行确保ip rule show在接口断开时从路由策略数据库()中删除相关的路由表,以使所有内容保持整洁。

剩下的问题是,当您从eth0默认路由中拔出插头时eth0仍然存在,并且传出流量失败。我们需要一些东西来监视我们的接口并在接口ifdown eth0出现问题(例如NIC故障或拔插头)时执行。

最后一步:输入ifplugd。这是一个守护程序,它监视接口并ifup/ifdown在您拔下插头或wifi连接出现问题时执行/etc/default/ifplugd

INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"

现在,您可以拔下插头eth0,出站流量将切换到wlan1,如果重新插入插头,出站流量将切换到eth0只要这三个界面中的任何一个都能工作,您的服务器就会保持在线状态。要连接到服务器,可以使用eth0的IP地址,如果失败,则使用wlan1或wlan0的IP地址。


尝试建立耗时较长的连接(例如,将一个scp文件较大),观察其使用的网络接口,禁用该接口,然后看看会发生什么。
dirkt

scp由于IP地址更改,会话将中断。withsctp在这种情况下,您可以尝试使连接保持活动状态,或者使用rsync而不是scp从停止点开始进行传输。
rosix

关键是:如果中断,那么与仅使用一条默认路由(例如在当前最快的网络接口上)相比,进行复杂设置的优势是什么?withsctp也仅适用于一种默认路由。
dirkt

1
“与仅使用一条默认路由(例如在当前最快的网络接口上)相比,复杂的设置有何优势?” >>那正是我的设置正在做的。默认情况下,仅使用最快的默认路由(eth0)。别客气。
rosix '17

11

Linux提供了比脚本解决方法更好的解决方案:主动备份绑定。

这样,您的计算机将只有一个 ip地址(和一个mac地址),并且如果一个接口不可用,则会自动透明地切换接口。不中断任何TCP连接(既不连接内部局域网也不连接Internet)。

我将自己的笔记本电脑从扩展坞断开时,使用自己的设置自动在Debian笔记本电脑上从eth0到wlan0进行故障转移。

我的/ etc / network / interfaces:

# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
        bond-master bond0
        bond-primary eth0

# The secondary network interface
allow-hotplug wlan0
iface wlan0 inet manual
        pre-up sleep 5
        wpa-conf /etc/wpa_supplicant.conf
        bond-master bond0
        bond-primary eth0

# The bonding interface
allow-hotplug bond0
iface bond0 inet dhcp
        bond-slaves eth0 wlan0
        bond-primary eth0
        bond-mode active-backup
        bond-miimon 10
        bond_downdelay 10
        bond_updelay 4000

您可以轻松地将此设置扩展为包括多个无线设备。将 primary_reselect选项设置为better(自动选择最快的链接)应该会有所帮助。

有关更多信息,请参见https://wiki.linuxfoundation.org/networking/bondinghttps://wiki.debian.org/Bonding

(当然)还有Linux内核文档,网址https://www.kernel.org/doc/Documentation/networking/bonding.txt

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.