我有一台设备通过以太网连接到一个网络,并通过 wifi 连接到另一个网络。我使用 netctl 来管理接口。当两个 netctl 配置文件都处于活动状态时,配置如下所示:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether b8:27:eb:eb:ab:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.1.200/21 brd 192.168.7.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::ba27:ebff:feeb:abdc/64 scope link
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether b8:27:eb:be:fe:89 brd ff:ff:ff:ff:ff:ff
inet 10.10.0.89/23 brd 10.10.1.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
inet6 fe80::ba27:ebff:febe:fe89/64 scope link
valid_lft forever preferred_lft forever
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.10.0.1 0.0.0.0 UG 303 0 0 wlan0
10.10.0.0 0.0.0.0 255.255.254.0 U 303 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.248.0 U 0 0 0 eth0
我注意到,当两个 netctl 配置文件都处于活动状态时,当我指定以太网接口时,我可以成功 ping 主机 (google.com),但当我指定 wifi 接口时,ping 失败:
$ ping -c4 -Ieth0 google.com
PING google.com (74.125.136.100) from 192.168.1.200 eth0: 56(84) bytes of data.
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=1 ttl=44 time=21.4 ms
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=2 ttl=44 time=21.3 ms
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=3 ttl=44 time=21.10 ms
64 bytes from 74.125.136.100 (74.125.136.100): icmp_seq=4 ttl=44 time=37.1 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7ms
rtt min/avg/max/mdev = 21.317/25.440/37.086/6.729 ms
$ ping -c4 -Iwlan0 google.com
PING google.com (74.125.136.138) from 10.10.0.89 wlan0: 56(84) bytes of data.
--- google.com ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 154ms
当我看到这种行为时,我尝试拔掉以太网电缆,之后我仍然无法使用 wlan0 ping 通,并且我注意到 eth0 保留了其 IP 地址、网关等。唯一改变的是它报告state DOWN
而不是state UP
。
然后我netctl stop my-ethernet-profile
跑到实际上真正停止配置文件,之后我可以从 wlan0 成功 ping 通。因此,ICMP 不会在 wlan0 上被阻止...当 eth0 的配置文件实际停止时,一切看起来都很好,只是在它运行时则不然(无论接口是UP
或DOWN
)。
所以,我试图理解几件事:
- 当两个设备都连接时(或者更准确地说,当两个 netctl 配置文件都处于活动状态时),为什么 wifi ping 会失败?
- 为什么即使系统识别出以太网接口未连接,它仍保留其配置?
- 有没有办法配置 netctl 在接口关闭时停止配置文件?
- 当状态从 转换为 时,有没有办法运行任意
UP
脚本DOWN
?例如,如果我需要netctl stop my-ethernet-profile
在电缆断开时运行?
最后一点,我知道有一些方法可以进行绑定接口或 WiFi 故障转移,但这是针对特定用途的情况。这听起来像是我在重新发明轮子,但这是有充分理由的。
答案1
我不太熟悉,netctl
但您的基本问题与您的内核路由表指定了两个默认网关这一事实有关。
当两个设备都连接时(或者更准确地说,当两个 netctl 配置文件都处于活动状态时),为什么 wifi ping 会失败?
这里的问题是由于您的路由表包含两个默认网关:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.10.0.1 0.0.0.0 UG 303 0 0 wlan0
当路由发生冲突时(就像这两个一样),内核会选择具有最低“度量”的路由(在本例中为 eth0,值为“0”),或者我认为第一个添加的路由。
原因 ping 到远程主机当您在示例中指定无线接口时失败ping -Iwlan0
,很可能是内核不知道如何使用您指定的接口路由到该远程主机,因为从技术上讲,默认网关(具有最低指标)是通过另一个接口到达的。这些 ping 很可能会进入 bitbucket。
冗余
如果您正在寻找冗余互联网以防一侧或另一侧发生中断,您可能需要编写自己的 shell 脚本来执行以下操作:
- 检测主网关接口上何时没有流量流动
- 更改内核路由表以使用默认 GW 的新接口
- 监控主接口的流量(UP 并且可以到达远程主机)
- 重新配置路由表以返回主接口。
注意:netctl 设置有线到无线故障转移如果您想确保基本的第 1 层连接(电缆拔出或 WiFi AP 关闭)可能会有一些用处,但通常两个接口需要位于同一网络上,并且基本上从同一网关获取互联网。
有没有办法配置 netctl 在接口关闭时停止配置文件?
我相信您可以使用 preup 和 predown 指令来做到这一点。
ExecUpPost='ifconfig wlan0 down|| true'
ExecDownPre='ifconfig wlan0 up|| true'
查看/etc/netctl/hooks/
文档中的 。