我有一台 Devuan Chimaera 笔记本电脑(GNU/Linux,基于 Debian),具有以太网和 wifi 连接。当我连接到 wifi 并拔出以太网电缆时,我希望数据包不再从以太网端口路由,而是通过 wifi 路由(单独使用时工作正常)。
事实并非如此 - 为了 ping 1.1.1.1,我必须将 ping 绑定到 wifi 适配器 - 检查“ip 路由列表”显示以下内容:
default via 192.168.188.1 dev wlxb8b7f1d4cb8f proto dhcp metric 600
192.168.188.0/24 dev eth0 proto kernel scope link src 192.168.188.33 linkdown
192.168.188.0/24 dev wlxb8b7f1d4cb8f proto kernel scope link src 192.168.188.34 metric 600
当我删除 eth0 上的默认路由时,一切正常。内核知道链接已关闭,那么为什么它会通过无效接口路由数据包?
作为参考,我使用的是 network-manager-gnome 1.20.0-3。
答案1
我将忽略 NetworkManager 的任何干扰。这个假设可能是错误的,因为可能存在两个具有不同指标的默认路由,而不是 OP 的单个路由,因此可能仍需要与此类工具进行额外的集成。如果下面的切换消失,则可能可以通过使用 中的某个脚本将其重新启用/etc/NetworkManager/dispacher.d/
。这是相关文件或手册页:NetworkManager-dispatcher(8)
(手册页以前可能不可用,但该功能可用)但我不会讨论这部分。
可以通过切换界面属性来轻松解决这个问题ignore_routes_with_linkdown
更改路线评估:
ignore_routes_with_linkdown - 布尔值
忽略链接断开的路由执行 FIB 查找时。
此切换自Linux 内核 4.2。
前:
default via 192.168.188.1 dev wlxb8b7f1d4cb8f proto dhcp metric 600 192.168.188.0/24 dev eth0 proto kernel scope link src 192.168.188.33 linkdown 192.168.188.0/24 dev wlxb8b7f1d4cb8f proto kernel scope link src 192.168.188.34 metric 600
$ ip route get 192.168.188.1
192.168.188.1 dev eth0 src 192.168.188.33 uid 1000
cache
此处默认网关仍可在 上到达eth0
,这意味着查找该网关的 ARP 请求eth0
也可能会通过,而它应该可在 上到达(并在 上进行 ARP 查询)wlxb8b7f1d4cb8f
。这种不对称路由会阻碍正确的连接。
/etc/sysctl.conf
切换设置(在 中或在 中的文件中充分使用/etc/sysctl.d/
):
# sysctl -w net.ipv4.conf.eth0.ignore_routes_with_linkdown=1
net.ipv4.conf.eth0.ignore_routes_with_linkdown = 1
后:
$ ip route
default via 192.168.188.1 dev wlxb8b7f1d4cb8f proto dhcp metric 600
192.168.188.0/24 dev eth0 proto kernel scope link src 192.168.188.33 dead linkdown
192.168.188.0/24 dev wlxb8b7f1d4cb8f proto kernel scope link src 192.168.188.34 metric 600
现在,该路线除了意味着它将在路线查找中被忽略之外eth0
,还获得了一个额外的属性。dead
linkdown
$ ip route get 192.168.188.1
192.168.188.1 dev wlxb8b7f1d4cb8f src 192.168.188.34 uid 1000
cache
现在选择正确的接口以使用网关 192.168.188.1 访问互联网。
注意:由于两个接口上似乎都使用同一个 LAN,因此可以考虑使用一种完全不同的方法粘合两个接口都处于主动备份模式。无线不会阻止这种使用(它只会阻止客户端桥接),但可能需要进行一些配置调整(例如:更改绑定接口上 MAC 地址的默认处理方式,这可能会干扰 DHCP)。