Установить маршрут по умолчанию на Debian Stretch с несколькими интерфейсами, настроенными dhcp
В системе Debian Stretch с несколькими интерфейсами мне нужно определить маршрут по умолчанию через определенный интерфейс ens3
, Этот интерфейс получает свой IP-адрес 10.33.34.2
через DHCP
Я приспособил следующее руководство к своим потребностям:
5.3. Современная конфигурация сети без графического интерфейса
Таким образом, я создал файл /etc/systemd/network/route.network
со следующим содержанием
[Match]
Name=ens3
[Network]
Gateway=10.33.34.1
Однако маршрут по умолчанию не установлен правильно при запуске.
Я включил отладку systemd-networkd
в соответствии с Как отладить systemd-networkd?
После перезапуска systemd-networkd
Я вижу следующее в журналах:
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Setting routes
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Could not set route: Network is unreachable
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Routes set
Aug 21 13:43:13 vpn dhclient[15709]: Listening on LPF/ens3/52:54:00:3f:f1:d0
Aug 21 13:43:13 vpn dhclient[15709]: Sending on LPF/ens3/52:54:00:3f:f1:d0
Aug 21 13:43:13 vpn dhclient[15709]: Sending on Socket/fallback
Aug 21 13:43:13 vpn dhclient[15709]: DHCPDISCOVER on ens3 to 255.255.255.255 port 67 interval 8
Aug 21 13:43:13 vpn dhclient[15709]: DHCPREQUEST of 10.33.34.2 on ens3 to 255.255.255.255 port 67
Aug 21 13:43:13 vpn dhclient[15709]: DHCPOFFER of 10.33.34.2 from 10.33.34.1
Aug 21 13:43:13 vpn dhclient[15709]: DHCPACK of 10.33.34.2 from 10.33.34.1
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Adding address: 10.33.34.2/24 (valid forever)
Кажется, что networkd пытается установить маршрут до того, как IP-адрес будет назначен через dhcp.
Как получить маршрут по умолчанию для определенного интерфейса с systemd?
== Редактировать ==
Я был неправ, предполагая, что systemd-networkd вызывает интерфейсы. Если я перезагружаю систему, я вижу
$ sudo service systemd-networkd status
● systemd-networkd.service - Network 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
не всегда будет использоваться в качестве маршрута по умолчанию
2 ответа
Если все интерфейсы получат действительные предложения DHCP с маршрутом по умолчанию, то не будет никакого способа настройки dhclient
игнорировать это - это не то, что вы можете сделать с systemd
, udev
или что-нибудь еще, связанное с системой init.
Один из способов сделать это описан здесь: вы создаете (конечно, вы также можете использовать редактор) фрагмент сценария оболочки в одной из директорий "hook" dhclient
,
cat << EOF > /etc/dhcp/dhclient-enter-hooks.d/restrict-default-route
## Only the DHCP server talking to ens3 is allowed to give us a default
## route. Other interfaces only get local-segment configuration.
case ${interface} in
ens3)
;;
*)
unset new_routers
;;
esac
EOF
который будет принимать только routers
вариант с маршрутом по умолчанию для ens3
, Нет проблем со временем, нет проблем с определением systemd
файлы для использования, и маршрут будет действителен только тогда, когда ens3
и получил предложение DHCP.
Для Debian Stretch интерфейсы названы udev, и основная конфигурация происходит в /etc/network/interfaces
, Как указано в редактировании 2, несколько интерфейсов выводятся в случайном порядке. Каждый получает правильную конфигурацию DHCP. Первый интерфейс, который будет вызван, установит маршрут по умолчанию. Нам нужно только принять маршрут по умолчанию для желаемого интерфейса. Это может быть достигнуто с помощью dhcpclient
Добавить новый скрипт хука /etc/dhcp/dhclient-enter-hooks.d/nodefaultroute
:
#!/bin/sh
## Prevent DHCP server on eth0 from forcing a default route on us
case ${interface} in
ens8|ens9)
printf "executing ip route delete default via $new_routers\n"
ip route delete default via $new_routers
;;
*)
;;
esac
куда ens8|ens9
может быть расширен, чтобы перечислить все интерфейсы, для которых маршрут по умолчанию не может быть принят.