Wat persist-tun en persist-key in OpenVPN werkelijk overleven
Beide opties dekken een zachte herstart binnen een levend proces. Ze behouden de interface niet na een stop, en ze zijn geen beleid om verkeer te blokkeren.
Het stoppen van de dienst verwijdert de interface zelfs met persist-tun ingesteld. Dat is de optie die werkt zoals gedocumenteerd, geen fout. De optie beschrijft één herstartpad binnen een draaiend proces, en systemctl stop is dat pad niet.
Lees de twee namen samen en het ontwerp wordt duidelijk. De ene houdt een descriptor vast, de andere houdt sleutelmateriaal vast, en beide bestaan vanwege wat er gebeurt nadat de privileges zijn losgelaten.
De twee bronnen en de herstart waartoe ze behoren
OpenVPN signaleert zijn eigen herstart in twee gewone situaties. Een expliciete SIGUSR1 doet dat, en een ping-restart die door een dode peer wordt veroorzaakt doet hetzelfde. Beide laten het proces in leven en voeren de verbindingsopzet opnieuw uit, en daar verdienen de opties hun plaats.
| 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 |
Alleen de rij van de zachte herstart is wat deze twee opties veranderen, en het werk dat ze overslaan is het dure deel op een drukke link. Een apparaat opnieuw openen breekt de adressen en routes die eraan hangen af, en ze opnieuw opbouwen kan pakketten laten vallen die onderweg waren toen de herstart begon. Een stop vernietigt dezelfde objecten zonder enige optie om ze te bewaren.
Waarom de opties überhaupt bestaan
Een geharde OpenVPN-server start meestal als root, opent zijn sleutels en zijn apparaat en gaat dan over naar een niet-geprivilegieerde gebruiker. Na die overgang zijn sommige bewerkingen simpelweg weg. Het lezen van een sleutelbestand met modus 0600, het aanmaken van een netwerkinterface of het wijzigen van routes kan allemaal geweigerd worden.
Zonder de persist-opties zou een peer die lang genoeg stil blijft om ping-restart te veroorzaken precies die bewerkingen afdwingen. De herverbinding zou mislukken ook al was er niets aan de configuratie veranderd. Het proces zou lijken te sterven zonder reden, en het logboek zou een machtigingsfout tonen in plaats van een netwerkfout.
Met hen hergebruikt de zachte herstart wat de geprivilegieerde fase al heeft verkregen. Er is geen magie in het spel en het proces overleeft niets. Het verwerven van bronnen wordt simpelweg uitgesteld.
Lees de eerste fout, niet de laatste
Wanneer een herstart mislukt, lees de eerste fout in plaats van de laatste. Een beschermde sleutel, een auth-bestand, een interface-ioctl en een externe hook zijn vier verschillende bronnen. Eén behouden zegt niets over toegang tot de andere. Een hook die een firewallhulpmiddel aanroept heeft nog steeds de privileges nodig die dat hulpmiddel eist.
Hooks hebben hun eigen schakelaar. De OpenVPN-handleiding koppelt de persist-opties aan up-restart, dat bepaalt of de up- en down-scripts na een herstart opnieuw draaien. Een interface die bleef staan vertelt u dus niets over of uw resolver-integratie is vernieuwd.
# 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
Dat paar opdrachten scheidt de twee faalmodi in seconden. Een interface die aanwezig is met ontbrekende routes is een hook- of routeprobleem. Een interface die verdween betekent dat het proces echt is geëindigd.
Een behouden interface is geen kill switch
Als de eis is dat verkeer de tunnel nooit mag verlaten, levert een behouden apparaat dat niet. Routes voor de andere adresfamilie, een tweede standaardroute en het geval waarin het proces volledig eindigt blijven allemaal buiten het bereik van de optie.
Behandel de twee eisen afzonderlijk. Het tunnelobject over herverbindingen heen behouden is een gemak voor de daemon. Het blokkeren van uitgaand verkeer wanneer de tunnel neerligt is een firewallbeleid met eigen regels en een eigen test. Ze verwarren levert een configuratie op die defensief lijkt en zich gedraagt als een herverbinding naar beste vermogen.
Benoem de gebeurtenis voordat u die diagnosticeert. Een zachte herstart, een mislukte verbindingspoging en een dienststop zijn drie gebeurtenissen met drie gedragingen, en alleen de eerste is wat deze opties beschrijven.