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

13 networking ubuntu

目标

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

方法

在做了大量的谷歌搜索和阅读之后,我相信我应该做的是

nmcli connection modify [id-of-ethernet-interface] ipv4.route-metric 200
nmcli connection modify [id-of-ethernet-interface] ipv6.route-metric 200
Run Code Online (Sandbox Code Playgroud)

其中 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
Run Code Online (Sandbox Code Playgroud)

这些数字与我的命令执行有关,但对于那些说

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
Run Code Online (Sandbox Code Playgroud)

第一行在我设置的 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向我抛出错误。同一命令的后续执行可能会可能不会导致此错误

一些系统信息

  • EliteBook 850 G5
  • Ubuntu 18.04
  • 通过让安装程序使用整个光盘、启用加密、启用驱动程序的 3rd 方下载等方式进行 Ubuntu 安装。

更新 #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
Run Code Online (Sandbox Code Playgroud)

小智 3

你这里有一堆问题:

  • 您的有线 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
Run Code Online (Sandbox Code Playgroud)

要禁用该脚本,只需执行touch /etc/NetworkManager/.wifi-wired-exclusive