3

В системе 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 ответа2

2

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

Один из способов сделать это описан здесь: вы создаете (конечно, вы также можете использовать редактор) фрагмент сценария оболочки в одной из "ловушечных" директорий 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.

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .