我希望在同一子网中拥有多个 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
转到默认网关。eth0
wlan0
eth0
那可能吗?我需要做什么才能实现这样的功能?
答案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 尝试发送电子邮件。)
这三个接口都在主路由表中放置了一条默认路由,尽管具有不同的度量标准。让我们看一下路由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
.
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_reselect
为better
(自动选择最快的链接)应该会有所帮助。
欲了解更多信息,请参阅https://wiki.linuxfoundation.org/networking/bonding和https://wiki.debian.org/Bonding
(当然)还有 Linux 内核文档:https://www.kernel.org/doc/Documentation/networking/bonding.txt