Mac VPN povezan, ali ip-up se nikad nije pokrenuo: pokrenite launchd nadzor
Cisco IPSec i IKEv2 tuneli nikad ne pokreću pppd, pa /etc/ppp/ip-up ostaje tih. Nadzirite mapu konfiguracije i natjerajte skriptu da dokaže tunel.
Stavite route naredbu u /etc/ppp/ip-up, ponovno povežete uredski tunel, a datoteka se nikad ne izvrši. Sa skriptom nije ništa pogrešno: ta veza uopće ne prolazi kroz PPP. Ugrađeni Cisco IPSec i IKEv2 klijenti nikad ne pokreću pppd, pa se mapa kuka nikad ne čita, dok PPTP i L2TP preko IPSec-a i dalje prolaze kroz nju. Utvrdite koji je slučaj kod vas, a zatim pokrenite ne-PPP slučaj iz launchd posla za nadzor.
Provjerite sučelje prije nego uredite bilo koju kuku
Dvije naredbe određuju koji mehanizam može raditi. Izlistajte konfigurirane usluge, zatim izlistajte sučelja koja postoje dok je tunel aktivan. Naziv sučelja je dokaz; oznaka u Sistemskim postavkama nije.
scutil --nc list
ifconfig -l | tr ' ' '\n' | grep -E '^(utun|ppp)[0-9]+$'
Usluga koja stvara ppp0 izvršava PPP kuke i izvršit će vašu datoteku. Cisco IPSec ili IKEv2 usluga umjesto toga stvara utun uređaj, sučelje tunela bez PPP sloja, pa ništa unutar /etc/ppp ne može do njega doći. Kad se pojave obje vrste, provjerite na koju ste se uslugu povezali. Ljudi izgube poslijepodne na pogrešnoj kuki čitajući naziv klijenta.
Na PPP putu datoteka mora biti u vlasništvu roota i izvršna, jer pppd provjerava oboje prije nego što išta pokrene. install postavlja vlasnika i način u jednom koraku.
sudo install -o root -g wheel -m 0755 /dev/null /etc/ppp/ip-up
sudo ls -l /etc/ppp/ip-up
Datoteka stvorena kroz Finder ili grafički uređivač često završi u vlasništvu vašeg računa ili bez izvršnog bita, pa onda padne jednako tiho kao kuka koja nedostaje. Stavite ip-down uz nju sada. root i wheel u stupcu vlasnika plus rwxr-xr-x u stupcu načina je ono što želite.
Pustite launchd da pokrene skriptu kad se tunel pojavi
Za klijente koji nikad ne dotiču PPP okidač mora doći s drugog mjesta, a spremište sistemske konfiguracije je pošten izvor: macOS ga prepisuje pri svakom prijelazu tunela. launchd posao koji nadzire tu mapu poziva se kad se tunel pojavi ili nestane.
<?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>
Instalirajte ga kao launch daemon, ne kao agenta po korisniku, jer popravak ruta pripada stroju. bootstrap zamjenjuje stariji oblik load -w u trenutnim izdanjima. RunAtLoad čini prvo izvršavanje vidljivim, a ThrottleInterval sprječava da nalet promjena pri spajanju na Wi-Fi više puta pokrene skriptu.
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
Zamka je u tome da se nadzirana mapa mijenja i za događaje koji nemaju veze s vašim VPN-om: spajanje na Wi-Fi, obnova DHCP-a, ukopčan kabel. Stražar ispod pretvara bučni okidač u upotrebljivu kuku, a zapis u dnevniku objašnjava rutu u neobičan sat.
Vlasništvo pokriva plist kao i skriptu. Daemon koji izvršava datoteku u mapi u koju vaš račun može pisati daje tom računu root.
Zaštitite skriptu da drugo pokretanje ništa ne promijeni
Skripta najprije odluči postoji li tunel i tiho izađe ako ne postoji. Sve nakon toga mora biti sigurno za ponavljanje, jer se okidač aktivira mnogo češće nego jedna veza. Razriješite sučelje u vrijeme izvođenja umjesto da tvrdo kodirate indeks koji se mijenja pri sljedećem spajanju.
#!/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"
route add izlazi s ne-nula statusom kad ruta već postoji, pa skripta koja svaki ne-nula status tretira kao grešku svaki put prijavi slomljenu kuku kad radi ispravno. Test s netstat iznad pretvara taj slučaj u izričitu no-op.
Prisutnost sučelja slabiji je dokaz nego što izgleda, jer i drugi VPN klijenti i neka okruženja kontejnera stvaraju utun uređaje. Pitajte samu uslugu s scutil --nc status "Office VPN" i zahtijevajte povezano stanje prije nego dotaknete usmjeravanje. Držite odgovor u zapisu dnevnika, jer će tjedan dana kasnije taj zapis biti jedino objašnjenje koje imate.
Vratite pristupnik bez rušenja DNS-a
Kad tunel preuzme zadanu rutu, obično pregledavanje izlazi kroz ured, a lokalna internetska putanja prestaje raditi. Prvo uhvatite usmjerivač fizičkog sučelja, zatim zadanu rutu usmjerite natrag na njega. DHCP je bolji od parsiranja tablice koja već sadrži vlastitu zadanu rutu tunela.
PHYS=en0
GW=$(ipconfig getoption "$PHYS" router)
[ -n "$GW" ] && sudo route -n change default "$GW"
Razrješivači su zaseban sloj sa zasebnim alatom, a popravak rute ih ne popravlja. Pogledajte što je na snazi s scutil --dns, zatim popravite ono što to stvara: redoslijed usluga i DNS zapise na fizičkoj usluzi. Pražnjenje predmemorije dijagnosticira pretragu zaglavljenu nakon promjene mreže; to nije nešto što treba zakazivati.
Tunel koji preživi promjenu Wi-Fi veze dok DNS staje treća je greška: sudo killall -HUP mDNSResponder prisiljava razrješivač da ponovno pročita konfiguraciju. Upotrijebite ga jednom, ručno.
Dokažite da se posao sam pokreće
Prisilite jedno pokretanje s kickstart -k prije nego povjerujete putanji nadzora, zatim pročitajte izlazni status koji je posao zabilježio. Čist izlaz dokazuje da skripta radi; ne dokazuje da okidač radi. Zatim prekinite i ponovno se povežite s učitanim poslom i pazite na pokretanje koje niste tražili.
sudo launchctl kickstart -k system/net.example.tunnel-watch
sudo launchctl print system/net.example.tunnel-watch | grep -E 'last exit code|state ='
Provjerite scutil --nc status prije i poslije svakog pokušaja. Skripta koja je radila dok je tunel bio spušten ne dokazuje ništa o putanji spajanja.
Granu rastavljanja zaslužuje isti tretman kao granu spajanja: uklonite rutu ručno, pustite posao da radi i potvrdite da se vraća. Kuka koja dodaje rutu i nikad je ne uklanja ostavlja stroj koji se tjedan dana kasnije ponaša loše, a ništa ne povezuje ta dva događaja. Kad oba ponašanja vrijede, sudo launchctl bootout system/net.example.tunnel-watch čisto umirovljuje posao. Nadzorni daemon ostavljen učitan je način na koji jednokratni popravak mjesecima kasnije postaje neobjašnjena ruta.