V Sistemskih nastavitvah imate shranjeno storitev VPN in želite, da jo terminal zažene. V macOS je podprta pot scutil --nc, vendar samo za storitve, ki so v lasti sistemskega upravitelja omrežnih povezav. Menijska vrstica ni API: odjemalci tretjih strani imajo običajno svojo avtomatizacijo, profil, ki ga potisne storitev upravljanja, pa lahko zavrne lokalni zagon. To je kontrolni seznam, ki ga izvajam: poiščite natančno storitev, preberite njeno stanje, zaženite jo, počakajte na spremembo stanja in nato dokažite, da promet res uporablja tunel. Ustavite se pri prvem koraku, ki se ne ujema, ker vsak naslednji ukaz predpostavlja, da je prejšnji uspel.

Poiščite storitev, preden jo poskusite zagnati

Začnite z inventarjem, ne z imenom profila, ki se ga spomnite:

scutil --nc help
scutil --nc list

Vsaka vrstica poveže stanje z identifikatorjem storitve, vrsto in prikazanim imenom. Identifikator je vrednost, za katero se pišejo skripte, ker se prikazana imena ponavljajo in jih je mogoče urejati. Appleov priročnik scutil dokumentira način omrežne povezave, medtem ko je nameščen --nc help verodostojni seznam podukazov na tem Macu; ne predpostavljajte, da zastavica iz starejšega vodnika še obstaja v vaši različici macOS.

Prazen seznam je rezultat, ne napaka. Storitev, ki jo ustvari odjemalec ponudnika ali profil upravljanja, je lahko dejavna, medtem ko tu ni vidna, ali vidna z vrsto, ki je domači krmilnik ne more upravljati. V tem primeru uporabite orodje ponudnika ali dokumentacijo profila. Ustvarjanje vzporednega domačega profila samo zato, da bi imeli kaj zagnati, je slaba kupčija.

Preberite trenutno stanje in potrdite izbirnik

Pred zagonom vprašajte storitev za stanje, da boste vedeli, kaj naj uspešen zagon spremeni:

scutil --nc status "Office VPN"

Če si dve storitvi delita prikazano ime, je ime dvoumno. Namesto tega posredujte identifikator; ukaz sprejme oba, a samo identifikator zagotavlja izbiro ene storitve. Preden ga razčlenite v skriptu, preverite, da je beseda stanja ena, ki jo poznate — običajno Connected, Disconnected, Connecting ali Disconnecting. Preverite tudi, ali je profil upravljan, ker lahko zaklenjena konfiguracija ukaz sprejme in ga vseeno prezre ali zahteva potrditev.

Ta klic stanja je poceni, zato ga v avtomatizaciji uporabite kot stražarja: zaženite samo, ko je stanje Disconnected, in Connecting ne obravnavajte kot napako. Če je storitev že Connected, preskočite zagon, namesto da prekinete delujoč tunel.

Zaženite povezavo in počakajte, da se stanje umiri

Zahteva za zagon je asinhrona. Ukaz se vrne, ko je zahteva sprejeta, ne ko se preverjanje pristnosti konča ali so nameščene poti. Zaženite ga, nato preverjajte stanje z omejenim čakanjem in izstopite, če storitev pade nazaj na Disconnected:

scutil --nc start "Office VPN"
n=0
while [ "$n" -lt 30 ]; do
  state=$(scutil --nc status "Office VPN" | head -n 1)
  [ "$state" = "Connected" ] && break
  [ "$state" = "Disconnected" ] && { echo "start failed"; exit 1; }
  sleep 2
  n=$((n + 1))
done

Stanje Connecting, ki se nikoli ne razreši, običajno kaže na poverilnice, MFA ali strežnik, ne na scutil. Ukaz ne more zagotoviti interaktivne prijave, zato bo profil, ki pričakuje žeton ali strojni ključ, ostal v Connecting in se na koncu umaknil. Preberite besedo stanja, preden dodate ponovitve; zanka proti pozivu za preverjanje pristnosti ne more uspeti.

