Вопрос или проблема
На системе 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. Это решение предотвратит конкурентное влияние других интерфейсов на вашу маршрутизацию и обеспечит стабильность сетевого подключение в вашей системе. Такой подход также минимизирует проблемы с синхронизацией и случайными сбоями, которые могут возникнуть из-за непредвиденного поведения сети.