Как я могу сделать Ethernet иметь приоритет над Wi-Fi на Ubuntu 18.04?


13

Цель

Пусть ethernet имеет приоритет над беспроводной сетью, когда кабель Ethernet подключен

метод

Пройдя немало гуглов и прочитав, я пришел к тому, что считаю, что то, что я должен делать, - это что-то вроде

nmcli connection modify [id-of-ethernet-interface] ipv4.route-metric 200
nmcli connection modify [id-of-ethernet-interface] ipv6.route-metric 200

где 200 - это более низкое значение, чем показатель беспроводной сети, чтобы Ethernet имел приоритет над беспроводной сетью.

Результаты

Меня сбивает с толку сообщения, которые я получаю 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

Первая строка имеет префикс 20 перед значением 200, которое я установил. Это постоянно применяется в зависимости от того, что я бегу; Если я изменю значение показателя nmcliдо 500, route -nскажу 20500. Почему это происходит? Это, конечно, не выглядит правильно, так как я заявил, что хотел либо 200, либо 500, а не 20200 и 20500.

Вторая строка имеет метрическое значение, и я понятия не имею, откуда она взялась, и я никак не могу повлиять на нее. Если кто-то может пролить свет на это, я благодарен.

Не похоже, что эти команды оказываются в чем-то осязаемом, кроме влияния на метрики; Я не могу сказать, что этот Ethernet имеет приоритет, поэтому я предполагаю, что это не так.

Другие выводы

То, что я нашел любопытным, и, кажется, работает в некоторой степени, это использование $ sudo ifmetric enp0s31f6 200. Это делает две-три вещи;

  • Влияет на показатель интерфейса ( route -nсообщает, что все строки с Iface enp0s31f6имеют значение 200)
  • Это влияет на пользовательский интерфейс в Ubuntu (в правом верхнем углу я вижу визуальное переключение между переключением значков Ethernet и беспроводной сети в зависимости от значений метрики, которые я предоставляю в 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

Ethernet должен быть предпочтительным по умолчанию. Странный. Выход nmcli c showтакой же, как route -nи выход?
Томми

Смотрите мой обновленный вопрос.

Пожалуйста, обновите ваш вопрос с этими результатами вместо того, чтобы оставлять их в комментарии.
Томми

Да, я понял довольно быстро, дамп комментариев не сработает. Я делаю поправки к редактированию. Дайте мне еще 1 минуту, и вы получите полный вывод. Готово.

для конкретного случая, когда ethernet и wifi совместно используют одну и ту же локальную сеть, использование связующего устройства в режиме активного резервного копирования должно упростить вещи: плавное переключение при сбое и только один маршрут: соединение - Debian Wiki (конфигурацию просто нужно преобразовать в сетевой менеджер)
AB

Ответы:


2

Вы накопили проблемы здесь:

  • Ваша кабельная локальная сеть и беспроводная локальная сеть являются мостом к одной подсети. 123.456.89.0/24
  • У вас будет два шлюза по умолчанию, если вы будете одновременно подключаться к этим сетям (это можно решить с помощью некоторой расширенной маршрутизации и ip rules)
  • Эти шлюзы имеют одинаковый адрес, так как у вас есть мост между Wi-Fi и кабельным соединением.

Может быть, вы должны полагаться на внешние скрипты для автоматической деактивации Wi-Fi, когда Ethernet подключен, как этот:

Создайте сценарий /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 :

default-route устройства без глобальной связи получают штраф +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(рыхлую фильтрацию) с спорной фиксацией , что введенные уязвимости , таким образом, вернулись на дистрибутивах.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.