Sla de thuis-VPN over met een systemd ExecCondition
Een bewuste overslag en een kapot voorbereidingscommando zijn verschillende uitkomsten. Definieer de exitcodes van de helper en test daarna de overgang tussen netwerken.
Je thuisnetwerk-VPN heeft niets te doen wanneer de laptop al op dat netwerk zit. De verleidelijke kortere weg is een voorbereidingscommando dat met een niet-nul code eindigt; dat laat de unit mislukken en elk dashboard ziet er kapot uit. systemd heeft een richtlijn voor precies deze vorm van beslissing, en die scheidt een bewuste overslag van een echte storing. Het goed doen gaat vooral over opschrijven wat elke exitcode betekent.
Waarom een falende voorwaarde de verkeerde vorm is
ExecStartPre behandelt een niet-nul exit als een opstartfout, wat correct is voor een commando dat de dienst voorbereidt. Het als voorwaarde gebruiken maakt een beleidsbeslissing niet te onderscheiden van een kapotte afhankelijkheid. ExecCondition bestaat zodat een unit kan weigeren te starten zonder als mislukt te worden gemarkeerd.
Dat onderscheid telt om drie uur 's nachts, wanneer niemand een rode unit wil triageren die zich gedroeg zoals ontworpen. Een mislukte unit verbergt ook de echte fouten tussen de bewuste.
Schrijf eerst het exitcode-contract
Schrijf het contract voordat je het script schrijft. Exit nul betekent doorgaan, exit één betekent de resterende startcommando's overslaan, en exit 255 betekent dat de voorwaarde zelf niet kon draaien. Codes tussen twee en 254 betekenen meestal ook overslaan, wat makkelijk te vergeten is wanneer een helper een willekeurige foutcode teruggeeft. De drop-in hieronder koppelt de helper aan de echte unitnaam.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnControleer de effectieve unit op geërfde SuccessExitStatus- of stop-post-instellingen voordat je de standaardsemantiek aanneemt. Test daarna elk van de drie uitkomsten bewust.
Een netwerkhint is geen bewijs van locatie
Een bereikbaar routeradres of een bekende MAC kan het juiste netwerk suggereren, en geen van beide bewijst het. Een ander netwerk kan hetzelfde adres hergebruiken, ARP-gegevens kunnen verouderd zijn en identificatoren kunnen worden nagebootst. Behandel de probe als een optimalisatie die consistent is met het beleid, niet als een authenticatieresultaat.
Bepaal vooraf wat onzekerheid betekent. De VPN starten wanneer je onzeker bent is veilig voor een client die gewoon geen verbinding zou krijgen; hem overslaan wanneer je onzeker bent is dat niet. Maak de probe begrensd en lees de actieve interface in plaats van de eerste in de lijst aan te nemen. Een probe die blijft hangen is erger dan een die nee antwoordt, omdat de unit erop wacht.
Noteer die aannames naast het unit-bestand zodat de volgende persoon weet wat de helper gelooft. Een commentaar bovenaan het script is de goedkoopste plek om ze te bewaren.
Behandel de overgang tussen netwerken
De voorwaarde draait wanneer de dienst start, en wordt later niet opnieuw geëvalueerd. Een overgeslagen unit blijft overgeslagen nadat de laptop naar een café verhuist, en een draaiende tunnel blijft staan nadat de laptop thuiskomt. Koppel de levenscyclus van de netwerkwijziging aan de start- en stopbeslissing met een apart mechanisme.
systemctl cat home-vpn.serviceTest vier gevallen: opstart thuis, opstart buitenshuis, een probe die niet kan draaien, en een overgang tussen netwerken terwijl de unit actief is. Houd de reden van de overslag zichtbaar in het journaal zodat een bewuste beslissing nooit op een authenticatiefout lijkt. De dienstreferentie documenteert de exitsemantiek en de minimumversie.