ros*_*six 22 linux networking debian iproute gateway
我希望在同一子网中有多个 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
Run Code Online (Sandbox Code Playgroud)
这适用于连接到主机:如果其中一个接口出现故障,我仍然可以通过 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关闭的方式转到默认网关。
那可能吗?我需要做什么才能实现这样的功能?
ros*_*six 27
自己解决了。关于您可以使用 Linux 进行的网络工作的信息似乎很少,因此我决定详细记录并解释我的解决方案。这是我的最终设置:
第一步:为每个接口创建一个新的路由表/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
Run Code Online (Sandbox Code Playgroud)
第二步:网络配置中/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
Run Code Online (Sandbox Code Playgroud)
如果您键入,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
Run Code Online (Sandbox Code Playgroud)
这告诉我们从 IP 地址“192.168.178.99”传入或传出的流量将使用 rt1 路由表。到现在为止还挺好。但是本地生成的流量(例如,您想从机器 ping 或 ssh 到其他地方)需要特殊处理(请参阅问题中的大引用)。
中的前四行帖子/etc/network/interfaces很简单,可以在互联网上找到解释,第五行也是最后一行是使魔术发生的行:
post-up ip r add default via 192.168.178.1 metric 100 dev eth0
Run Code Online (Sandbox Code Playgroud)
请注意我们如何没有为这个 post-up 行指定一个路由表。如果不指定路由表,信息将保存在main我们在 中看到的路由表中ip rule show。这个 post-up 行将默认路由放在“主”路由表中,用于本地生成的流量,而不是对传入流量的响应。(例如,您服务器上的 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
Run Code Online (Sandbox Code Playgroud)
我们可以看到主路由表有三个默认路由,尽管度量不同。最高优先级是 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出现问题时执行(即 NIC 故障或有人拔插头)。
最后一步:输入ifplugd。这是一个守护进程,它监视接口并ifup/ifdown在您拔掉插头或 wifi 连接出现问题时执行/etc/default/ifplugd:
INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"
Run Code Online (Sandbox Code Playgroud)
您现在可以拔下插头eth0,传出流量将切换到wlan1,如果重新插入插头,传出流量将切换回eth0。只要三个接口中的任何一个都可以工作,您的服务器就会保持在线状态。要连接到您的服务器,您可以使用 eth0 的 IP 地址,如果失败,则使用 wlan1 或 wlan0 的 IP 地址。
Thi*_*ilo 18
Linux 提供了比脚本化解决方法更好的解决方案:主动备份绑定。
这样你的机器就只有一个ip地址(和一个mac地址),如果一个接口不可用,就会自动透明地切换接口。不会中断任何 TCP 连接(无论是内部局域网还是互联网)。
当我断开笔记本电脑与扩展坞的连接时,我自己使用此设置自动从 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
Run Code Online (Sandbox Code Playgroud)
您可以轻松扩展此设置以包含多个 wlan 设备。将
primary_reselect选项设置为better(自动选择最快的链接)在这里应该会有所帮助。
有关更多信息,请参阅https://wiki.linuxfoundation.org/networking/bonding和https://wiki.debian.org/Bonding
以及(当然)https://www.kernel.org/doc/Documentation/networking/bonding.txt 上的 linux 内核文档
| 归档时间: |
|
| 查看次数: |
60605 次 |
| 最近记录: |