Спирането на услугата премахва интерфейса дори при зададен persist-tun. Това е опцията, работеща както е документирано, а не провал. Опцията описва един път за рестартиране в рамките на работещ процес и systemctl stop не е този път.

Прочетете двете имена заедно и дизайнът става ясен. Едното пази дескриптор, другото пази ключов материал и двете съществуват заради това, което се случва след отпадането на привилегиите.

Двата ресурса и рестартът, към който принадлежат

OpenVPN сигнализира собствен рестарт в две обичайни ситуации. Явен SIGUSR1 го прави, а ping-restart, задействан от мъртъв партньор, прави същото. И двете оставят процеса жив и пускат отново настройката на връзката, и точно тук опциите си заслужават мястото.

EventTUN/TAP deviceKey and auth filesAddresses and routesup/down hooks
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itselfsurvives only with persist-tunsurvive only with persist-keysurvive with the device, otherwise rebuiltrun again only when restart hooks are enabled
Configuration reload, SIGHUPrecreatedre-read from diskrebuilt once the device returnsrun again
Service stoplostre-read at the next startremovedrun 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

Тази двойка команди разделя двата режима на отказ за секунди. Интерфейс, който присъства, но маршрутите липсват, е проблем с кука или маршрут. Интерфейс, който е изчезнал, означава, че процесът действително е приключил.

Запазеният интерфейс не е авариен превключвател

Ако изискването е трафикът никога да не излиза извън тунела, запазеното устройство не го осигурява. Маршрути за другото семейство адреси, втори маршрут по подразбиране и случаят, в който процесът излезе напълно, остават извън обхвата на опцията.

Третирайте двете изисквания отделно. Запазването на обекта на тунела между повторните свързвания е удобство за демона. Блокирането на изхода, когато тунелът е спрян, е политика на защитна стена със свои правила и свой тест. Смесването им дава конфигурация, която изглежда защитна, а се държи като повторно свързване с най-добри усилия.

Назовавайте събитието, преди да го диагностицирате. Мекият рестарт, неуспешният опит за свързване и спирането на услугата са три събития с три поведения и само първото е това, което описват тези опции.

Подобни статии