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

742
DoRe

В системе 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) 

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

== Редактировать 2 ==

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

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

3
Почему вы пытаетесь сделать это специально через systemd? Почему бы не настроить dhclient, чтобы он прекратил добавлять маршруты, которые вам не нужны? grawity 5 лет назад 1
Как я могу подтвердить, что маршрут настроен dhclient? DoRe 5 лет назад 0
Получаете ли вы свой адрес 10.33.34.2 от DHCP или он назначен статически? Пожалуйста, не отвечайте в комментариях; [отредактируйте] ваш вопрос, чтобы сделать его более понятным и полным. Scott 5 лет назад 0
Обратите внимание, что просто остановка dhclient от добавления маршрута по умолчанию не поможет, так как в настоящее время вы пытаетесь добавить маршрут рано, до того, как он станет действительным, так что вы в конечном итоге не получите маршрут по умолчанию. Правильный момент - после получения предложения DHCP, если вы не хотите использовать статическую настройку (в конце концов, маршрут является статическим), но я не могу помочь вам выяснить, куда поместить это в `systemd`, извините. Другой вариант - настроить ваш DHCP-сервер для правильного распределения маршрута. dirkt 5 лет назад 0

2 ответа на вопрос

2
dirkt

Если все интерфейсы получить действительный 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 $ in ens3) ;; *) unset new_routers ;; esac EOF 

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

Извините, я видел ваш пост слишком поздно DoRe 5 лет назад 0
@ DoRe, все же хорошо, что вы смогли найти решение, и очень хорошо, что вы опубликовали его! Я не вижу четкой формулировки в ответах: вы, вероятно, должны сделать имена своих интерфейсов стабильными, чтобы такие сценарии действительно давали предсказуемые результаты. См., Например, [здесь] (https://unix.stackexchange.com/a/437021/43156). kostix 5 лет назад 1
0
DoRe

Для 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 $ in ens8|ens9) printf "executing ip route delete default via $new_routers\n"  ip route delete default via $new_routers ;; *) ;; esac 

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