Настройка systemd-networkd для учета параметра [DHCPv4] FallbackLeaseLifetimeSec

Вопрос или проблема

Связано с этим вопросом

Как сделать так, чтобы systemd-networkd учитывал настройку [DHCPv4] FallbackLeaseLifetimeSec=forever? (Или, скорее всего, что я делаю не так, что это мешает?)

Когда он получает ответ без DHCP аренды, он записывает:

enp0s1: DHCPv4 клиент: полученная аренда не содержит адреса, адреса сервера или срока аренды, игнорируется

Предыстория

У нас есть потенциальный клиент с требованием, чтобы наше устройство могло работать в среде BOOTP (т.е. без DHCP). В частности, мы не должны требовать наличия DHCP Опции 51 (Время аренды) и должны рассматривать ответы как постоянные IP назначения.

Мы используем systemd-networkd для всего остального, поэтому в идеале мы хотели бы использовать его встроенный DHCP клиент и для этого. Основная проблема в том, что systemd-networkd отклоняет BOOTP ответы, не содержащие DHCP Опцию 51 (Время аренды IP адреса). Похоже, что вся цель FallbackLeaseLifetimeSec=forever заключается в обходе этого ограничения. Однако, вне зависимости от того, устанавливаем ли мы это или нет, мы получаем одно и то же сообщение журнала (выше), и systemd не настраивает интерфейс.

Детали/что я пробовал

  • networkctl --version сообщает systemd 252. Документация говорит, что эта опция была добавлена в 246.
  • Мы запускаем Debian 12 (Bookworm) в качестве тестового клиента с ядром 6.1.0.
  • Мы запускаем пакет Debian bootpd на отдельном устройстве с тем же Debian и Linux
    • Возможно, неуместно, но сервер использует /etc/network/interfaces и ifup/ifdown для настройки сети.
  • Я захватил ответы с помощью tcpdump и проверил следующее:
    • Они содержат yiaddr, то есть Ваш (клиентский) IP адрес
    • Они содержат siaddr, то есть IP адрес сервера
    • Они также содержат опцию 54 (Идентификатор DHCP сервера)
  • Я захватил ответы от обычного DHCP сервера и сравнил. Единственные существенные различия, которые я вижу, это:
    • Ожидаемое Время аренды IP адреса присутствует
    • Опции идут в другом порядке (53,54,51,1,3,6,42,255 против 1,3,53,54,6,12,255)
  • Наш файл конфигурации сети находится в /etc/systemd/network/20-enp0s1.network
  • У нас нет других файлов конфигурации сети, кроме /etc/systemd/networkd.conf, который не был изменен и фактически пуст (содержит только комментарии и несколько пустых секций)
  • Я проверил, что наш файл конфигурации, и опция FallbackLeaseLifetimeSec в частности, парсятся следующим образом:
    • Я установил значение опции на garbage и перезапустил systemd-networkd.
    • journalctl сообщает Недопустимое значение LeaseLifetime=, игнорируется: garbage.
    • Когда я вернул его обратно на forever, journalctl не упоминает об этом
      • Я нашел сообщение об ошибке в исходном коде, и ясно, что он не сообщает об этом, если находит допустимое значение.
  • Вот 20-enp0s1.network:
[Match]
Name=enp0s1

[Network]
DHCP=ipv4

[DHCPv4]
FallbackLeaseLifetimeSec=forever

ClientIdentifier=mac  

# Дополнение, потому что `bootpd` отвергает пакеты, которые считает слишком короткими
SendOption=254:string:"UUUUUUUUUUUUUUUUUUUUUUUUUUU"

Ответ или решение

Настройка systemd-networkd для поддержки опции FallbackLeaseLifetimeSec в DHCPv4

Введение

Вопрос, поднятый в описании, касается конфигурации systemd-networkd для работы в средах, где возможно получение IP-адресов без наличия опции DHCP Lease Time (DHCP Option 51). Это, в частности, актуально для серверов BOOTP, которые могут не отправлять время аренды, необходимое для корректной работы большинства DHCP-клиентов. В данной статье мы подробно рассмотрим, как заставить systemd-networkd учитывать параметр FallbackLeaseLifetimeSec, что позволит корректно обрабатывать такие ответы.

Входные параметры

Ваша текущая конфигурация находится в файле /etc/systemd/network/20-enp0s1.network, где задан параметр:

[DHCPv4]
FallbackLeaseLifetimeSec=forever

И вы описали, что лог systemd-networkd сообщает об игнорировании пакетов, содержащих информацию о потере аренды.

Проблема

systemd-networkd отказывается обрабатывать BOOTP ответы из-за отсутствия в них опции DHCP Lease Time. Это поведение ожидаемо, так как стандартные DHCP клиенты полагаются на наличие Lease Time для управления полученными адресами.

Решение

Для решения вашей проблемы, необходимо выполнить следующие шаги:

  1. Убедитесь в правильности конфигурации:
    Убедитесь, что файл конфигурации корректно перемещен и не содержит синтаксических ошибок. Ваша конфигурация 20-enp0s1.network выглядит хорошо, но всегда полезно проверить такие детали, как правильные отступы, использование [Match], [Network] и [DHCPv4].

  2. Обновление systemd:
    При использовании systemd 252, вы определенно обладаете функциональными возможностями, представленными в более ранних версиях. Однако убедитесь, что у вас последнее обновление системы и все компоненты systemd установлены и работают корректно.

    Выполните команду:

    sudo apt update
    sudo apt upgrade
  3. Проверка логической работы DHCP до BOOTP:
    Важно параллельно с systemd-networkd использовать традиционные DHCP-серверы (например, isc-dhcp-server) для понимания формата ответа. Команда tcpdump поможет вам выявить все параметры, которые поступают в ответе от сервера. Как вы уже сделали, наличие необходимых параметров в ответах (таких как yiaddr и siaddr) важно. Однако следите за правильным использованием всех опций, которые могли бы влиять на логику работы.

  4. Тестирование параметров FallbackLeaseLifetimeSec:
    Попробуйте установить FallbackLeaseLifetimeSec=3600, чтобы увидеть, произойдут ли изменения в поведении системы. Возможно, выполнение этой настройки может повлиять на игнорирование механизма.

  5. Обратите внимание на системные журналы:
    Используйте journalctl -f для просмотра реальных логов процесса сети. Внимательно изучите вывод во время старта systemd-networkd, чтобы уловить возможные ошибки, о которых вы могли не знать.

  6. Настройка идентификатора клиента:
    Важно убедиться, что ClientIdentifier указан корректно. Возможно, изменение его на более стандартный подход может позволить серверу корректно идентифицировать устройства.

  7. Обратите внимание на соответствие RFC:
    Обратите внимание на то, соответствует ли ваш BOOTP сервер стандартам, описанным в RFC 951 и 2131. Некоторые реализации могут вести себя по-разному, и корректировка может привести к стабильной работе.

Заключение

Конфигурация systemd-networkd для работы в BOOTP-средах требует точной настройки и понимания различных параметров DHCP. Убедитесь, что вы следите за логами, используете актуальные доработанные версии программного обеспечения и делаете правильные настройки для вашего интерфейса. При соблюдении данных рекомендаций, вы сможете научить systemd-networkd игнорировать отсутствие Lease Time и корректно обрабатывать сообщения от BOOTP серверов.

Оцените материал
Добавить комментарий

Капча загружается...