Jums ir saglabāts VPN pakalpojums Sistēmas iestatījumos, un jūs vēlaties, lai terminālis to palaistu. MacOS atbalstītais ceļš ir scutil --nc, bet tikai pakalpojumiem, kas pieder pašas sistēmas tīkla savienojumu pārvaldniekam. Izvēlņu josla nav API: trešo pušu klientiem parasti ir sava automatizācija, un pārvaldības pakalpojuma nosūtīts profils var atteikties no vietējas palaišanas. Šis ir manis veiktais kontrolsaraksts: atrodiet precīzo pakalpojumu, izlasiet tā stāvokli, palaidiet to, nogaidiet stāvokļa maiņu un tad pierādiet, ka trafiks patiešām izmanto tuneli. Apstājieties pie pirmā soļa, kas nesakrīt, jo katra nākamā komanda pieņem, ka iepriekšējā izdevās.

Atrodiet pakalpojumu pirms mēģināt to palaist

Sāciet ar inventarizāciju, nevis ar atcerēto profila nosaukumu:

scutil --nc help
scutil --nc list

Katra rinda savieno stāvokli ar pakalpojuma identifikatoru, tipu un parādāmo nosaukumu. Identifikators ir vērtība, pret kuru raksta skriptus, jo parādamie nosaukumi atkārtojas un tos var rediģēt. Apple scutil rokasgrāmata dokumentē tīkla savienojuma režīmu, bet instalētais --nc help ir autoritatīvais apakškomandu saraksts tajā Mac; nepieņemiet, ka karodziņš no vecākas rokasgrāmatas joprojām pastāv jūsu macOS versijā.

Tukšs saraksts ir rezultāts, nevis kļūda. Piegādātāja klienta vai pārvaldības profila izveidots pakalpojums var būt aktīvs, kamēr šeit nav redzams, vai redzams ar tipu, kuru vietējais kontrolieris nevar vadīt. Tādā gadījumā izmantojiet piegādātāja rīku vai profila dokumentāciju. Paralēla vietējā profila izveide tikai tāpēc, lai būtu ko palaist, ir slikts darījums.

Izlasiet pašreizējo stāvokli un apstipriniet selektoru

Pirms palaišanas pajautājiet pakalpojumam stāvokli, lai zinātu, ko veiksmīgai palaišanai vajadzētu mainīt:

scutil --nc status "Office VPN"

Ja divi pakalpojumi dala vienu parādāmo nosaukumu, nosaukums ir divdomīgs. Tā vietā nododiet identifikatoru; komanda pieņem abus, bet tikai identifikators garantē viena pakalpojuma izvēli. Pirms analīzes skriptā pārbaudiet, vai stāvokļa vārds ir viens no pazīstamajiem — parasti Connected, Disconnected, Connecting vai Disconnecting. Pārbaudiet arī, vai profils tiek pārvaldīts, jo bloķēta konfigurācija var pieņemt komandu un tomēr to ignorēt vai prasīt apstiprinājumu.

Šis stāvokļa izsaukums ir lēts, tāpēc izmantojiet to kā sargu automatizācijā: palaidiet tikai tad, kad stāvoklis ir Disconnected, un neuzskatiet Connecting par kļūdu. Ja pakalpojums jau ir Connected, izlaidiet palaišanu, nevis pārtrauciet strādājošu tuneli.

Palaidiet savienojumu un nogaidiet stāvokļa stabilizēšanos

Palaišanas pieprasījums ir asinhrons. Komanda atgriežas, kad pieprasījums pieņemts, nevis kad autentifikācija beigusies vai maršruti instalēti. Izpildiet to, pēc tam pārbaudiet stāvokli ar ierobežotu gaidīšanu un izejiet, ja pakalpojums atgriežas pie 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

Connecting stāvoklis, kas nekad neatrisinās, parasti norāda uz akreditācijas datiem, MFA vai serveri, nevis scutil. Komanda nevar nodrošināt interaktīvu pieteikšanos, tāpēc profils, kas gaida žetonu vai aparatūras atslēgu, paliks Connecting un galu galā atkāpsies. Pirms pievienojat atkārtojumus, izlasiet stāvokļa vārdu; cilpa pret autentifikācijas uzvedni nevar izdoties.

