Установить маршрут по умолчанию в Debian Stretch с несколькими интерфейсами, настроенными через dhcp

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

На системе Debian Stretch с несколькими интерфейсами мне нужно определить маршрут по умолчанию через конкретный интерфейс ens3. Этот интерфейс получает свой IP-адрес 10.33.34.2 через DHCP.

Я подправил следующее руководство под свои нужды:

5.3. Современная сетевая конфигурация без GUI

Таким образом, я создал файл /etc/systemd/network/route.network с следующим содержимым

[Match]
Name=ens3

[Network]
Gateway=10.33.34.1

Тем не менее, маршрут по умолчанию не устанавливается корректно при загрузке.

Я включил отладку systemd-networkd согласно Как отладить systemd-networkd?

После перезапуска systemd-networkd я вижу следующее в логах:

21 авг 13:43:13 vpn systemd-networkd[15671]: ens3: Установка маршрутов
21 авг 13:43:13 vpn systemd-networkd[15671]: ens3: Не удалось установить маршрут: Сеть недоступна
21 авг 13:43:13 vpn systemd-networkd[15671]: ens3: Маршруты установлены
21 авг 13:43:13 vpn dhclient[15709]: Слушаю на LPF/ens3/52:54:00:3f:f1:d0
21 авг 13:43:13 vpn dhclient[15709]: Отправляю на LPF/ens3/52:54:00:3f:f1:d0
21 авг 13:43:13 vpn dhclient[15709]: Отправляю на Socket/fallback
21 авг 13:43:13 vpn dhclient[15709]: DHCPDISCOVER на ens3 к 255.255.255.255 порт 67 интервал 8
21 авг 13:43:13 vpn dhclient[15709]: DHCPREQUEST 10.33.34.2 на ens3 к 255.255.255.255 порт 67
21 авг 13:43:13 vpn dhclient[15709]: DHCPOFFER 10.33.34.2 от 10.33.34.1
21 авг 13:43:13 vpn dhclient[15709]: DHCPACK 10.33.34.2 от 10.33.34.1
21 авг 13:43:13 vpn systemd-networkd[15671]: ens3: Добавление адреса: 10.33.34.2/24 (действителен навсегда)

Кажется, что networkd пытается установить маршрут до того, как IP-адрес будет назначен через DHCP.

Как мне установить маршрут по умолчанию на конкретный интерфейс с помощью systemd?

== Изменение ==

Я ошибся, предположив, что systemd-networkd поднимает интерфейсы. Если я перезагружу систему, я вижу

$ sudo service systemd-networkd status
● systemd-networkd.service - Сетевая служба
   Loaded: loaded (/lib/systemd/system/systemd-networkd.service; disabled; vendor pres
  Drop-In: /etc/systemd/system/systemd-networkd.service.d
           └─10-debug.conf
   Active: inactive (dead)
     Docs: man:systemd-networkd.service(8)

Таким образом, конфигурация в /etc/systemd/network/route.network не имеет эффекта при загрузке. В настоящее время я задаюсь вопросом, какая служба отвечает за поднятие всех сетевых устройств.

== Изменение 2 ==

Эта статья Стивена Ивсона предоставляет хорошее понимание того, как сетевые устройства запускаются с помощью systemd-udevd и как изменить конфигурацию интерфейса.

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

Если все интерфейсы получают действительные предложения DHCP с маршрутом по умолчанию, тогда не будет возможности избежать конфигурации dhclient, чтобы игнорировать их – это не то, что можно сделать с systemd, udev или чем-либо другим, связанным с системой инициализации.

Один из способов сделать это описан здесь: вы создаете (конечно, также можно использовать редактор) фрагмент сценария оболочки в одной из директорий “hook” для dhclient,

cat << EOF > /etc/dhcp/dhclient-enter-hooks.d/restrict-default-route
## Только DHCP-сервер, говорящий с ens3, может дать нам маршрут по умолчанию.
## Другие интерфейсы получают только локальную конфигурацию сегмента.
case ${interface} in
  ens3)
    ;;
  *)
    unset new_routers
    ;;
esac
EOF

