Sinulla on tallennettu VPN-palvelu Järjestelmäasetuksissa, ja haluat päätteen käynnistävän sen. macOS:ssä tuettu polku on scutil --nc, mutta vain palveluille, jotka järjestelmän oma verkkoyhteyksien hallinta omistaa. Valikkorivi ei ole API: kolmannen osapuolen asiakkailla on yleensä oma automaationsa, ja hallintapalvelun työntämä profiili voi kieltäytyä paikallisesta käynnistyksestä. Tämä on tarkistuslista, jonka käyn läpi: etsi tarkka palvelu, lue sen tila, käynnistä se, odota tilan muuttumista ja todista sitten, että liikenne todella kulkee tunnelin kautta. Pysähdy ensimmäiseen vaiheeseen, joka ei täsmää, koska jokainen myöhempi komento olettaa edellisen onnistuneen.

Etsi palvelu ennen kuin yrität käynnistää sen

Aloita luettelosta, älä muistamastasi profiilinimestä:

scutil --nc help
scutil --nc list

Jokainen rivi yhdistää tilan palvelutunnisteeseen, tyyppiin ja näyttönimeen. Tunniste on arvo, jota vasten skriptataan, koska näyttönimet toistuvat ja niitä voi muokata. Applen scutil-käsikirja dokumentoi verkkoyhteyden tilan, kun taas asennettu --nc help on kyseisen Macin alikomentojen valtuutettu luettelo; älä oleta, että vanhemman oppaan valitsin on vielä macOS-versiossasi.

Tyhjä luettelo on tulos, ei virhe. Toimittajan asiakasohjelman tai hallintaprofiilin luoma palvelu voi olla aktiivinen samalla kun se on täällä näkymätön, tai näkyvä tyypillä, jota natiivi ohjain ei voi ajaa. Siinä tapauksessa käytä toimittajan työkalua tai profiilin dokumentaatiota. Rinnakkaisen natiivin profiilin luominen vain käynnistettävän kohteen saamiseksi on huono kauppa.

Lue nykyinen tila ja vahvista valitsin

Kysy palvelun tilaa ennen käynnistämistä, jotta tiedät, mitä onnistuneen käynnistyksen pitäisi muuttaa:

scutil --nc status "Office VPN"

Jos kaksi palvelua jakaa näyttönimen, nimi on monitulkintainen. Anna sen sijaan tunniste; komento hyväksyy kummatkin, mutta vain tunniste takaa yhden palvelun valinnan. Tarkista, että tilasana on sinulle tuttu — yleensä Connected, Disconnected, Connecting tai Disconnecting — ennen kuin jäsennät sitä skriptissä. Tarkista myös, onko profiili hallittu, koska lukittu kokoonpano voi hyväksyä komennon ja silti jättää sen huomiotta tai kysyä vahvistusta.

Tämä tilakysely on halpa, joten käytä sitä vartijana automaatiossa: käynnistä vain, kun tila on Disconnected, äläkä pidä Connectingiä epäonnistumisena. Jos palvelu on jo Connected, ohita käynnistys sen sijaan, että keskeytät toimivan tunnelin.

Käynnistä yhteys ja odota tilan vakiintumista

Käynnistyspyyntö on asynkroninen. Komento palaa, kun pyyntö on hyväksytty, ei silloin kun todennus päättyy tai reitit asennetaan. Suorita se, kysy sitten tilaa rajoitetulla odotuksella ja poistu, jos palvelu palaa Disconnected-tilaan:

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-tila, joka ei koskaan ratkea, viittaa yleensä tunnistetietoihin, MFA:han tai palvelimeen, ei scutil:iin. Komento ei voi tarjota interaktiivista kirjautumista, joten tokenia tai laitteistoavainta odottava profiili jää Connecting-tilaan ja putoaa lopulta takaisin. Lue tilasana ennen uudelleenyritysten lisäämistä; silmukka todennuskehotetta vastaan ei voi onnistua.

