Как выполнять маршрутизацию, не зависящую от интерфейса, с помощью netplan?

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

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

  1. Создание собственного скрипта: Напишите скрипт, который применяет необходимые правила и таблицы маршрутизации после каждой перезагрузки или изменения конфигурации 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
  1. Создание 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
  1. Работа с netplan:
    Поскольку ваши требования выходят за рамки того, что может предложить netplan, вы можете минимально настраивать сеть с помощью netplan, а все остальное обрабатывать через вышеописанный механизм.

Убедитесь, что ваши базовые сетевые настройки в netplan определены и не конфликтуют с теми, которые вы настраиваете вручную.

  1. Мониторинг повторной активации конфигурации:
    При необходимости можно добавить критерии и условия для повторного запуска вашего скрипта после срабатывания netplan try или в инициации других сетевых событий, чтобы гарантировать персистентность настроек.

Заключение

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

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

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