是否可以为出站连接设置多个默认网关?

是否可以为出站连接设置多个默认网关?

我希望在同一子网中拥有多个 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_metry_routing_on_a_server_with_multiple_default_gateways.html

我想要的是主路由表具有多个默认网关(一个 oneth0和一个 on ),并通过 default 和if is downwlan0转到默认网关。eth0wlan0eth0

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

答案1

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

  • 3个网卡: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

第二步: 中的网络配置/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 到其他地方)需要特殊处理(请参阅问题中的大引用)。

前四行post-up line/etc/network/interfaces很简单,可以在互联网上找到解释,第五行也是最后一行post-up line是让奇迹发生的那一行:

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

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

这三个接口都在主路由表中放置了一条默认路由,尽管具有不同的度量标准。让我们看一下路由mainip 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.

post-down 行确保ip rule show当接口关闭时相关路由表从路由策略数据库 ( ) 中删除,以保持一切整洁。

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

最后一步: 进入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 地址。

答案2

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

这样你的机器就只有IP 地址(和一个 MAC 地址),并在一个接口不可用时自动、透明地切换接口。不会中断任何 TCP 连接(无论是内部 LAN 还是互联网)。

当我从扩展坞断开笔记本电脑时,我自己使用此设置自动从 eth0 故障转移到我的 debian 笔记本电脑上的 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

您可以轻松扩展此设置以包含多个 WLAN 设备。将选项设置 primary_reselectbetter(自动选择最快的链接)应该会有所帮助。

欲了解更多信息,请参阅https://wiki.linuxfoundation.org/networking/bondinghttps://wiki.debian.org/Bonding

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

相关内容