Älä pidä kuoren poistumistilaa valmiutena. Hyödyllinen signaali on tilamerkkijono, jota seuraa todiste siitä, että tunneli kuljettaa liikennettä. Hiljaa palaava käynnistyskomento voi silti jättää sinut yhteyteen, joka ei koskaan todennu.

Todista, että tunneli kuljettaa liikennettä, ei vain että se sanoo Connected

Connected kuvaa yhteyttä, ei reitityspäätöstä. Natiivit PPP- ja IKEv2-palvelut luovat ppp- tai utun-rajapinnan ja asentavat reitit, kun taas jaettu tunneli jättää oletusreitin tarkoituksella rauhaan. Tarkastele rajapintoja ja molempia osoiteperheitä:

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

Etsi rajapinta, jonka palvelu loi, älä arvaa numeroa, ja kysy sitten reititystaulusta, mitä rajapintaa tietty kohde käyttää: route -n get 10.0.0.10, korvaamalla se sisäisellä isännällä. Jos se ilmoittaa fyysisen rajapinnan, tunneli on ylhäällä mutta ei kuljeta kyseistä virtaa. Tarkista jaetun tunnelin reitit, selvittäjän järjestys ja kaikki paikalliset palomuurisäännöt, jotka sallivat tunnelin rajapinnan mutta eivät prosessia.

Nimien selvitys on tavallinen väärä negatiivinen. Sisäiset nimet voivat selvityä väärän selvittäjän kautta, vaikka tunneli on täysin kunnossa, mikä näyttää VPN-vialta eikä ole sitä. scutil --dns näyttää järjestyksen, jota macOS käyttää; selvittäjän vaihdon jälkeen tyhjennä välimuisti komennoilla dscacheutil -flushcache ja sudo killall -HUP mDNSResponder.

Pidä tunnistetiedot ja oikeudet poissa komentoriviltä

Älä koskaan laita salasanaa, ennalta jaettua avainta tai tokenia argumentteihin. Argumentit näkyvät prosessiluetteloissa ja päätyvät kuoren historiaan, ja kopioitu tukituloste voi vuotaa ne. Profiilin oma tunnistetietojen käsittely — olipa kyseessä Keychain-kohde, järjestelmäkehotus tai asiakkaan todennusvirta — on salaisuuksien paikka.

Komennon suorittaminen komennolla sudo ei tee interaktiivisesta kirjautumisesta valvomatonta. Se vaihtaa tehokkaan käyttäjän, ei GUI-kehotuksen, laitteistotokenin tai kirjautumisen avainnipun saatavuutta. LaunchAgent voi käynnistää palvelun, kun käyttäjä on kirjautunut ja avainnippu avattu; LaunchDaemon ei yleensä yllä näihin käyttäjäistunnon osiin. Jos organisaatio hallitsee palvelua, sen elinkaarisäännöt voittavat minkä tahansa paikallisen skriptin.

Pysäytä palvelu ja varmista, että se pysyi pysäytettynä

Pysäytä samalla valitsimella, jota käytit käynnistämiseen, ja lue sitten tila uudelleen sen sijaan, että oletat tunnelin kadonneen:

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

Disconnected-tilaan palaava pysäytys jättää silti yhden asian tarkistettavaksi: onko profiili asetettu yhdistämään pyynnöstä, mikä voi tuoda sen takaisin ilman skriptiäsi. Jos toinen asiakas omistaa reitit samalla Macilla, ne reitit voivat selvitä natiivista pysäytyksestä. Tarkista reitti uudelleen ennen kuin päättelet, että kone on VPN:n ulkopuolella.

Käsin ajettavalle kääreelle pidä järjestys kiinteänä: luettelo, tila, käynnistys, kysely, reittitesti, pysäytys, varmistus. Älä jäsennä ystävällistä nimeä vapaamuotoisesta tulosteesta, kun tunniste on saatavilla, äläkä pidä käynnistyskomennon poistumista valmiutena. Yhteyksien hallinta ilmoittaa tilan; todisteesi on tila plus reitti, joka osoittaa tunneliin.

Aiheeseen liittyvät artikkelit