Starea VPN pe macOS din terminal: scutil, rute sau ping
Starea serviciului, ruta din kernel și o cerere reală răspund la trei întrebări diferite. Scrieți scriptul după identificatorul serviciului și verificați și ruta.
Undeva într-un script de implementare există o verificare dacă tunelul este activ înainte de a începe copierea. Sunt disponibile trei răspunsuri și nu înseamnă același lucru: starea serviciului pe care o raportează scutil, ruta pe care a ales-o kernelul și dacă celălalt capăt chiar răspunde. Compararea lor este diferența dintre o verificare care prezice copierea și una care doar decorează jurnalul.
Trei răspunsuri la întrebarea dacă VPN-ul este activ
Starea serviciului este un fapt al planului de control. macOS știe că o configurație este conectată pentru că procesul ei client a spus asta. Ruta este un fapt al planului de date: kernelul va trimite această destinație prin interfața respectivă. Accesibilitatea este un fapt de la un capăt la altul și poate eșua din motive pe care niciuna dintre celelalte două nu le vede.
| Signal | Answers | Blind spot |
|---|---|---|
scutil --nc status | Is the service connected? | Third-party clients, wrong routes |
route -n get | Where would this go? | The peer may be down |
| A request to the far side | Does it work now? | Slow, and it changes state |
O verificare utilă le combină pe primele două și o folosește pe a treia ca confirmare că celelalte două nu au mințit. Oricare singură este o presupunere cu marcă de timp.
Citiți identificatorul, nu numele afișat
scutil --nc list
scutil --nc status "Office"
Lista tipărește o linie pentru fiecare serviciu, iar fiecare linie are o stare între paranteze, apoi identificatorul serviciului, tipul și numele afișat. Scrieți scriptul după identificator, pentru că numele afișat este ce a tastat cineva în Configurări de sistem și se poate schimba fără anunț. Comanda de stare tipărește un singur cuvânt, iar pentru unele tipuri de serviciu statistici după el; comparați acel prim cuvânt în loc să căutați numele în toată ieșirea, care apare și în alte locuri.
Pornirea unui serviciu poate ridica o solicitare de autorizare sau poate fi refuzată direct când profilul este administrat. Acel refuz nu este o defecțiune a tunelului; este o declarație de politică despre cine îl poate ridica.
Un client terț se ascunde din listă
O listă goală nu înseamnă că nu există VPN. Configurațiile create în setările de rețea ale sistemului apar aici; un client al furnizorului, un profil de administrare sau o aplicație terță pot ține un tunel activ pe care această comandă nu îl vede niciodată. Instrumentul propriu este autoritatea pentru propriul serviciu. Întrebarea lui scutil despre un client care nu s-a înregistrat niciodată la el nu returnează nimic, iar nimic nu este același răspuns ca deconectat.
Când lista este goală, dar traficul este evident criptat, căutați interfața: un dispozitiv utun sau ppp cu o adresă în intervalul așteptat este dovada că ceva a stabilit un tunel. Este un semnal mai slab decât starea serviciului, așa că împerecheați-l cu o verificare a rutei în loc să tratați interfața ca dovadă a identității. Mai mulți clienți pot crea mai multe astfel de interfețe și doar una dintre ele aparține tunelului la care v-ați gândit.
Starea nu este rutare
Un serviciu conectat spune că tunelul există. Nu spune că destinația dumneavoastră îl folosește. Citiți adresele, apoi întrebați kernelul direct:
ifconfig | grep -A4 utun
netstat -rn -f inet
route -n get 10.40.0.20
Un client cu tunel complet instalează o rută implicită prin tunel; un client cu tunel divizat instalează prefixe private specifice. Ambele raportează Connected, iar un script care verifică doar starea va rula fericit pe calea greșită. Oprirea unui tunel nu elimină neapărat rutele instalate de alt client, și acesta este unul dintre modurile în care o mașină ajunge cu un serviciu conectat și o rută învechită în același timp. Uitați-vă la destinația care vă interesează, nu la întreaga tabelă de rute.
Denumirea este o problemă separată
Alte mașini nu ajung la Mac după nume în timp ce adresa lui funcționează, iar asta este raportată ca defecțiune VPN. Numele local al gazdei, numele gazdei și înregistrarea DNS sunt trei lucruri diferite. scutil --get LocalHostName arată numele Bonjour; sudo scutil --set HostName mac-office setează numele pe care îl raportează sistemul.
Niciuna dintre setări nu creează o înregistrare în zona biroului. Dacă alte gazde trebuie să rezolve numele prin DNS, proprietarul zonei trebuie să o adauge, sau scriptul ar trebui să folosească adresa. Setarea unui nume stabil face anunțurile consistente; nu face resolverul să răspundă.
Înregistrați împreună în script identificatorul serviciului și forma așteptată a rutei, și verificați ambele înainte de copiere. Un tunel activ dar rutat în direcția greșită eșuează exact ca niciun tunel, iar linia de jurnal care spune Connected va trimite următoarea persoană să caute în locul greșit.