我自己解决了。关于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地址。