Тримайте політику nftables стабільною, поки з'являється інтерфейс VPN
Правила nftables на основі імені переживають тунель, що з'являється й зникає, але маршрути та наявні потоки не йдуть за ним автоматично. Розділіть власників.
Тунелі одноразові; політика такою бути не повинна. На шлюзі 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 як дію зупинки одного профілю, бо інші служби їх поділяють. Записуйте, який компонент змінив інтерфейс, маршрут і політику, а не лише те, що хук запуску завершився нулем.
Політика, що переживає перепідключення, це та, чиї власники названі й чиї правила перевірено при тунелі як вимкненому, так і ввімкненому. Хук, що повідомляє про успіх, доводить лише те, що хук виконався.