目标
插入以太网电缆时,让以太网优先于无线
方法
在进行了大量的谷歌搜索和阅读之后,我已经到了这样的地步:相信我应该做的是类似的事情
nmcli connection modify [id-of-ethernet-interface] ipv4.route-metric 200
nmcli connection modify [id-of-ethernet-interface] ipv6.route-metric 200
其中 200 是比无线指标更低的值,以使以太网优先于无线。
结果
让我困惑的是我执行上述命令并重新启动后得到的报告route -n
(为了更好的措施),事实上这似乎并没有达到我的目标
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 123.456.89.1 0.0.0.0 UG 600 0 0 wlp1s0
0.0.0.0 123.456.89.1 0.0.0.0 UG 20200 0 0 enp0s31f6
123.456.89.0 0.0.0.0 255.255.255.192 U 200 0 0 enp0s31f6
123.456.89.0 0.0.0.0 255.255.255.192 U 600 0 0 wlp1s0
654.321.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s31f6
这些数字与我的命令执行有关,但对于那些说
0.0.0.0 123.456.89.1 0.0.0.0 UG 20200 0 0 enp0s31f6
654.321.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s31f6
第一行在我设置的 200 值之前有 20 前缀。根据我所运行的内容,这一点始终如一地应用;如果我将指标值更改为nmcli
500,route -n
将报告 20500。为什么会发生这种情况?它看起来确实不对,因为我说过我想要 200 或 500,而不是 20200 和 20500。
第二行有一个度量值,我不知道它来自哪里,而且我似乎根本无法影响它。如果有人能阐明这一点,我将不胜感激。
除了影响指标之外,这些命令看起来并没有产生任何有形的结果;我无法判断以太网是否优先,所以我认为不是。
其他发现
我发现很好奇,并且似乎正在努力一些程度,是使用$ sudo ifmetric enp0s31f6 200
.这会做两到三件事;
- 它影响接口的度量(
route -n
报告所有带有 Iface 的线路enp0s31f6
的值为 200) - 它会影响 Ubuntu 中的 UI(在右上角,我将看到以太网和无线图标切换之间的视觉切换,具体取决于我在命令中提供的指标值
ifmetric
) - 它有时
NETLINK: Error: File exists
向我抛出一个错误。同一命令的后续执行可能或者可能不会导致此错误
一些系统信息
- 精英笔记本 850 G5
- 乌班图18.04
- Ubuntu 安装是通过让安装程序使用整个光盘、启用加密、启用驱动程序的第 3 方下载等来完成的。
更新#1
$ nmcli c show
NAME UUID TYPE DEVICE
Wired connection 2 [n/a] ethernet enp0s31f6
WiFi1 [n/a] wifi wlp1s0
$ route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 [n/a] 0.0.0.0 UG 600 0 0 wlp1s0
0.0.0.0 [n/a] 0.0.0.0 UG 20200 0 0 enp0s31f6
[n/a] 0.0.0.0 255.255.255.192 U 200 0 0 enp0s31f6
[n/a] 0.0.0.0 255.255.255.192 U 600 0 0 wlp1s0
[n/a] 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s31f6
答案1
你这里有一堆问题:
- 您的有线 LAN 和无线 LAN 是通往同一子网的桥梁
123.456.89.0/24
- 如果您在这些网络上同时连接,您将拥有两个默认网关(这可以通过一些高级路由来解决
ip rules
) - 这些网关具有相同的地址,因为您在 wifi 和有线连接之间有一座桥梁。
也许您应该依靠外部脚本在插入以太网时自动停用 wifi,如下所示:
创建脚本/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh
。内容:
#!/usr/bin/env bash
name_tag="wifi-wired-exclusive"
syslog_tag="$name_tag"
skip_filename="/etc/NetworkManager/.$name_tag"
if [ -f "$skip_filename" ]; then
exit 0
fi
interface="$1"
iface_mode="$2"
iface_type=$(nmcli dev | grep "$interface" | tr -s ' ' | cut -d' ' -f2)
iface_state=$(nmcli dev | grep "$interface" | tr -s ' ' | cut -d' ' -f3)
logger -i -t "$syslog_tag" "Interface: $interface = $iface_state ($iface_type) is $iface_mode"
enable_wifi() {
logger -i -t "$syslog_tag" "Interface $interface ($iface_type) is down, enabling wifi ..."
nmcli radio wifi on
}
disable_wifi() {
logger -i -t "$syslog_tag" "Disabling wifi, ethernet connection detected."
nmcli radio wifi off
}
if [ "$iface_type" = "ethernet" ] && [ "$iface_mode" = "down" ]; then
enable_wifi
elif [ "$iface_type" = "ethernet" ] && [ "$iface_mode" = "up" ] && [ "$iface_state" = "connected" ]; then
disable_wifi
fi
要禁用该脚本,只需执行touch /etc/NetworkManager/.wifi-wired-exclusive
答案2
我相信这是 NetworkManager 通过将 20000 添加到度量值来惩罚它认为无法访问的连接。来自NetworkManager.conf 手册:
没有全局连接的设备的默认路由会受到路由度量 +20000 的惩罚
解决方案1
您可以尝试通过注释掉该选项uri=
或将其留空来禁用连接检查NetworkManager.conf
。
解决方案2
设置net.ipv4.conf.all.rp_filter = 2
于/etc/sysctl.conf
。提防可能存在信息泄露漏洞。
背景
这NetworkManager.conf 手册关于连接检查可能出现故障的原因有一个小解释:
请注意,您的发行版可能将 /proc/sys/net/ipv4/conf/*/rp_filter 设置为严格过滤。这对于每个设备的连接检查来说效果很差,它使用 SO_BINDDEVICE 在所有设备上发送请求。严格的 rp_filter 设置将拒绝任何响应,并且除最佳路由之外的所有响应的连接检查都将失败。
在我的发行版中启用了严格过滤:
$ /usr/sbin/sysctl net.ipv4.conf.all.rp_filter
net.ipv4.conf.all.rp_filter = 1
价值1
意思是严格过滤这就是连接检查失败的原因。 systemd 人员将其更改为2
(松散过滤)有争议的提交那介绍了漏洞,因此被发行版恢复。