Cuireann tú ordú route in /etc/ppp/ip-up, athcheanglaíonn tú tollán na hoifige, agus ní rithtear an comhad riamh. Níl aon locht ar an script: ní théann an ceangal sin trí PPP ar chor ar bith. Ní thosaíonn na cliaint ionsuite Cisco IPSec agus IKEv2 pppd riamh, mar sin ní léitear an t-eolaire crúcaí riamh, cé go dtéann PPTP agus L2TP thar IPSec tríd fós. Faigh amach cén cás atá agat, agus ansin spreag an cás neamh-PPP ó phost faireacháin launchd.

Seiceáil an comhéadan sula n-athraíonn tú aon chrúca

Réitíonn dhá ordú cén meicníocht a d’fhéadfadh oibriú. Liostaigh na seirbhísí cumraithe, ansin liostaigh na comhéadain atá ann agus an tollán suas. Is é ainm an chomhéadain an chruthúnas; ní hé an lipéad i Socruithe an Chórais.

scutil --nc list
ifconfig -l | tr ' ' '\n' | grep -E '^(utun|ppp)[0-9]+$'

Ritheann seirbhís a tháirgeann ppp0 na crúcaí PPP agus rithfidh sí do chomhad. Táirgeann seirbhís Cisco IPSec nó IKEv2 gléas utun ina ionad sin, comhéadan tolláin gan sraith PPP, mar sin ní féidir le haon rud taobh istigh de /etc/ppp é a shroicheadh. Nuair a thagann an dá chineál chun cinn, seiceáil cén tseirbhís a nasc tú. Cailleann daoine tráthnóna ar an gcrúca mícheart trí ainm an chliaint a léamh.

Ar an gcosán PPP caithfidh an comhad a bheith faoi úinéireacht root agus inrite, mar seiceálann pppd an dá rud sula ritheann sé aon rud. Socraíonn install úinéir agus mód in aon chéim amháin.

sudo install -o root -g wheel -m 0755 /dev/null /etc/ppp/ip-up
sudo ls -l /etc/ppp/ip-up

Is minic a chríochnaíonn comhad a chruthaítear trí Finder nó eagarthóir grafach faoi úinéireacht do chuntais, nó gan an giotán rith, agus ansin teipeann air chomh ciúin leis an gcrúca a bhí ar iarraidh. Cuir ip-down lena thaobh anois. Is é root agus wheel sa cholún úinéara móide rwxr-xr-x sa cholún móid an rud atá uait.

Lig do launchd an script a spreagadh nuair a thagann tollán chun cinn

I gcás cliant nach dtéann i dteagmháil le PPP riamh, caithfidh an spreagadh teacht ó áit éigin eile, agus is é an stór cumraíochta córais an fhoinse ionraic: athscríobhann macOS é ar gach aistriú tolláin. Glaoitear ar phost launchd a dhéanann faire ar an eolaire sin nuair a thagann tollán chun cinn nó nuair a imíonn sé.

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
  <key>WatchPaths</key>
  <array><string>/Library/Preferences/SystemConfiguration</string></array>
  <key>Label</key><string>net.example.tunnel-watch</string>
  <key>ProgramArguments</key>
  <array><string>/bin/sh</string><string>/usr/local/sbin/tunnel-hook</string></array>
  <key>RunAtLoad</key><true/>
  <key>ThrottleInterval</key><integer>20</integer>
</dict>
</plist>

Suiteáil é mar dhaemon launch, ní mar ghníomhaire in aghaidh an úsáideora, mar baineann deisiú bealaí leis an meaisín. Tagann bootstrap in áit an fhoirm níos sine load -w ar na heisiúintí reatha. Déanann RunAtLoad an chéad fhorghníomhú inbhraite, agus coisceann ThrottleInterval ar shraoth d’athruithe nascadh Wi-Fi an script a sheoladh arís agus arís eile.

sudo install -o root -g wheel -m 0644 tunnel-watch.plist \
  /Library/LaunchDaemons/net.example.tunnel-watch.plist
sudo launchctl bootstrap system \
  /Library/LaunchDaemons/net.example.tunnel-watch.plist

Is é an gaiste go n-athraíonn an t-eolaire a ndéantar faire air mar gheall ar imeachtaí nach bhfuil baint ar bith acu le do VPN: nascadh Wi-Fi, athnuachan DHCP, cábla á chur isteach. Athraíonn an garda thíos spreagadh torannach ina chrúca inúsáidte, agus míníonn líne loga bealach ag uair chorr.

Clúdaíonn úinéireacht an plist chomh maith leis an script. Tugann daemon a fhorghníomhaíonn comhad in eolaire ar féidir le do chuntas féin scríobh ann root don chuntas sin.

