Вопрос или проблема
У меня возникла проблема, когда daemon-reexec
в systemd
, запускаемый apt-daily-upgrade.service
по случайному таймеру, вызывает повторное применение конфигурации netplan
, уничтожая все мои тщательно настроенные правила маршрутизации и таблицы маршрутов.
В качестве временной меры я отключил apt-daily-upgrade.service
и настроил unattended-upgrades
на запуск при завершении работы. Но мне хотелось бы справиться с этим правильным способом.
Мои правила маршрутизации и таблицы создаются динамически и время от времени изменяются с использованием скриптов. Поэтому, я предполагаю, что правильный путь здесь — это записать дополнительную конфигурацию в /run/netplan
, которая будет сохраняться до следующей перезагрузки, после чего я снова смогу восстанавливать /run/netplan
по мере необходимости.
Но вот в чем дело: netplan
кажется ориентирован на интерфейс, в то время как моя конфигурация должна быть независимой от интерфейса.
Например, я хочу создать правило маршрутизации, которое делает так, чтобы все пакеты с меткой брандмауэра ‘100’ использовали таблицу маршрутизации ‘100’, независимо от того, из какого или на какой интерфейс эти пакеты поступают. Маршруты в таблице также должны быть независимыми от интерфейса.
Есть ли способ сделать это с помощью netplan
? Или мне следует сделать что-то абсолютно другое?
Ответ или решение
Ваша проблема заключается в том, что использование systemd daemon-reexec
, инициируемое apt-daily-upgrade.service
, приводит к повторному применению конфигурации netplan
, стирая ваши тщательно настроенные правила и таблицы маршрутизации. Это довольно распространённая проблема, когда изменения в конфигурации, происходящие динамически, не сохраняются должным образом при повторной загрузке или применении настроек сети.
Теория
Netplan
— это утилита для упрощенного управления конфигурацией сети в системах на основе Ubuntu. Она позволяет абстрагировать конфигурацию в YAML, переводя ее затем в настройки нижнего уровня для де-демонов Netwokd или NetworkManager. Тем не менее, netplan
в значительной мере ориентирован на интерфейсы, что иногда ограничивает возможности конфигурации, особенно в случае со сложными сценариями маршрутизации, которые должны быть независимыми от интерфейсов.
Основная проблема заключается в том, что netplan
по умолчанию не поддерживает независимую от интерфейсов маршрутизацию, заданную через маркировку пакетов или через таблицы маршрутизации, которые не привязаны к конкретному интерфейсу. Это может быть требованием, если вы имеете сложные сценарии с несколькими путями маршрутизации, которые меняются динамически.
Пример
Вы хотите настроить маршрутизацию, чтобы все пакеты с определённой меткой (например, ‘100’) использовали отдельную таблицу маршрутизации (например, таблицу с ID ‘100’), независимо от интерфейса, через который они проходят. Это может выглядеть так:
ip rule add fwmark 100 table 100
А также в самой таблице ‘100’ вы бы задавали маршруты:
ip route add default via 192.168.1.1 table 100
Применение
Так как netplan
не поддерживает данную функциональность напрямую, вам следует использовать его в сочетании с другими инструментами и скриптами для достижения ваших целей. Вот несколько шагов, которые вы можете предпринять:
- Создание собственного скрипта: Напишите скрипт, который применяет необходимые правила и таблицы маршрутизации после каждой перезагрузки или изменения конфигурации
netplan
. Этот скрипт может автоматически вызываться через systemd unit, чтобы запускаться при старте системы или любой другой активности, которая может повлиять на ваши сетевые настройки.
#!/bin/bash
# Сохранить этот скрипт как /usr/local/bin/route-config.sh
ip rule add fwmark 100 table 100
ip route add default via 192.168.1.1 table 100
- Создание systemd сервиса:
Создайте сервис, который будет автоматически запускать скрипт.
Файл: /etc/systemd/system/route-config.service
[Unit]
Description=Custom Route Configuration
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/route-config.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Активируйте и запустите службу:
sudo systemctl enable route-config.service
sudo systemctl start route-config.service
- Работа с
netplan
:
Поскольку ваши требования выходят за рамки того, что может предложитьnetplan
, вы можете минимально настраивать сеть с помощьюnetplan
, а все остальное обрабатывать через вышеописанный механизм.
Убедитесь, что ваши базовые сетевые настройки в netplan
определены и не конфликтуют с теми, которые вы настраиваете вручную.
- Мониторинг повторной активации конфигурации:
При необходимости можно добавить критерии и условия для повторного запуска вашего скрипта после срабатыванияnetplan try
или в инициации других сетевых событий, чтобы гарантировать персистентность настроек.
Заключение
Таким образом, хотя netplan
сам по себе не может удовлетворить ваши специфические потребности в маршрутизации на базе меток пакетов и независимых от интерфейса таблиц маршрутизации, использования скриптов и сервисов systemd может стать эффективным решением. Это позволяет обеспечить динамичность и устойчивость настройки без постоянного вмешательства вручную, эффективно используя возможности операционной системы и дополнительных утилит.