Какво всъщност оцеляват 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
Тази двойка команди разделя двата режима на отказ за секунди. Интерфейс, който присъства, но маршрутите липсват, е проблем с кука или маршрут. Интерфейс, който е изчезнал, означава, че процесът действително е приключил.
Запазеният интерфейс не е авариен превключвател
Ако изискването е трафикът никога да не излиза извън тунела, запазеното устройство не го осигурява. Маршрути за другото семейство адреси, втори маршрут по подразбиране и случаят, в който процесът излезе напълно, остават извън обхвата на опцията.
Третирайте двете изисквания отделно. Запазването на обекта на тунела между повторните свързвания е удобство за демона. Блокирането на изхода, когато тунелът е спрян, е политика на защитна стена със свои правила и свой тест. Смесването им дава конфигурация, която изглежда защитна, а се държи като повторно свързване с най-добри усилия.
Назовавайте събитието, преди да го диагностицирате. Мекият рестарт, неуспешният опит за свързване и спирането на услугата са три събития с три поведения и само първото е това, което описват тези опции.