который будет принимать опцию routers с маршрутом по умолчанию только для ens3. Нет проблем с синхронизацией, нет проблем с определением, какие файлы systemd использовать, и маршрут будет действителен только когда ens3 будет активен и получит предложение DHCP.

Для Debian Stretch интерфейсы именуются с помощью udev, и базовая конфигурация происходит в /etc/network/interfaces. Как указано в изменении 2, множественные интерфейсы поднимаются в случайном порядке. Каждый получает корректную конфигурацию DHCP. Первый поднимаемый интерфейс задает маршрут по умолчанию. Нам нужно только принять маршрут по умолчанию для желаемого интерфейса. Это можно достигнуть с помощью hook для dhcpclient.

Добавьте новый скрипт hook /etc/dhcp/dhclient-enter-hooks.d/nodefaultroute:

#!/bin/sh
## Предотвратить DHCP-сервер на eth0 от принуждения установить маршрут по умолчанию

case ${interface} in
  ens8|ens9)
     printf "выполняется ip route delete default через $new_routers\n" 
     ip route delete default через $new_routers
  ;;
     *)
  ;;
esac

Где ens8|ens9 можно расширить, чтобы перечислить все интерфейсы, для которых маршрут по умолчанию не может быть принят.

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

Для настройки маршрута по умолчанию на Debian Stretch с несколькими интерфейсами, каждый из которых получает IP-адрес через DHCP, нужно учесть некоторые важные моменты. Когда на систему с несколькими интерфейсами подается запрос на получение DHCP, каждый интерфейс может установить свой собственный маршрут по умолчанию. Это может привести к тому, что маршруты будут устанавливаться в произвольном порядке, что нежелательно в вашей ситуации, когда вы хотите, чтобы маршрутизатор по умолчанию всегда использовал интерфейс ens3.

1. Использование dhclient для управления маршрутом

Для решения вашей проблемы рекомендуется использовать скрипты хуков в dhclient, которые позволят ограничить добавление маршрута по умолчанию только для интерфейса ens3. Мы создадим хук, который будет игнорировать маршруты по умолчанию для всех остальных интерфейсов.

2. Создание скрипта хука

Сначала создайте новый скрипт в директории хуков dhclient:

sudo nano /etc/dhcp/dhclient-enter-hooks.d/restrict-default-route

Добавьте в этот файл следующий код:

#!/bin/sh
# Этот скрипт позволяет устанавливать маршрут по умолчанию только для интерфейса ens3.

case ${interface} in
  ens3)
    # Разрешаем установить маршрут по умолчанию
    ;;
  *)
    # Убираем маршрут по умолчанию для других интерфейсов
    unset new_routers
    ;;
esac

Сохраните файл и закройте редактор. После этого необходимо сделать скрипт исполняемым:

sudo chmod +x /etc/dhcp/dhclient-enter-hooks.d/restrict-default-route

3. Проверка конфигурации

Теперь, когда у вас есть правильная настройка хука, следующая задача — убедиться, что текущая конфигурация интерфейсов включает правильные параметры DHCP. Убедитесь, что ваш файл конфигурации /etc/network/interfaces правильно настроен:

auto ens3
iface ens3 inet dhcp

4. Перезагрузка сетевых служб

Для применения изменений вам нужно перезапустить сетевые службы:

sudo systemctl restart networking
sudo systemctl restart dhclient

Или, в зависимости от вашей системы, вы можете перезагрузить всю систему:

sudo reboot

5. Проверка маршрутов

После перезагрузки системы проверьте, какой маршрут установлен по умолчанию с помощью команды:

ip route

Вы должны увидеть, что маршрутизация по умолчанию настроена на ваш интерфейс ens3 и что другие интерфейсы не влияют на маршрут по умолчанию.

Заключение

Следуя указанным шагам, вы успешно настроите маршрут по умолчанию для интерфейса ens3 на Debian Stretch с использованием DHCP. Это решение предотвратит конкурентное влияние других интерфейсов на вашу маршрутизацию и обеспечит стабильность сетевого подключение в вашей системе. Такой подход также минимизирует проблемы с синхронизацией и случайными сбоями, которые могут возникнуть из-за непредвиденного поведения сети.

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

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