Neuzskatiet čaulas izejas statusu par gatavību. Noderīgais signāls ir stāvokļa virkne, kam seko pierādījums, ka tunelis pārvadā trafiku. Klusi atgriezoša palaišanas komanda joprojām var atstāt jūs ar savienojumu, kas nekad netiek autentificēts.

Pierādiet, ka tunelis pārvadā trafiku, ne tikai saka Connected

Connected apraksta savienojumu, nevis maršrutēšanas lēmumu. Vietējie PPP un IKEv2 pakalpojumi izveido ppp vai utun saskarni un instalē maršrutus, bet sadalītais tunelis apzināti atstāj noklusējuma maršrutu neskartu. Pārbaudiet saskarnes un abas adrešu saimes:

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

Atrodiet pakalpojuma izveidoto saskarni, nevis uzminiet numuru, tad pajautājiet maršrutēšanas tabulai, kuru saskarni izmanto konkrēts galamērķis: route -n get 10.0.0.10, aizstājot to ar iekšēju resursdatoru. Ja tā ziņo fizisko saskarni, tunelis ir ieslēgts, bet nepārvadā šo plūsmu. Pārbaudiet sadalītā tuneļa maršrutus, atrisinātāja secību un jebkuru vietējo ugunsmūra noteikumu, kas atļauj tuneļa saskarni, bet ne procesu.

Vārdu atrisināšana ir ierastais viltus negatīvais. Iekšējie nosaukumi var tikt atrisināti ar nepareizo atrisinātāju, kamēr tunelis ir pilnīgi vesels, kas izskatās pēc VPN kļūmes un tā nav. scutil --dns parāda secību, ko macOS izmantos; pēc atrisinātāja maiņas iztīriet kešatmiņu ar dscacheutil -flushcache un sudo killall -HUP mDNSResponder.

Turiet akreditācijas datus un privilēģijas ārpus komandrindas

Nekad nelieciet paroli, iepriekš koplietotu atslēgu vai žetonu argumentos. Argumenti ir redzami procesu sarakstos un nonāk čaulas vēsturē, un nokopēts atbalsta ieraksts var tos izpaust. Paša profila akreditācijas datu apstrāde — vai tas būtu Keychain elements, sistēmas uzvedne vai klienta autentifikācijas plūsma — ir vieta noslēpumiem.

Komandas izpilde ar sudo nepadara interaktīvu pieteikšanos bez uzraudzības. Tas maina faktisko lietotāju, nevis GUI uzvednes, aparatūras žetona vai pieteikšanās atslēgu saišķa pieejamību. LaunchAgent var palaist pakalpojumu pēc tam, kad lietotājs ir pieteicies un atslēgu saišķis atslēgts; LaunchDaemon parasti nevar sasniegt šīs lietotāja sesijas daļas. Ja organizācija pārvalda pakalpojumu, tās dzīves cikla noteikumi uzvar pār jebkuru vietējo skriptu.

Apturiet pakalpojumu un pārbaudiet, vai tas palika apturēts

Apturiet ar to pašu selektoru, ko izmantojāt palaišanai, tad nolasiet stāvokli vēlreiz, nevis pieņemiet, ka tunelis ir pazudis:

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

Apturēšana, kas atgriežas pie Disconnected, tomēr atstāj vienu lietu pārbaudei: vai profils ir iestatīts savienoties pēc pieprasījuma, kas var to atgriezt bez jūsu skripta. Ja citam klientam tajā pašā Mac ir maršruti, šie maršruti var pārdzīvot vietēju apturēšanu. Pirms secināt, ka mašīna ir ārpus VPN, vēlreiz pārbaudiet maršrutu.

Vienreizējam ietvaram, ko palaižat ar rokām, turiet secību fiksētu: saraksts, stāvoklis, palaišana, pārbaude, maršruta tests, apturēšana, apstiprinājums. Neanalizējiet draudzīgo nosaukumu no brīvas formas izvades, ja identifikators ir pieejams, un neuzskatiet palaišanas komandas izeju par gatavību. Savienojumu pārvaldnieks ziņo stāvokli; jūsu pierādījums ir stāvoklis un maršruts, kas norāda uz tuneli.

Saistītie raksti