В Ubuntu Linux, как я могу убедиться, что метрика шлюза по умолчанию ниже, чем у любых других шлюзов?

Вопрос или проблема

Я столкнулся с проблемой с виртуальной машиной с двумя сетевыми интерфейсами (например, eth0 и eth1). Например, все работает, когда таблица маршрутизации выглядит так:

$ sudo route -n
default         10.100.0.1        0.0.0.0         UG    20100      0        0 eth0
default         192.168.100.1     0.0.0.0         UG    20101      0        0 eth1

Шлюз по умолчанию 10.100.0.1 обрабатывает весь трафик, включая запросы DNS и т. д.

На выходных что-то происходит (я не уверен, что именно), но когда я прихожу в понедельник, я вижу, что мой желаемый шлюз по умолчанию теперь имеет более ВЫСОКИЙ метрик, поэтому он не используется.

$ sudo route -n
default         192.168.100.1     0.0.0.0         UG    20101      0        0 eth1
default         10.100.0.1        0.0.0.0         UG    20102      0        0 eth0  <<< ПРОБЛЕМА 20102

Локальный сегмент 192.168.100.1 имеет соединение только с хостами, используемыми для тестирования. Шлюз по умолчанию создается автоматически, когда я включаю СЕТЕВОЙ СЕГМЕНТ (я выполняю эту виртуальную машину в vSphere).

В результате мои DNS-серверы недоступны. Обходной путь – перезагрузить хост или удалить и заново добавить шлюз по умолчанию.

Этот вопрос объясняет проблему: Почему удаление маршрута шлюза и его повторное добавление внезапно приводит к тому, что маршрутизация начинает работать?

Я пытаюсь найти решение этой проблемы. Решение должно гарантировать, что желаемый шлюз по умолчанию всегда будет иметь самый низкий метрик из двух определенных шлюзов.

Поиск решений

Я не нашел правильный поисковый термин для проблемы, с которой сталкиваюсь, поэтому я читал о том, как работают шлюзы Linux, что не помогло в ответах на мой вопрос.

Во-первых, я бы использовал ip route, а не просто route. Пакет iproute2 вскоре заменит net-tools.

Хотя есть лучшие решения, которые я мог бы предложить, если бы у меня было больше деталей о вашей настройке, например: используете ли вы netplan или у вас интерфейсы настроены с помощью более старой конфигурации интерфейсов.

Это решение должно работать с любой версией Ubuntu.

Создайте файл в /etc/network/if-up.d/ и сделайте его исполняемым от имени root

#!/bin/sh
# имя файла: eth1.sh

if [ "$IFACE" = eth1 ]; then
  ip route del default dev eth1
fi

Основываясь на дополнительной информации, я бы предложил лучшее решение:

Создание файла /etc/systemd/network/99-eth1.network

[Match]
Name=eth1

[Network]
Address=192.168.100.100/24 *измените на необходимый вам IP-адрес*
DHCP=no
DefaultRouteOnDevice=false

Это обеспечит, что vSphere не выделяет шлюз через dhcp. Я подозреваю, что что-то изменилось в вашем vSphere, обновление или изменение настройки, которые привели к тому, что ваша виртуальная машина получила шлюз через dhcp. Или по какой-то причине порядок, в котором ваши сетевые интерфейсы настраивались во время загрузки, изменился. Если eth1 настраивается первым, тогда метрика маршрута добавляет стоимость достижения адреса шлюза через eth1 к eth0, следовательно, более высокая метрика.

Если вы хотите на 110% гарантировать, что eth0 настраивается первым и имеет более низкую метрику, вы также можете создать следующий файл, если eth0 получает свой адрес через dhcp, если он статически назначен, измените DHCP на no ниже и добавьте раздел адреса, и введите адрес шлюза

/etc/systemd/network/80-eth0.network

[Match]
Name=eth0

[Network]
DHCP=ipv4

