VPN lórí Mac ti so ṣùgbọ́n ip-up kò ṣiṣẹ́ rí: ṣe ìṣọ́ launchd kan
Àwọn tunnel Cisco IPSec àti IKEv2 kì í bẹ̀rẹ̀ pppd, nítorí náà /etc/ppp/ip-up wà ní ìdákẹ́jẹ́. Ṣọ́ fódà ìṣètò náà kí o sì jẹ́ kí script náà fi tunnel náà hàn.
O fi àṣẹ route sínú /etc/ppp/ip-up, o tún tunnel ọ́fíìsì so, ṣùgbọ́n fáìlì náà kò ṣiṣẹ́ rí. Kò sí àṣìṣe kankan nínú script náà: ìsopọ̀ yẹn kò gba PPP kọjá rárá. Àwọn oníbàárà Cisco IPSec àti IKEv2 tí ó wà nínú ẹ̀rọ kì í bẹ̀rẹ̀ pppd, nítorí náà a kì í ka fódà hook náà, nígbà tí PPTP àti L2TP lórí IPSec ṣì ń gba inú rẹ̀ kọjá. Ṣe ìpinnu irú ọ̀ràn tí ìwọ ní, lẹ́yìn náà ṣe ìfilọ́lẹ̀ ọ̀ràn tí kì í ṣe PPP láti iṣẹ́ ìṣọ́ launchd kan.
Ṣàyẹ̀wò interface kí o tó ṣàtúnṣe hook kankan
Àwọn àṣẹ méjì ń pinnu irú ọ̀nà tí ó lè ṣiṣẹ́. Ṣe àkójọ àwọn iṣẹ́ tí a ṣètò, lẹ́yìn náà ṣe àkójọ àwọn interface tí ó wà nígbà tí tunnel náà wà lórí. Orúkọ interface ni ẹ̀rí; àmì tí ó wà nínú System Settings kì í ṣe ẹ̀rí.
scutil --nc list
ifconfig -l | tr ' ' '\n' | grep -E '^(utun|ppp)[0-9]+$'
Iṣẹ́ tí ó ń dá ppp0 ń ṣiṣẹ́ àwọn hook PPP yóò sì ṣiṣẹ́ fáìlì rẹ. Iṣẹ́ Cisco IPSec tàbí IKEv2 ń dá ẹ̀rọ utun ní ààyè rẹ̀, interface tunnel tí kò ní ìpele PPP, nítorí náà kò sí ohunkóhun nínú /etc/ppp tí ó lè dé ọ̀dọ̀ rẹ̀. Nígbà tí irú méjèèjì bá jáde, ṣàyẹ̀wò iṣẹ́ tí o so mọ́. Àwọn ènìyàn ń fi ọ̀sán ṣòfò lórí hook tí kò tọ́ nípa kíkà orúkọ oníbàárà náà.
Lórí ọ̀nà PPP fáìlì náà gbọdọ̀ jẹ́ ti root àti pé ó lè ṣiṣẹ́, nítorí pppd ń ṣàyẹ̀wò méjèèjì kí ó tó ṣiṣẹ́ ohunkóhun. install ń ṣètò olówó àti ipò ní ìgbésẹ̀ kan.
sudo install -o root -g wheel -m 0755 /dev/null /etc/ppp/ip-up
sudo ls -l /etc/ppp/ip-up
Fáìlì tí a dá nípasẹ̀ Finder tàbí olóòtú àwòrán sábà máa ń di ti àkọsílẹ̀ rẹ, tàbí kò ní bítì ìṣiṣẹ́, lẹ́yìn náà yóò kùnà ní ìdákẹ́jẹ́ bí hook tí ó wà nínú àìsí. Fi ip-down sẹ́gbẹ̀ẹ́ rẹ̀ báyìí. root àti wheel nínú ìwé olówó pẹ̀lú rwxr-xr-x nínú ìwé ipò ni ohun tí o fẹ́.
Jẹ́ kí launchd ṣiṣẹ́ script náà nígbà tí tunnel bá jáde
Fún àwọn oníbàárà tí kì í fọwọ́ kan PPP, ohun tí ń mú ṣiṣẹ́ gbọdọ̀ wá láti ibòmíràn, àti pé ìpamọ́ ìṣètò ẹ̀rọ ni orísun òtítọ́: macOS ń tún un kọ ní gbogbo ìyípadà tunnel. Iṣẹ́ launchd tí ń ṣọ́ fódà yẹn ni a ń pè nígbà tí tunnel bá jáde tàbí sọnù.
<?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>
Fi í sínú bí launch daemon, kì í ṣe aṣojú fún olùlò kọ̀ọ̀kan, nítorí àtúnṣe ọ̀nà jẹ́ ti ẹ̀rọ náà. bootstrap ń rọ́pò ìrísí àtijọ́ load -w nínú àwọn ìtẹ̀jáde ìsinsìnyí. RunAtLoad ń jẹ́ kí ìṣiṣẹ́ àkọ́kọ́ lè ṣe àkíyèsí, ThrottleInterval sì ń dẹ́kun kí ìgbì àwọn ìyípadà ìsopọ̀ Wi-Fi ṣe ìfilọ́lẹ̀ script náà lẹ́ẹ̀mejì.
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
Ìdẹ̀kùn náà ni pé fódà tí a ń ṣọ́ ń yípadà fún àwọn ìṣẹ̀lẹ̀ tí kò ní í ṣe pẹ̀lú VPN rẹ: ìsopọ̀ Wi-Fi, ìmúdọ̀tun DHCP, fífi okùn sínú. Olùṣọ́ tí ó wà nísàlẹ̀ ń sọ ohun tí ń mú ṣiṣẹ́ tí ó ní ariwo di hook tí ó wúlò, ìlà àkọsílẹ̀ kan sì ń ṣàlàyé ọ̀nà ní wákàtí àjèjì.
Níní ohun jẹ́ ti script náà àti ti plist pẹ̀lú. Daemon tí ó ń ṣiṣẹ́ fáìlì nínú fódà tí àkọsílẹ̀ rẹ lè kọ sínú ń fi root fún àkọsílẹ̀ yẹn.
Dáàbò bo script náà kí ìṣiṣẹ́ kejì má ṣe àyípadà kankan
Script náà kọ́kọ́ ń pinnu bóyá tunnel wà, yóò sì jáde ní ìdákẹ́jẹ́ nígbà tí kò bá sí. Ohunkóhun tí ó tẹ̀lé gbọdọ̀ jẹ́ àìléwu fún àtúnṣe, nítorí ohun tí ń mú ṣiṣẹ́ ń ṣiṣẹ́ púpọ̀ ju ìsopọ̀ kan lọ. Yanjú interface náà ní àkókò ìṣiṣẹ́ dípò kíkọ àtọka tí yóò yípadà ní ìsopọ̀ tó ń bọ̀ mọ́ ẹ̀rọ.
#!/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 ń jáde pẹ̀lú ipò tí kì í ṣe òdo nígbà tí ọ̀nà náà ti wà, nítorí náà script tí ó ka gbogbo ipò tí kì í ṣe òdo sí ìkùnà ń ròyìn hook tí ó ti ṣẹ́ ní gbogbo ìgbà tí ó bá ṣe ohun tí ó tọ́. Ìdánwò netstat tí ó wà lókè ń sọ ọ̀ràn yẹn di no-op tí ó ṣe kedere.
Wíwà interface náà jẹ́ ẹ̀rí tí ó rẹ̀wẹ̀sì ju bí ó ti dàbí lọ, nítorí àwọn oníbàárà VPN mìíràn àti àwọn àyíká kọ́ńtéínà kan ń dá àwọn ẹ̀rọ utun pẹ̀lú. Béèrè lọ́wọ́ iṣẹ́ náà fúnra rẹ̀ pẹ̀lú scutil --nc status "Office VPN" kí o sì béèrè ipò ìsopọ̀ kí o tó fọwọ́ kan ìtọ́sọ́nà. Tọ́jú ìdáhùn náà nínú ìlà àkọsílẹ̀ kan, nítorí pé ní ọ̀sẹ̀ kan lẹ́yìn náà àkọsílẹ̀ yẹn ni ìṣàlàyé kan ṣoṣo tí ìwọ yóò ní.
Mú ẹnubodè padà láìfọ́ DNS
Nígbà tí tunnel náà bá gba ọ̀nà àkọ́kọ́, ìwéwèé ojoojúmọ́ ń jáde nípasẹ̀ ọ́fíìsì, ọ̀nà íńtánẹ́ẹ̀tì àdúgbò á sì dáwọ́. Kọ́kọ́ mú router interface tí ó jẹ́ ti ara, lẹ́yìn náà darí ọ̀nà àkọ́kọ́ padà sọ́dọ̀ rẹ̀. DHCP sàn ju ṣíṣe àtúpalẹ̀ ìtẹ̀ tí ó ti ni àkọ́kọ́ tirẹ̀ nínú.
PHYS=en0
GW=$(ipconfig getoption "$PHYS" router)
[ -n "$GW" ] && sudo route -n change default "$GW"
Àwọn olùyánjú jẹ́ ìpele ọ̀tọ̀ pẹ̀lú irinṣẹ́ ọ̀tọ̀, àtúnṣe ọ̀nà kò sì tún wọ́n ṣe. Wo ohun tí ó wà ní ipò pẹ̀lú scutil --dns, lẹ́yìn náà tún ohun tí ó ń dá a ṣe: ìtòlẹ́sẹẹsẹ iṣẹ́ àti àwọn ìkọsílẹ̀ DNS lórí iṣẹ́ ara. Pípa káṣì mọ́ ń ṣe ìwádìí ìwákiri tí ó há mọ́ lẹ́yìn ìyípadà nẹ́tíwọ́kì; kì í ṣe ohun tí a ó ṣètò.
Tunnel tí ó ye ìyípadà Wi-Fi kọjá nígbà tí DNS dúró jẹ́ àṣìṣe kẹta: sudo killall -HUP mDNSResponder ń mú kí olùyánjú tún ìṣètò rẹ̀ kà. Lò ó lẹ́ẹ̀kan, pẹ̀lú ọwọ́.
Fi hàn pé iṣẹ́ náà ń ṣiṣẹ́ fúnra rẹ̀
Fi ipá mú ìṣiṣẹ́ kan pẹ̀lú kickstart -k kí o tó gbẹ́kẹ̀lé ọ̀nà ìṣọ́, lẹ́yìn náà ka ipò àbájáde tí iṣẹ́ náà kọ sílẹ̀. Àbájáde mímọ́ ń fi hàn pé script náà ń ṣiṣẹ́; kò fi hàn pé ohun tí ń mú ṣiṣẹ́ ń ṣiṣẹ́. Lẹ́yìn náà já jáde kí o sì tún so mọ́ pẹ̀lú iṣẹ́ náà tí a gbé kalẹ̀, kí o sì ṣọ́ ìṣiṣẹ́ tí ìwọ kò béèrè.
sudo launchctl kickstart -k system/net.example.tunnel-watch
sudo launchctl print system/net.example.tunnel-watch | grep -E 'last exit code|state ='
Ṣàyẹ̀wò scutil --nc status kí àti lẹ́yìn gbogbo ìgbìyànjú. Script tí ó ṣiṣẹ́ nígbà tí tunnel náà wà nísàlẹ̀ kò fi ohunkóhun hàn nípa ọ̀nà ìsopọ̀.
Ẹ̀ka ìtúká tọ́ sí ìtọ́jú kan náà bí ẹ̀ka ìsopọ̀: yọ ọ̀nà náà kúrò pẹ̀lú ọwọ́, jẹ́ kí iṣẹ́ náà ṣiṣẹ́, kí o sì fi hàn pé ó padà wá. Hook tí ó ń fi ọ̀nà kún un tí kò sì yọ ọ́ kúrò rí ń fi ẹ̀rọ tí yóò hùwà búburú ní ọ̀sẹ̀ kan lẹ́yìn náà sílẹ̀, láìsí ohun tí yóò so àwọn ìṣẹ̀lẹ̀ méjèèjì pọ̀. Nígbà tí àwọn ìhùwàsí méjèèjì bá dúró, sudo launchctl bootout system/net.example.tunnel-watch ń fi iṣẹ́ náà jáde ní mímọ́. Daemon ìṣọ́ tí a fi kalẹ̀ sílẹ̀ ni ọ̀nà tí àtúnṣe ẹ̀ẹ̀kan ṣe ń di ọ̀nà tí kò ní ìṣàlàyé ní àwọn oṣù tó ń bọ̀.