Туннели одноразовы; политика такой быть не должна. На шлюзе Linux правило nftables, сопоставляющее интерфейс туннеля по имени, можно загрузить один раз, и оно продолжает применяться каждый раз, когда этот интерфейс появляется. У интерфейса всё ещё есть жизненный цикл: он создаётся, исчезает, а маршруты и трансляции вокруг него следуют своему расписанию. Именно разделение этих владельцев сохраняет доступ стабильным при переподключении.

Совпадение по имени переживает интерфейс

nftables предлагает числовые совпадения по индексу интерфейса и динамические совпадения по имени iifname и oifname. Правила с этими именами загружаются чисто даже тогда, когда устройство туннеля ещё не создано, а это именно то, что нужно набору правил при загрузке. Совпадение прекращается, если интерфейс переименован, и возобновляется, когда новое имя получает новый интерфейс. У числового индекса такого свойства нет, поэтому именная форма обычный выбор для туннеля.

Имя это ключ совпадения, а не доказательство того, кто находится на другом конце. Аутентификация партнёра остаётся задачей VPN.

Прочитайте цепочку перед добавлением правил

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

nft list ruleset
nft -c -f /etc/nftables.conf

Листинг показывает цепочки, правила и дескрипторы, а режим проверки валидирует файл-кандидат, не загружая его. Разрешение только для туннеля, поставленное после более раннего принятия для того же потока, ничего не меняет, потому что побеждает первое подходящее правило. Поэтому позднее правило может выглядеть правильным и не иметь эффекта. Читайте цепочку по порядку и убедитесь, что запрет для трафика от клиента к вышестоящему каналу по-прежнему идёт перед любым более широким правилом.

У маршрутов, трансляции и потоков другие владельцы

Наличие интерфейса не создаёт маршрутов и не аутентифицирует партнёра. Это относится к менеджеру VPN, а у трансляции третий жизненный цикл.

conntrack -L -s 10.20.0.0/24 | head
ip route show dev vpn0

Листинг conntrack показывает существующие потоки с их исходными и транслированными значениями, а листинг маршрутов показывает, что менеджер установил для интерфейса. Правила NAT создают состояние отслеживания соединения на первом пакете, поэтому установленный поток сохраняет свою трансляцию даже после изменения правила. Поэтому обновляемое правило и поток, использующий новый путь, два разных утверждения. Решите, какие сеансы должны переподключиться, и не трогайте несвязанные потоки.

Примите холодный старт, потерю и восстановление

Проверьте шлюз при отсутствующем туннеле на загрузке, затем при присутствующем, затем после обрыва и возврата. Убедитесь, что запрещённая переадресация остаётся запрещённой, пока туннель отсутствует, что новый разрешённый поток работает после аутентификации партнёра и что восстановление не требует очистки несвязанного состояния. Не очищайте всю цепочку POSTROUTING или каждую запись conntrack как действие остановки одного профиля, потому что другие службы делят их. Записывайте, какой компонент изменил интерфейс, маршрут и политику, а не только то, что хук запуска завершился с нулём.

Политика, переживающая переподключение, это та, чьи владельцы названы и чьи правила проверены при туннеле как выключенном, так и включённом. Хук, сообщающий об успехе, доказывает лишь то, что хук выполнился.

Похожие статьи