Hopp over hjemme-VPN-en med en systemd ExecCondition
Et bevisst hopp og en ødelagt forberedelseskommando er to forskjellige utfall. Definer exitkodene til hjelperen, og test deretter flyttingen mellom nettverk.
Hjemmenettverks-VPN-en har ingenting å gjøre når laptopen allerede sitter på det nettverket. Den fristende snarveien er en forberedelseskommando som avslutter med en kode som ikke er null; det får uniten til å feile og får hvert dashbord til å se ødelagt ut. systemd har en direktiv for nøyaktig denne typen beslutning, og den skiller et bevisst hopp fra en ekte feil. Å gjøre det riktig handler mest om å skrive ned hva hver exitkode betyr.
Hvorfor en feilende forutsetning er feil form
ExecStartPre behandler en exit som ikke er null som en oppstartsfeil, noe som er riktig for en kommando som forbereder tjenesten. Brukt som betingelse gjør den en policybeslutning umulig å skille fra en ødelagt avhengighet. ExecCondition finnes for at en unit skal kunne avslå å starte uten å bli merket som feilet.
Den forskjellen betyr noe klokken tre om natten, når ingen vil triage en rød unit som oppførte seg som designet. En feilet unit skjuler også de ekte feilene blant de bevisste.
Skriv exitkodekontrakten først
Skriv kontrakten før skriptet. Exit null betyr fortsett, exit én betyr hopp over de resterende startkommandoene, og exit 255 betyr at betingelsen selv ikke kunne kjøre. Koder mellom to og 254 betyr vanligvis også hopp, noe som er lett å glemme når en hjelper returnerer en tilfeldig feilkode. Drop-in-filen nedenfor kobler hjelperen til det ekte unitnavnet.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnKontroller den effektive uniten for arvede SuccessExitStatus- eller stop-post-innstillinger før du antar standardsemantikken. Test deretter hvert av de tre utfallene bevisst.
Et nettverkstips er ikke bevis for plassering
En nåbar ruteradresse eller en kjent MAC kan antyde riktig nettverk, og ingen av dem beviser det. Et annet nettverk kan gjenbruke samme adresse, ARP-data kan være utdaterte, og identifikatorer kan etterlignes. Behandle sonderingen som en optimalisering som er konsistent med policyen, ikke som et autentiseringsresultat.
Bestem på forhånd hva usikkerhet betyr. Å starte VPN-en når du er usikker er trygt for en klient som bare ikke ville fått forbindelse; å hoppe over den når du er usikker er ikke trygt. Gjør sonderingen begrenset, og les det aktive grensesnittet i stedet for å anta det første i listen. En sondering som henger er verre enn en som svarer nei, fordi uniten venter på den.
Skriv ned disse antakelsene ved siden av unitfilen slik at neste person vet hva hjelperen tror. En kommentar øverst i skriptet er det billigste stedet å oppbevare dem.
Håndter flyttingen mellom nettverk
Betingelsen kjører når tjenesten starter, og den revurderes ikke senere. En overhoppet unit forblir overhoppet etter at laptopen flyttes til en kafé, og en kjørende tunnel forblir oppe etter at laptopen kommer hjem. Koble nettverksskiftets livssyklus til start- og stoppbeslutningen med en egen mekanisme.
systemctl cat home-vpn.serviceTest fire tilfeller: oppstart hjemme, oppstart ute, en sondering som ikke kan kjøre, og en flytting mellom nettverk mens uniten er aktiv. Hold årsaken til hoppet synlig i journalen slik at en bevisst beslutning aldri ser ut som en autentiseringsfeil. Tjenestereferansen dokumenterer exit-semantikken og minsteversjonen.