Як я можу змусити 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.

Другий рядок має метричне значення, що я поняття не маю, звідки він походить, і я, здається, не впливаю на це взагалі. Якщо хтось може пролити світло на це, я вдячний.

Не схоже, що ці команди закінчуються чимось відчутним, крім впливу на показники; Я не можу сказати, що ця мережа має перевагу, тому припускаю, що це не так.

Інші висновки

Те, що мені здалося цікавим, і, здається, працює певною мірою, - це використання $ 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вихід 's?
Tommiie

Дивіться моє оновлене запитання.

Будь ласка, оновіть своє запитання з результатами, а не кидайте їх у коментар.
Tommiie

Так, я зрозумів досить швидко, скидання в коментарі не вийшло. Я вношу зміни до редакції. Дайте мені ще 1 хвилину, і ви отримаєте повний результат. Готово.

для конкретного випадку, коли Ethernet і Wi-Fi діляться однією і тією ж локальною мережею, використання пристрою зв’язку в режимі активного резервного копіювання повинно спростити речі: безперебійне відмовлення та лише один маршрут: Зв’язування - 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 :

маршрут пристроїв без глобального підключення отримує штраф +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(нестабільне фільтрування) суперечливим зобов'язанням, яке ввело вразливості , таким чином було повернуто дистрибутивом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.