Ne obravnavajte izhodnega statusa lupine kot pripravljenost. Koristen signal je niz stanja, ki mu sledi dokaz, da tunel prenaša promet. Ukaz za zagon, ki se tiho vrne, vas lahko še vedno pusti s povezavo, ki se nikoli ne preveri.

Dokažite, da tunel prenaša promet, ne le da pravi Connected

Connected opisuje povezavo, ne odločitve o usmerjanju. Domače storitve PPP in IKEv2 ustvarijo vmesnik ppp ali utun in namestijo poti, medtem ko razdeljeni tunel namenoma pusti privzeto pot nedotaknjeno. Preglejte vmesnike in obe družini naslovov:

ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns

Poiščite vmesnik, ki ga je ustvarila storitev, namesto da bi ugibali številko, nato vprašajte usmerjevalno tabelo, kateri vmesnik uporablja določen cilj: route -n get 10.0.0.10, z notranjim gostiteljem na njegovem mestu. Če poroča fizični vmesnik, je tunel aktiven, a ne prenaša tega toka. Preverite poti razdeljenega tunela, vrstni red razreševalnikov in vsako lokalno pravilo požarnega zidu, ki dovoljuje vmesnik tunela, ne pa procesa.

Razreševanje imen je običajni lažni negativ. Notranja imena se lahko razrešijo prek napačnega razreševalnika, medtem ko je tunel popolnoma zdrav, kar je videti kot okvara VPN in ni. scutil --dns prikaže vrstni red, ki ga bo uporabil macOS; po spremembi razreševalnika izpraznite predpomnilnik z dscacheutil -flushcache in sudo killall -HUP mDNSResponder.

Hranite poverilnice in privilegije zunaj ukazne vrstice

Nikoli ne postavljajte gesla, vnaprej skupnega ključa ali žetona v argumente. Argumenti so vidni na seznamih procesov in pristanejo v zgodovini lupine, kopiran zapis podpore pa jih lahko razkrije. Lastno upravljanje poverilnic profila — bodisi element Keychain, sistemski poziv ali tok preverjanja pristnosti odjemalca — je mesto za skrivnosti.

Izvajanje ukaza s sudo ne naredi interaktivne prijave brez nadzora. Spremeni dejanskega uporabnika, ne pa razpoložljivosti poziva GUI, strojnega žetona ali prijavne Keychain. LaunchAgent lahko zažene storitev po tem, ko se uporabnik prijavi in se Keychain odklene; LaunchDaemon običajno ne doseže teh delov uporabniške seje. Če storitev upravlja organizacija, njena pravila življenjskega cikla prevladajo nad vsako lokalno skripto.

Ustavite storitev in preverite, da je ostala ustavljena

Ustavite z istim izbirnikom, ki ste ga uporabili za zagon, nato znova preberite stanje, namesto da bi predpostavili, da je tunel izginil:

scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"

Ustavitev, ki se vrne na Disconnected, vseeno pusti eno stvar za preveriti: ali je profil nastavljen na povezovanje na zahtevo, kar ga lahko vrne brez vaše skripte. Če ima drug odjemalec poti na istem Macu, lahko te poti preživijo domačo ustavitev. Preden sklepate, da je stroj zunaj VPN, znova preverite pot.

Za ovoj, ki ga zaženete ročno, ohranite vrstni red nespremenjen: seznam, stanje, zagon, poizvedba, preizkus poti, ustavitev, preverjanje. Ne razčlenjujte prijaznega imena iz prostega izhoda, ko je identifikator na voljo, in ne obravnavajte izhoda ukaza za zagon kot pripravljenost. Upravitelj povezav poroča stanje; vaš dokaz je stanje plus pot, ki kaže na tunel.

Sorodni članki