Skrip vir 'n VPN-kliënt: kies die laag voor die wagwoord
Voorsiener-CLI, rasdial, 'n app-intensie of UI-outomatisering faal elkeen anders. Kies die laag, hou die geheim uit argv, en wag vir toestand, nie uitgangskodes nie.
Skrifte begin VPN-kliënte op watter laag die outeur ook al gekies het, en daardie laag is selde die een wat die taak nodig gehad het. Die voorsiener se opdragreël, die bedryfstelsel se inbeller en 'n mobiele app-intensie keer almal op verskillende punte in die verbinding se lewe terug. Hulle hanteer ook die geheim anders, en daardie verskil bepaal of die wagwoord vir elke gebruiker op die masjien sigbaar is. Kies die laag voordat jy die eerste reël van die skrip skryf.
Laag 1: die voorsiener se opdragreël
Die meeste lessenaarkliënte lewer 'n opdragreël wat 'n profielnaam en, te dikwels, 'n wagwoord aanvaar. Cisco se ou kliënt het 'n connect-werkwoord met gebruiker- en wagwoordargumente aanvaar; macOS stel die ingeboude diens deur networksetup beskikbaar; NetworkManager antwoord op nmcli. Hierdie oproepe keer terug wanneer die opdrag klaar is, wat nie dieselfde oomblik is as wanneer die tonnel bruikbaar word nie. Lees die voorsiener se eie dokumentasie vir die weergawe wat jy ontplooi, want hierdie koppelvlakke verander en sommige word heeltemal verwyder.
nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"
Die voordeel is dat die voorsiener sy eie profielstoor ken, so die oproep gebruik dieselfde konfigurasie as die GUI. Die nadeel is dat elke voorsiener sy eie werkwoorde uitdink, en 'n skrip wat vir een kliënt geskryf is, dra nie oor na 'n ander nie. Beskou hierdie laag as die kortste pad wanneer die kliënt vas is en die weergawe vasgespeld is.
Laag 2: die bedryfstelsel se eie diens
Op Windows is die inbeller deel van die bedryfstelsel, en dit werk teen 'n telefoonboekinskrywing eerder as die voorsiener se profielstoor. Dit maak dit meer draagbaar oor kliënte heen en makliker om vanaf 'n diensrekening te skrip. Dit beteken ook die verbinding kan op een plek bestaan en nie op die ander nie, wat mense verwar wat in die verkeerde lys kyk.
rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus
Gebruik die PowerShell-oppervlak wanneer jy die inskrywing moet skep of verwyder eerder as om dit te skakel. Die WMI- en cmdlet-lae stel dieselfde objekte onder verskillende name bloot, en verwydering is 'n aparte bewerking van ontkoppeling. 'n Skrip wat net skakel, sal verouderde inskrywings agterlaat na 'n migrasie. Kontroleer na watter stoor jou outomatisering skryf voordat jy belowe dat opruiming gebeur.
Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection
Op macOS is die ekwivalent die netwerkdienslys, waar 'n bestaande diens by naam gekoppel word eerder as om dit ter plaatse te skep.
Geloofsbriewe lek op elke laag, so kies die kanaal
Enigiets wat jy op die opdragreël deurgee, verskyn in die prosestabel vir elke plaaslike gebruiker, en dit oorleef gewoonlik ook in die dopgeskiedenis. OpenVPN se ondersteunde alternatief is om die geheim uit 'n lêer te lees met --askpass, en die lêer self het toestemmings nodig wat pas by die vertroue wat jy daarin plaas. 'n Benoemde pyp vermy om die geheim na skyf te skryf, maar laat enige proses wat dit kan oopmaak daar skryf. Op Windows, stoor die geheim in die geloofsbriefbestuurder, of in 'n lêer wat net die diensrekening kan lees, en nooit as 'n letterlike in 'n batch-lêer nie.
openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret
Dieselfde reël geld vir tekens en eenmalige kodes: as die outomatisering dit nodig het, het die outomatisering 'n kanaal nodig wat nie 'n opdragreëlargument is nie. Rotasie van die geheim wanneer jy die meganisme verander, want die ou waarde het êrens in 'n log gesit. 'n Skrip wat werk en lek, is nie 'n werkende skrip nie.
Wag vir toestand en hou dan toesig oor een eienaar
Elkeen van hierdie oproepe keer terug voordat die tonnel gereed is, so peil die toestand wat die kliënt blootstel of ondersoek 'n bestemming binne dit met 'n tydperk. Die kopiëring van lêers of die oopmaak van 'n databasisverbinding onmiddellik na die skakeloproep is 'n wedloop, en dit misluk intermitterend op 'n manier wat soos 'n netwerkfout lyk.
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
Ontkoppeling het dieselfde probleem in omgekeerde rigting: die proses kan beëindig voordat die roetes weg is. Gebruik die kliënt se hake waar dit bestaan, soos OpenVPN se op- en af-skripte of 'n systemd-eenheid se ExecStartPost, want dié hardloop op die punt waaraan jy werklik omgee. Hake hardloop met die voorregte van wat ook al hulle aangeroep het, so 'n haak wat netwerking herbegin, het 'n eksplisiete reël nodig eerder as 'n aanname. Hou presies een eienaar vir die leeftyd van die verbinding.
Wanneer twee toesighouers dieselfde profiel begin en stop, is die resultaat 'n herverbindingslus wat soos 'n verskafferonderbreking lees. Die runbook eindig wanneer die laag gedokumenteer is, die geheim 'n kanaal het wat nie argv is nie, die wagvoorwaarde 'n toestandkontrole met 'n tydperk is, en een proses die lewensiklus besit.