Разбираемся с приоритетом -999: как изменить порядок подключения в Linux
Изменение порядка подключения сетевых интерфейсов в Linux может быть необходимо для различных задач, таких как настройка балансировки нагрузки или настройка безопасности. Однако, при этом могут возникнуть проблемы с приоритетом подключения, которые могут привести к тому, что передача данных не будет осуществляться через нужный интерфейс. В данной статье мы рассмотрим, как изменить приоритет подключения сетевых интерфейсов в Linux.
Определение приоритета подключения
Приоритет подключения в Linux определяется с помощью метрики. Метрика — это числовое значение, которое определяет приоритет интерфейса. Чем меньше значение метрики, тем выше приоритет интерфейса.
В Linux по умолчанию, метрика устанавливается автоматически при подключении интерфейса. Однако, при необходимости, можно изменить приоритет подключения с помощью установки своих значений метрики.
Изменение приоритета подключения
Для изменения приоритета подключения можно использовать утилиту iproute2. Для этого необходимо выполнить следующие шаги:
Эта команда выведет список всех сетевых интерфейсов с их текущими значениями метрики.
sudo ip route delete default sudo ip route add default via dev metric
Здесь — адрес шлюза, — имя интерфейса, — новое значение метрики.
Эта команда покажет обновленный список сетевых интерфейсов с новыми значениями метрики.
Заключение
Изменение приоритета подключения в Linux может быть необходимость для различных задач. Для изменения приоритета необходимо использовать утилиту iproute2 и настроить метрики для сетевых интерфейсов на нужные значения. Рекомендуется использовать новые значения метрики, отличные от -999, поскольку это значение может использоваться интерфейсами по умолчанию.
Как мне установить приоритет сетевых подключений в Ubuntu?
Если компьютер с Ubuntu 11.04 подключен к WiFi и 3G одновременно, как мне установить приоритет, чтобы приложения (браузер и т. Д.) Сначала использовали WiFi? Если это не доступно, он должен использовать 3G.
В принципе, я хотел бы установить порядок, в котором используются сетевые подключения.
Редактировать: я ищу более простой подход, который был бы полезен для тех, кто просто удобен и не является экспертом в Ubuntu / Linux.
Я удивлен , никто не упомянул простейшую команду , чтобы сделать это: ifmetric . Может быть установлен с помощью sudo apt-get install ifmetric . Эта команда может использоваться для изменения метрики любого интерфейса. Интерфейс с более низкой метрикой является предпочтительным для Интернета.
Чтобы использовать это, сначала посмотрите метрики с помощью route команды:
$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.42.0.1 0.0.0.0 UG 100 0 0 eth0 0.0.0.0 10.42.0.2 0.0.0.0 UG 600 0 0 wlan0
Здесь eth0 имеет более низкую метрику, поэтому будет предпочтительнее, чем wlan0 . Если вы хотите отдать предпочтение wlan0 , то уменьшите его показатель:
Теперь таблица маршрутизации будет выглядеть так:
$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.42.0.2 0.0.0.0 UG 50 0 0 wlan0 0.0.0.0 10.42.0.1 0.0.0.0 UG 100 0 0 eth0
Теперь Linux будет использовать wlan0 для Интернета. Изменение будет отражено немедленно.
Отличный ответ. Спасибо (также для маршрута -n). Мне пришлось перезагрузить компьютер после установки ifmetric, чтобы команда сменила метрику
Как сделать это изменение постоянным (я хочу, чтобы случайно не использовать мою точку доступа iPhone)
@ThorstenNiehues: Быстрое решение приходит на ум , чтобы сделать его постоянным, чтобы добавить ifmetric команды в кронтаб, делая , crontab -e а затем добавить строку в конце: @reboot sudo ifmetric wlan0 50 .
Оно работает. Но я не могу получить доступ к локальным машинам после этого (например, через браузер). Есть идеи? Спасибо.
@tomasb: интересное сомнение. Это, однако, ожидается, так как изменение предпочтений интерфейса приведет вас в локальную сеть предпочтительного интерфейса. Одним из простых способов получить доступ к локальным машинам было бы получить к ним доступ с помощью виртуальной машины. Однако лучшие решения должны существовать. Дайте мне подумать и ответить.
Установка метрик — это то, как вы меняете приоритеты. Более высокая метрика является более «дорогой» в использовании, поэтому ОС будет использовать интерфейсы с самой низкой метрикой, если ей необходимо маршрутизировать трафик. В случае отключения интерфейса с более низкой метрикой он будет использовать интерфейс с более высокой метрикой, поскольку он является единственным интерфейсом, который можно использовать для маршрутизации трафика в эту конкретную сеть / пункт назначения.
Метрики указаны в файле / etc / network / interfaces , ссылки на документацию.
Используйте любой текстовый редактор для редактирования файла, определения сетей, просто измените metric параметр и сохраните. Перезагрузка — это самый простой способ сбросить все значения, не вдаваясь в подробности перезапуска сетевых служб.
Гарри — Спасибо за ответ — Сеть, которой я интересуюсь eth1, показана в «ifconfig», но не в «/ etc / network / interfaces». Что отображается в «ifconfig» и что в «/ etc / network / interfaces»?
Добавление eth0 в «/ etc / network / interfaces» более рискованно. Вы можете попробовать ifconfig от имени root, чтобы изменить метрику для интерфейса (проверьте, что он остается там после загрузки).
Когда я запустил «sudo ifconfig eth1 metric 4», я получил следующую ошибку «SIOCSIFMETRIC: операция не поддерживается». goo.gl/UhXBJ говорит: «Кроме того, не все системы используют аргумент метрики. . При настройке системы Linux вы добавляете явную команду маршрутизации для каждого интерфейса. «Похоже, в Ubuntu нет прямого подхода, подобного пользовательскому интерфейсу для начинающего пользователя.
Похоже, Linux выбирает самый быстрый адаптер после быстрого теста скорости на всех адаптерах. Метрика больше не поддерживается во многих дистрибутивах. Вы все еще можете пытаться диктовать вещи через «/ etc / network / interfaces», но я не знаю, насколько вы будете успешны. Смотрите также этот вопрос .
Самое простое решение, которое делают все, это просто отключить интерфейс, который вы не хотите использовать, или ограничить его «Использовать это соединение только для ресурсов в своей сети» (если у вас также есть принтер или что-то еще на этом тот же роутер).
- Приоритизация интерфейсов для общего трафика осуществляется путем манипулирования метриками маршрутизации. Каждый маршрут имеет связанные параметры, такие как количество переходов и пропускная способность. Смотрите параметр «метрика» на странице route руководства для команды.
$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.254 255.255.255.255 U 0 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 256 0 0 eth0
В MS Windows, но не в Linux, netstat -nr команда выводит ту же информацию, что и route print . Включая метрики маршрутизации.
На странице руководства для маршрута «Метрика« Расстояние »до цели (обычно учитывается в прыжках). Оно не используется последними ядрами, но может быть необходимо для демонов маршрутизации». Я не уверен, что на обычном Ubuntu Desktop параметр Metric окажет какое-либо влияние.
@PraveenSripati — я не верю, что вы дали 100 ваших с трудом заработанных представителей за такой ответ — технически правильно, но это не поможет вам или мне. 🙁 Я тоже ищу конкретную команду.
Я на самом деле не пробовал, но NCD (Network Configuration Daemon — 1) можно использовать для этой цели. Сайт утверждает, что облегчает настройку сети. Синтаксис кажется простым.
# Ждите какого-то сетевого соединения. Предпочитаю eth1, поставив его перед eth0.
list («NET-eth1», «NET-eth0») pnames;
Вы правы, мое программное обеспечение NCD делает это хорошо; пример там работает как есть. Я должен отметить, однако, что pnames список на самом деле является просто аргументом к multidepend() утверждению на следующей строке — это тот, который реализует приоритеты. Механизм, лежащий в основе этого, заключается в том, что когда он eth1 появляется, когда eth0 он уже запущен, он выполняется multiprovide(«NET-eth1»); , потому что NET-eth1 находится впереди NET-eth0 , сразу multidepend() же спускается и возвращается, но eth1 вместо этого выставляет переменные из процесса eth0 .
Это все из-за метрик маршрута. Вы хотите удалить маршрут по умолчанию с самой низкой метрикой, а затем восстановить старый маршрут с более высокой метрикой. Пожалуйста, следуйте командам ниже.
Допустим, ваша таблица маршрутизации выглядит так:
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.16.87.254 0.0.0.0 UG 100 0 0 ens38 0.0.0.0 192.168.151.2 0.0.0.0 UG 101 0 0 ens33 10.16.86.64 0.0.0.0 255.255.255.248 U 100 0 0 ens38 10.16.87.254 0.0.0.0 255.255.255.255 UH 100 0 0 ens38 10.16.88.6 10.16.87.254 255.255.255.255 UGH 100 0 0 ens38 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens38 192.168.151.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
Теперь удалите шлюз по умолчанию
# route delete default gateway
Теперь восстановите старый шлюз по умолчанию (обратите внимание, что показатель в этом случае выше 102, чем текущий маршрут по умолчанию 101)
# route add default gw 10.16.87.254 metric 102 dev ens38 # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.151.2 0.0.0.0 UG 101 0 0 ens33 0.0.0.0 10.16.87.254 0.0.0.0 UG 102 0 0 ens38 10.16.86.64 0.0.0.0 255.255.255.248 U 100 0 0 ens38 10.16.87.254 0.0.0.0 255.255.255.255 UH 100 0 0 ens38 10.16.88.6 10.16.87.254 255.255.255.255 UGH 100 0 0 ens38 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens38 192.168.151.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
Это работает. Примечание для любых других новичков (мне пришлось прочитать это пару раз, чтобы следить за тем, что происходило): на шаге 1, приведенном выше, удаляется запись для Gateway = 10.16.87.254 , которая имеет UG наименьшее значение Metric , а на шаге 2 возвращается на более высокое значение, Metric поэтому все еще доступно в качестве резервной копии на случай, если 192.168.151.2 недоступно.
[Обновление] Начиная с Ubuntu 18.04 LTS (сервер), netplan это оболочка по умолчанию для управления сетью. Настройка Netplan по умолчанию выполняется через файл YAML /etc/netplan/01-netcfg.yaml (более подробно здесь ).
Метрика маршрутизации определяется параметром » metric «, который ожидает положительное целое число ( 100 обычно это значение по умолчанию). Вот пример со справочной страницы:
network: version: 2 renderer: networkd ethernets: eno1: addresses: - 10.0.0.10/24 - 11.0.0.11/24 nameservers: addresses: - 8.8.8.8 - 8.8.4.4 routes: - to: 0.0.0.0/0 via: 10.0.0.1 metric: 100 - to: 0.0.0.0/0 via: 11.0.0.1 metric: 100
Маршрут с наименьшим metric (длина пути) становится «предпочтительным» шлюзом. (Используйте: sudo netplan try для включения изменений)
Обратите внимание, что в среде роуминга (несколько подключений, включение и выключение) может потребоваться установить для параметра optional (логическое значение) значение true (по умолчанию — false):
network: version: 2 ethernets: enred: dhcp4: yes dhcp4-overrides: route-metric: 100 engreen: dhcp4: yes dhcp4-overrides: route-metric: 200 # this is plugged into a test network that is often # down - don't wait for it to come up during boot. optional: true
Обратите внимание на немного другой синтаксис для метрики маршрута в случае соединений DHCP.
Вы также можете использовать NetworkManager в качестве средства визуализации, которое, как я полагаю (я еще не проверял), позволит вам просматривать / редактировать эту часть конфигурации также с помощью инструментов GUI.
renderer (Скалярное)
Используйте данный сетевой бэкэнд для этого определения. В настоящее время поддерживаются networkd и NetworkManager . Это свойство может быть указано глобально networks: , для типа устройства (например, ethernets: ) или для конкретного определения устройства. По умолчанию это networkd .
(Самый последний «большой» пример на странице ссылок показывает такое гибридное использование обоих средств визуализации).