在 Ubuntu 18.04 上如何使以太网优先于 wifi?

在 Ubuntu 18.04 上如何使以太网优先于 wifi?

目标

插入以太网电缆时,让以太网优先于无线

方法

在进行了大量的谷歌搜索和阅读之后,我已经到了这样的地步:相信我应该做的是类似的事情

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 前缀。根据我所运行的内容,这一点始终如一地应用;如果我将指标值更改为nmcli500,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(松散过滤)有争议的提交那介绍了漏洞,因此被发行版恢复。

相关内容