Cosain an script ionas nach n-athróidh dara rith rud ar bith

Socraíonn an script ar dtús an bhfuil an tollán ann, agus imíonn sé go ciúin nuair nach bhfuil. Caithfidh gach rud ina dhiaidh sin a bheith sábháilte le hathdhéanamh, mar scaoiltear an spreagadh i bhfad níos minice ná aon cheangal amháin. Réitigh an comhéadan ag am rite seachas innéacs a chódú go crua a athraíonn ar an gcéad nasc eile.

#!/bin/sh
set -u
TUN=$(ifconfig -l | tr ' ' '\n' | grep -m1 '^utun[0-9]' || true)
[ -n "$TUN" ] || exit 0
netstat -rn -f inet | grep -q '^10\.42' && exit 0
route -n add -net 10.42.0.0/16 -interface "$TUN"

Tagann route add amach le stádas neamh-nialasach nuair a bhíonn an bealach ann cheana féin, mar sin tuairiscíonn script a láimhseálann gach stádas neamh-nialasach mar theip crúca briste gach uair a dhéanann sé an rud ceart. Déanann an tástáil netstat thuas an cás sin a iompú ina no-op fhollasach.

Is cruthúnas níos laige é láithreacht an chomhéadain ná mar a fheictear, ó chruthaíonn cliaint VPN eile agus roinnt timpeallachtaí coimeádáin gléasanna utun freisin. Cuir ceist ar an tseirbhís féin le scutil --nc status "Office VPN" agus éiligh an staid cheangailte sula dtéann tú i dteagmháil le ródú. Coinnigh an freagra i líne loga, mar seachtain ina dhiaidh sin is é an taifead sin an t-aon mhíniú a bheidh agat.

Tabhair an geata ar ais gan DNS a bhriseadh

Nuair a ghlacann an tollán an bealach réamhshocraithe, imíonn brabhsáil ghnáth tríd an oifig agus stopann an cosán idirlín áitiúil ag obair. Gabh ródaire an chomhéadain fhisiceach ar dtús, ansin dírig an réamhshocrú ar ais air. Sáraíonn DHCP anailís a dhéanamh ar thábla a choinníonn réamhshocrú an tolláin féin cheana féin.

PHYS=en0
GW=$(ipconfig getoption "$PHYS" router)
[ -n "$GW" ] && sudo route -n change default "$GW"

Is sraith ar leith iad na réiteoirí le huirlis ar leith, agus ní dheisíonn deisiú an bhealaigh iad. Féach le scutil --dns cad atá i bhfeidhm, ansin deisigh an rud a tháirgeann é: ord na seirbhísí agus na hiontrálacha DNS ar an tseirbhís fhisiceach. Déanann folmhú an taisce diagnóis ar chuardach atá sáinnithe tar éis athrú líonra; ní rud é le sceidealú.

Is é tollán a mhaireann athrú Wi-Fi agus DNS ina stad an tríú locht: cuireann sudo killall -HUP mDNSResponder ar an réiteoir a chumraíocht a athléamh. Bain úsáid as aon uair amháin, de láimh.

Cruthaigh go spreagann an post é féin

Cuir iallach ar aon rith amháin le kickstart -k sula gcuireann tú muinín sa chosán faire, ansin léigh an stádas scoir a thaifead an post. Cruthaíonn scór glan go n-oibríonn an script; ní chruthaíonn sé go n-oibríonn an spreagadh. Ansin dícheangail agus athcheangail leis an bpost luchtaithe, agus breathnaigh ar rith nár iarr tú.

sudo launchctl kickstart -k system/net.example.tunnel-watch
sudo launchctl print system/net.example.tunnel-watch | grep -E 'last exit code|state ='

Seiceáil scutil --nc status roimh gach iarracht agus ina diaidh. Ní chruthaíonn script a rith agus an tollán síos aon rud faoin gcosán ceangail.

Tá an brainse scartála tuillte ag an gcóireáil chéanna leis an mbrainse ceangail: bain an bealach de láimh, lig don phost rith, agus dearbhaigh go dtagann sé ar ais. Fágann crúca a chuireann bealach leis agus nach mbaineann riamh é meaisín a iompraíonn go dona seachtain ina dhiaidh sin, gan aon rud ag nascadh an dá imeacht. Nuair a sheasann an dá iompar, scoireann sudo launchctl bootout system/net.example.tunnel-watch an post go glan. Is é daemon faire a fhágtar luchtaithe an bealach a n-iompaíonn deisiú aonuaire ina bhealach gan mhíniú míonna ina dhiaidh sin.

Ailt ghaolmhara