
В системе 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
не всегда будет использоваться как маршрут по умолчанию
решение1
Есливсеинтерфейсы получают допустимые предложения DHCP с маршрутом по умолчанию, то не будет возможности настроить dhclient
их игнорирование — это то, что вы не сможете сделать с помощью systemd
, udev
, или чего-либо еще, подключенного к системе инициализации.
Один из способов сделать это описанздесь: Вы создаете (конечно, вы также можете использовать редактор) фрагмент скрипта оболочки в одном из каталогов «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.
решение2
Для 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
можно расширить, чтобы составить список всех интерфейсов, для которых маршрут по умолчанию не может быть принят.