[Route]
Gateway=_dhcp4
Metric=5

Коллега предложил другое решение, которое заключалось в использовании командного интерфейса nmcli, основываясь на ответе в Ask Ubuntu здесь Установить метрику интерфейса сети на фиксированное значение

Решение устанавливает метрику на желаемом интерфейсе eth0 в вопросе на низкое значение.

ПРИМЕЧАНИЕ: Я не уверен, как/почему более низкая метрика сохраняется, когда интерфейс eth0 перезапускается, но это сработало во время тестирования.

nmcli c edit eth0 # Редактировать соединение
set ipv4.route-metric 5
save
quit
systemctl restart NetworkManager

Как этот ответ, так и выбранный ответ сработали для OP.

Ответ или решение

Для решения проблемы с настройкой маршрутизаторов в Ubuntu Linux, особенно в случае виртуальной машины с двумя сетевыми интерфейсами (например, eth0 и eth1), важно обеспечить, чтобы основной шлюз имел более низкий метрик, чем другие маршруты. Рассмотрим шаги, необходимые для устойчивой конфигурации вашего окружения.

Понимание маршрутизации и метрики шлюза

При настройке маршрутизации в Linux каждый маршрут может иметь метрику, указывающую приоритет этого маршрута. Чем ниже значение метрики, тем выше приоритет. Если вы хотите, чтобы шлюз eth0 использовался по умолчанию, его метрика должна быть меньше, чем метрика eth1.

Почему метрика могла измениться?

Существует множество факторов, которые могут привести к изменению метрики при перезагрузке или отключении интерфейсов, включая автоматическое получение настроек через DHCP. Возможно, что в вашем окружении гипервизора vSphere произошли изменения, которые повлияли на порядок инициализации сетевых интерфейсов или их настройки.

Способы управления метрикой маршрутов

1. Использование ip route

Один из популярных способов настройки маршрутов — использовать утилиту ip. Вы можете настроить метрику вручную, добавив маршрут с нужной метрикой в командной строке.

sudo ip route add default via 10.100.0.1 dev eth0 metric 100
sudo ip route add default via 192.168.100.1 dev eth1 metric 200

2. Настройка через Netplan

Если вы используете более новые версии Ubuntu, возможно, вам следует использовать Netplan для статической конфигурации сетевых интерфейсов. Создайте файл конфигурации, например, /etc/netplan/01-netcfg.yaml, и добавьте:

network:
  version: 2
  ethernets:
    eth0:
      dhcp4: yes
      routes:
        - to: 0.0.0.0/0
          via: 10.100.0.1
          metric: 100
    eth1:
      dhcp4: yes
      routes:
        - to: 0.0.0.0/0
          via: 192.168.100.1
          metric: 200

После внесения изменений выполните sudo netplan apply.

3. Управление через NetworkManager

Если ваш интерфейс управляется NetworkManager, вы можете использовать nmcli для изменения метрики. Используйте следующие команды:

nmcli connection edit eth0
set ipv4.route-metric 100
save
quit
systemctl restart NetworkManager

Аналогично, вы можете настроить интерфейс eth1 с более высокой метрикой:

nmcli connection edit eth1
set ipv4.route-metric 200
save
quit
systemctl restart NetworkManager

Заключение

Настройка метрики маршрута в Ubuntu — это важный этап работы с многоинтерфейсными системами. Применяя вышеуказанные методы, вы можете гарантировать, что основной шлюз всегда будет иметь более низкую метрику, что обеспечит его использование для всех исходящих соединений. Таким образом, любой сбой или изменение в виртуальной среде не повлияет на ваш сетевой доступ, гарантируя стабильную работу вашей виртуальной машины. Если возникнут дополнительные вопросы или несоответствия в работе, рекомендуется также внимательно следить за логами системы и конфигурациями гипервизора.

Оцените материал
Добавить комментарий

Капча загружается...