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


13

目标

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

方法

经过大量的谷歌搜索和阅读后,我认为我应该做的事情与

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在我的错误。随后执行同一命令可能会可能不会导致此错误

一些系统信息

  • EliteBook 850 G5
  • Ubuntu 18.04
  • 通过让安装程序使用整个光盘,启用加密,为驱动程序启用第三者下载等方式进行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

默认情况下应首选以太网。奇怪。输出与的输出nmcli c show相同route -n吗?
Tommiie

看到我更新的问题。

请使用这些结果更新您的问题,而不要在评论中转储它们。
Tommiie

是的,我很快就意识到,转储到评论中不会成功。我正在修改编辑内容。再给我1分钟,您将获得完整的输出。完成。

对于以太网和wifi共享同一LAN的特定情况,在主动备份模式下使用绑定设备应该可以简化:无缝故障转移和仅一条路由:绑定-Debian Wiki(只需将配置转换为网络管理器)
AB

Answers:


2

您在这里堆积了很多问题:

  • 您的有线局域网和无线局域网是通往同一子网的桥梁 123.456.89.0/24
  • 如果您同时在这些网络上连接,则将有两个默认网关(这可以通过一些高级路由an来解决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


0

我相信这是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表示严格过滤,这是导致连接检查失败的原因。2有系统的人员通过有争议的提交将其更改为(松散过滤),该提交引入了漏洞,因此被发行版还原。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.