Skriv script til en VPN-klient: vælg laget før adgangskoden
Leverandørens CLI, rasdial, et app-intent eller UI-automatisering fejler hver især forskelligt. Vælg laget, hold hemmeligheden ude af argv, og vent på tilstand, ikke på exitkoder.
Scripts starter VPN-klienter på det lag, forfatteren valgte, og det lag er sjældent det, opgaven havde brug for. Leverandørens kommandolinje, styresystemets opkalder og et mobilt app-intent vender alle tilbage på forskellige punkter i forbindelsens liv. De håndterer også hemmeligheden forskelligt, og den forskel afgør, om adgangskoden er synlig for hver bruger på maskinen. Vælg laget, før du skriver scriptets første linje.
Lag 1: leverandørens kommandolinje
De fleste desktopklienter leverer en kommandolinje, der tager et profilnavn og, alt for ofte, en adgangskode. Ciscos ældre klient accepterede et connect-verbum med bruger- og adgangskodeargumenter; macOS eksponerer den indbyggede tjeneste via networksetup; NetworkManager svarer på nmcli. Disse kald vender tilbage, når kommandoen er færdig, hvilket ikke er det samme øjeblik som det, hvor tunnelen bliver brugbar. Læs leverandørens egen dokumentation for den version, du udruller, fordi disse grænseflader ændrer sig, og nogle fjernes helt.
nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"
Fordelen er, at leverandøren kender sin egen profilopbevaring, så kaldet bruger den samme konfiguration som GUI'en. Ulempen er, at hver leverandør opfinder sine egne verber, og et script skrevet til én klient overføres ikke til en anden. Betragt dette lag som den korteste vej, når klienten er fast og versionen er pinnet.
Lag 2: styresystemets egen tjeneste
På Windows er opkalderen en del af styresystemet, og den arbejder mod en telefonbogsindgang i stedet for leverandørens profilopbevaring. Det gør den mere portabel på tværs af klienter og lettere at skripte fra en tjenestekonto. Det betyder også, at forbindelsen kan findes ét sted og ikke det andet, hvilket forvirrer folk, der kigger i den forkerte liste.
rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus
Brug PowerShell-fladen, når du skal oprette eller fjerne indgangen i stedet for at ringe op. WMI- og cmdlet-lagene eksponerer de samme objekter under forskellige navne, og fjernelse er en separat handling fra afbrydelse. Et script, der kun ringer op, efterlader forældede indgange efter en migrering. Kontroller, hvilken opbevaring din automatisering skriver til, før du lover, at oprydningen sker.
Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection
På macOS er ækvivalenten listen over netværkstjenester, hvor en eksisterende tjeneste forbindes ved navn i stedet for at blive oprettet på stedet.
Legitimationsoplysninger lækker på hvert lag, så vælg kanalen
Alt, hvad du sender på kommandolinjen, vises i procestabellen for hver lokal bruger, og det overlever som regel også i shellhistorikken. OpenVPNs understøttede alternativ er at læse hemmeligheden fra en fil med --askpass, og filen selv skal have rettigheder, der matcher den tillid, du har til den. Et navngivet rør undgår at skrive hemmeligheden til disk, men lader enhver proces, der kan åbne det, skrive der. På Windows skal du gemme hemmeligheden i legitimationsadministratoren eller i en fil, som kun tjenestekontoen kan læse, og aldrig 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 regel gælder for tokens og engangskoder: hvis automatiseringen har brug for dem, har automatiseringen brug for en kanal, der ikke er et kommandolinjeargument. Rotér hemmeligheden, når du ændrer mekanismen, fordi den gamle værdi har ligget i en log et eller andet sted. Et script, der virker og lækker, er ikke et fungerende script.
Vent på tilstand, og før derefter tilsyn med én ejer
Hvert af disse kald vender tilbage, før tunnelen er klar, så poll den tilstand, klienten eksponerer, eller undersøg en destination indeni den med en timeout. At kopiere filer eller åbne en databaseforbindelse umiddelbart efter opkaldet er et kapløb, og det fejler periodisk på en måde, der ligner en netværksfejl.
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
Afbrydelse har det samme problem i omvendt retning: processen kan afslutte, før ruterne er væk. Brug klientens hooks, hvor de findes, som up- og down-scripts i OpenVPN eller en systemd-units ExecStartPost, fordi de kører på det punkt, du faktisk bekymrer dig om. Hooks kører med rettighederne fra det, der kaldte dem, så en hook, der genstarter netværk, har brug for en eksplicit regel i stedet for en antagelse. Hold præcis én ejer i forbindelsens levetid.
Når to tilsynsførere både starter og stopper den profil, er resultatet en genopkoblingsløkke, der læses som en udbydernedbrud. Runbooken slutter, når laget er dokumenteret, hemmeligheden har en kanal, der ikke er argv, vente-betingelsen er et tilstandstjek med en timeout, og én proces ejer livscyklussen.