Skript en VPN-klient: velg laget før passordet
Leverandørens CLI, rasdial, en app-intent eller UI-automatisering feiler hver på sin måte. Velg laget, hold hemmeligheten utenfor argv, og vent på tilstand, ikke på exitkoder.
Skript starter VPN-klienter på det laget forfatteren valgte, og det laget er sjelden det jobben trengte. Leverandørens kommandolinje, operativsystemets oppringer og en mobil app-intent returnerer alle på forskjellige punkter i forbindelsens liv. De håndterer også hemmeligheten ulikt, og den forskjellen avgjør om passordet er synlig for hver bruker på maskinen. Velg laget før du skriver den første linjen i skriptet.
Lag 1: leverandørens kommandolinje
De fleste skrivebordsklienter leverer en kommandolinje som tar et profilnavn og, altfor ofte, et passord. Ciscos eldre klient godtok et connect-verb med bruker- og passordargumenter; macOS eksponerer den innebygde tjenesten via networksetup; NetworkManager svarer på nmcli. Disse kallene returnerer når kommandoen er ferdig, noe som ikke er samme øyeblikk som når tunnelen blir brukbar. Les leverandørens egen dokumentasjon for versjonen du ruller ut, fordi disse grensesnittene endres og noen fjernes helt.
nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"
Fordelen er at leverandøren kjenner sitt eget profillager, så kallet bruker samme konfigurasjon som GUI-et ville gjort. Ulempen er at hver leverandør finner opp egne verb, og et skript skrevet for én klient overføres ikke til en annen. Se på dette laget som den korteste veien når klienten er fast og versjonen er låst.
Lag 2: operativsystemets egen tjeneste
På Windows er oppringeren en del av operativsystemet, og den arbeider mot en telefonbokoppføring i stedet for leverandørens profillager. Det gjør den mer portabel på tvers av klienter og lettere å skripte fra en tjenestekonto. Det betyr også at forbindelsen kan finnes på ett sted og ikke på det andre, noe som forvirrer folk som ser i feil liste.
rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus
Bruk PowerShell-flaten når du må opprette eller fjerne oppføringen i stedet for å ringe opp. WMI- og cmdlet-lagene eksponerer de samme objektene under forskjellige navn, og fjerning er en separat operasjon fra frakobling. Et skript som bare ringer opp, vil etterlate gamle oppføringer etter en migrering. Sjekk hvilket lager automatiseringen din skriver til før du lover at oppryddingen skjer.
Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection
På macOS er motstykket listen over nettverkstjenester, der en eksisterende tjeneste kobles til ved navn i stedet for å opprettes på stedet.
Innloggingsdata lekker på hvert lag, så velg kanalen
Alt du sender på kommandolinjen vises i prosesstabellen for hver lokal bruker, og det overlever som regel også i skallhistorikken. OpenVPNs støttede alternativ er å lese hemmeligheten fra en fil med --askpass, og filen selv trenger tillatelser som samsvarer med tilliten du legger i den. Et navngitt rør unngår å skrive hemmeligheten til disk, men lar enhver prosess som kan åpne det skrive der. På Windows lagrer du hemmeligheten i legitimasjonsbehandleren, eller i en fil som bare tjenestekontoen kan lese, og aldri som en literal i en batchfil.
openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret
Den samme regelen gjelder for tokens og engangskoder: hvis automatiseringen trenger dem, trenger automatiseringen en kanal som ikke er et kommandolinjeargument. Roter hemmeligheten når du endrer mekanismen, fordi den gamle verdien har ligget i en logg et sted. Et skript som virker og lekker, er ikke et fungerende skript.
Vent på tilstand, og overvåk deretter én eier
Hvert av disse kallene returnerer før tunnelen er klar, så poll tilstanden klienten eksponerer eller undersøk en destinasjon inne i den med en tidsavbrudd. Å kopiere filer eller åpne en databaseforbindelse rett etter tilkoblingskallet er et kappløp, og det feiler periodisk på en måte som ser ut som en nettverksfeil.
ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null
Frakobling har det samme problemet i motsatt retning: prosessen kan avslutte før rutene er borte. Bruk klientens kroker der de finnes, som opp- og ned-skriptene i OpenVPN, eller ExecStartPost i en systemd-unit, fordi de kjører på det punktet du faktisk bryr deg om. Kroker kjører med rettighetene til det som kalte dem, så en krok som starter nettverket på nytt trenger en eksplisitt regel i stedet for en antakelse. Hold nøyaktig én eier i forbindelsens levetid.
Når to overvåkere både starter og stopper den profilen, er resultatet en gjenkoblingssløyfe som leses som en leverandøravbrudd. Runbooken slutter når laget er dokumentert, hemmeligheten har en kanal som ikke er argv, ventebetingelsen er en tilstandssjekk med tidsavbrudd, og én prosess eier livssyklusen.