Hoppa över hemma-VPN:et med en systemd ExecCondition
Ett medvetet hopp och ett trasigt förberedelsekommando är olika utfall. Definiera hjälparens exitkoder och testa sedan flytten mellan nätverk.
Ditt hemmanätverks-VPN har inget att göra när laptopen redan sitter på det nätverket. Den frestande genvägen är ett förberedelsekommando som avslutas med en kod som inte är noll; det får uniten att misslyckas och får varje instrumentpanel att se trasig ut. systemd har ett direktiv för exakt den här typen av beslut, och det skiljer ett medvetet hopp från ett verkligt fel. Att göra det rätt handlar mest om att skriva ner vad varje exitkod betyder.
Varför ett misslyckat förvillkor är fel form
ExecStartPre behandlar en exit som inte är noll som ett startfel, vilket är korrekt för ett kommando som förbereder tjänsten. Att använda det som villkor gör ett policybeslut omöjligt att skilja från ett trasigt beroende. ExecCondition finns så att en unit kan vägra starta utan att markeras som misslyckad.
Den skillnaden spelar roll klockan tre på natten, när ingen vill triagera en röd unit som betedde sig som designat. En misslyckad unit döljer också de verkliga felen bland de avsiktliga.
Skriv exitkodskontraktet först
Skriv kontraktet före skriptet. Exit noll betyder fortsätt, exit ett betyder hoppa över de återstående startkommandona, och exit 255 betyder att själva villkoret inte kunde köras. Koder mellan två och 254 betyder vanligtvis också hoppa över, vilket är lätt att glömma när en hjälpare returnerar en slumpmässig felkod. Drop-in-filen nedan kopplar hjälparen till det riktiga unitnamnet.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnKontrollera den effektiva uniten för ärvda SuccessExitStatus- eller stop-post-inställningar innan du antar standardbeteendet. Testa sedan vart och ett av de tre utfallen medvetet.
En nätverkstips är inte bevis för plats
En nåbar routeradress eller ett känt MAC kan antyda rätt nätverk, och inget av dem bevisar det. Ett annat nätverk kan återanvända samma adress, ARP-data kan vara inaktuella och identifierare kan imiteras. Behandla sonderingen som en optimering som är förenlig med policyn, inte som ett autentiseringsresultat.
Bestäm i förväg vad osäkerhet innebär. Att starta VPN:et när du är osäker är säkert för en klient som bara inte skulle få någon anslutning; att hoppa över det när du är osäker är inte säkert. Gör sonderingen begränsad och läs det aktiva gränssnittet i stället för att anta det första i listan. En sondering som hänger sig är värre än en som svarar nej, eftersom uniten väntar på den.
Skriv ner de antagandena bredvid unitfilen så att nästa person vet vad hjälparen tror. En kommentar högst upp i skriptet är den billigaste platsen att förvara dem.
Hantera flytten mellan nätverk
Villkoret körs när tjänsten startar och utvärderas inte om senare. En överhoppad unit förblir överhoppad efter att laptopen flyttats till ett kafé, och en tunnel som körs förblir uppe efter att laptopen kommer hem. Koppla nätverksbytenas livscykel till start- och stoppbeslutet med en separat mekanism.
systemctl cat home-vpn.serviceTesta fyra fall: start hemma, start ute, en sondering som inte kan köras och en flytt mellan nätverk medan uniten är aktiv. Håll orsaken till överhoppningen synlig i journalen så att ett medvetet beslut aldrig ser ut som ett autentiseringsfel. Tjänstereferensen dokumenterar exit-semantiken och minimiversionen.