Що насправді переживають persist-tun і persist-key в OpenVPN
Обидві опції охоплюють м'який перезапуск усередині живого процесу. Вони не зберігають інтерфейс після зупинки і не є політикою блокування трафіку.
Зупинка служби видаляє інтерфейс навіть із налаштованим persist-tun. Це опція, що працює як задокументовано, а не збій. Опція описує один шлях перезапуску всередині працюючого процесу, і systemctl stop не є цим шляхом.
Прочитайте обидві назви разом, і задум стає зрозумілим. Одне утримує дескриптор, інше утримує матеріал ключа, і обидва існують через те, що відбувається після скидання привілеїв.
Два ресурси й перезапуск, до якого вони належать
OpenVPN сигналізує про власний перезапуск у двох звичайних ситуаціях. Явний SIGUSR1 робить це, і ping-restart, викликаний мертвим партнером, робить те саме. Обидва залишають процес живим і повторно виконують налаштування з'єднання, і саме там опції виправдовують своє місце.
| Event | TUN/TAP device | Key and auth files | Addresses and routes | up/down hooks |
|---|---|---|---|---|
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itself | survives only with persist-tun | survive only with persist-key | survive with the device, otherwise rebuilt | run again only when restart hooks are enabled |
Configuration reload, SIGHUP | recreated | re-read from disk | rebuilt once the device returns | run again |
| Service stop | lost | re-read at the next start | removed | run at the next start |
Лише рядок м'якого перезапуску — це те, що змінюють ці дві опції, а робота, яку вони пропускають, — дорога частина на завантаженому каналі. Повторне відкриття пристрою руйнує прив'язані до нього адреси й маршрути, а їхня перебудова може втратити пакети, які були в дорозі, коли перезапуск почався. Зупинка знищує ті самі об'єкти без жодної опції їх зберегти.
Чому ці опції взагалі існують
Зміцнений сервер OpenVPN зазвичай запускається як root, відкриває свої ключі та свій пристрій, а потім переходить до непривілейованого користувача. Після цього переходу деякі операції просто зникають. Читання файлу ключа з режимом 0600, створення мережевого інтерфейсу або зміна маршрутів можуть бути відхилені.
Без опцій persist партнер, який мовчить достатньо довго, щоб викликати ping-restart, примусив би саме ці операції. Повторне підключення зазнало б невдачі, хоча в конфігурації нічого не змінилося. Процес виглядав би так, ніби вмирає без причини, а журнал показав би помилку прав замість мережевої помилки.
З ними м'який перезапуск повторно використовує те, що привілейована фаза вже отримала. Жодної магії тут немає, і процес нічого не переживає. Отримання ресурсів просто відкладається.
Читайте першу помилку, а не останню
Коли перезапуск не вдається, читайте першу помилку, а не останню. Захищений ключ, файл auth, ioctl інтерфейсу та зовнішній хук — це чотири різні ресурси. Утримання одного нічого не говорить про доступ до інших. Хук, що викликає інструмент міжмережевого екрана, усе ще потребує прав, яких вимагає цей інструмент.
Хуки мають власний перемикач. Посібник OpenVPN пов'язує опції persist з up-restart, який вирішує, чи запускатимуться скрипти up і down знову після перезапуску. Тому інтерфейс, що залишився піднятим, нічого не говорить вам про те, чи оновилася ваша інтеграція з resolver.
# which restart path just happened?
journalctl -u openvpn-client@office --since '10 min ago' | grep -E 'SIGUSR1|ping-restart|Restart pause|NOTE:'
# did the interface survive, and do its routes still exist?
ip -brief link show tun0
ip route show dev tun0
Ця пара команд розділяє два режими відмови за секунди. Інтерфейс, який існує, але без маршрутів, — це проблема хука або маршруту. Зниклий інтерфейс означає, що процес справді завершився.
Збережений інтерфейс — не аварійний вимикач
Якщо вимога полягає в тому, щоб трафік ніколи не виходив за межі тунелю, збережений пристрій цього не забезпечує. Маршрути для іншої родини адрес, другий маршрут за замовчуванням і випадок, коли процес завершується повністю, залишаються поза межами дії опції.
Розглядайте дві вимоги окремо. Збереження об'єкта тунелю між перепідключеннями — це зручність для демона. Блокування виходу, коли тунель не працює, — це політика міжмережевого екрана з власними правилами й власним тестом. Їхнє змішування дає конфігурацію, яка виглядає захисною, а поводиться як перепідключення за найкращої спроби.
Назвіть подію перш ніж її діагностувати. М'який перезапуск, невдала спроба підключення й зупинка служби — це три події з трьома поведінками, і лише перша — те, що описують ці опції.