Mac VPN холбогдсон ч ip-up хэзээ ч ажиллаагүй: launchd хяналт ажиллуул
Cisco IPSec болон IKEv2 туннель pppd-г хэзээ ч эхлүүлдэггүй тул /etc/ppp/ip-up дуугүй үлддэг. Тохиргооны хавтсыг хянаж, скриптийг туннелийг батлуулахад хүргэ.
/etc/ppp/ip-up дотор route тушаал хийж, оффисын туннель дахин холбож байгаа ч файл хэзээ ч ажиллахгүй. Скриптэд алдаа байхгүй: тэр холболт PPP-ээр огт өнгөрдөггүй. Суулгасан Cisco IPSec болон IKEv2 клиентүүд pppd-г хэзээ ч эхлүүлдэггүй тул hook хавтас хэзээ ч уншигдахгүй, харин PPTP болон IPSec дээрх L2TP одоо ч түүгээр өнгөрдөг. Аль тохиолдол таных болохыг тогтоож, дараа нь PPP бус тохиолдлыг launchd хяналтын ажлаас эхлүүл.
Ямар ч hook засахын өмнө интерфейсийг шалга
Хоёр тушаал аль механизм ажиллаж болохыг шийднэ. Тохируулсан үйлчилгээнүүдийг жагсаа, дараа нь туннель асаалттай үед байгаа интерфейсүүдийг жагсаа. Интерфейсийн нэр нь нотолгоо; Системийн тохиргоод байх шошго нь биш.
scutil --nc list
ifconfig -l | tr ' ' '\n' | grep -E '^(utun|ppp)[0-9]+$'
ppp0 үүсгэдэг үйлчилгээ PPP hook-уудыг ажиллуулж, таны файлыг гүйцэтгэнэ. Cisco IPSec эсвэл IKEv2 үйлчилгээ оронд нь utun төхөөрөмж үүсгэдэг, PPP давхаргагүй туннелийн интерфейс, тиймээс /etc/ppp доторх юу ч түүнд хүрч чадахгүй. Хоёр төрөл хоёулаа гарч ирвэл аль үйлчилгээнд холбогдсоноо шалга. Хүмүүс клиентийн нэрийг уншиж буруу hook дээр үдээс хойш цагаа үрдэг.
PPP замд файл root-д харьяалагдаж, гүйцэтгэгдэх боломжтой байх ёстой, учир нь pppd ямар нэг зүйлийг ажиллуулахын өмнө хоёуланг нь шалгадаг. install эзэмшигч болон горимыг нэг алхамаар тогтоодог.
sudo install -o root -g wheel -m 0755 /dev/null /etc/ppp/ip-up
sudo ls -l /etc/ppp/ip-up
Finder эсвэл график засварлагчаар үүсгэсэн файл ихэвчлэн таны бүртгэлийн эзэмшилд ордог эсвэл гүйцэтгэх битгүй болж, дараа нь алга болсон hook шиг чимээгүй бүтэлгүй болдог. Одоо түүний хажууд ip-down тавь. Эзэмшигчийн баганад root ба wheel, горимын баганад rwxr-xr-x байх нь таны хүсэж буй зүйл.
Туннель гарч ирэхэд launchd скриптийг ажиллуул
PPP-д хэзээ ч хүрдэггүй клиентүүдийн хувьд триггер өөр газраас ирэх ёстой бөгөөд системийн тохиргооны агуулах нь шударга эх сурвалж: macOS үүнийг туннелийн шилжилт бүрт дахин бичдэг. Тэр хавтсыг хянадаг launchd ажил туннель гарч ирэх эсвэл алга болох үед дуудагдана.
<?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>
Үүнийг launch daemon хэлбэрээр суулга, хэрэглэгч тутмын агент хэлбэрээр биш, учир нь замын засвар машинтай холбоотой. bootstrap одоогийн хувилбаруудад хуучин load -w хэлбэрийг орлоно. RunAtLoad эхний гүйцэтгэлийг ажиглах боломжтой болгож, ThrottleInterval Wi-Fi холболтын өөрчлөлтийн урсгал скриптийг дахин дахин эхлүүлэхээс сэргийлнэ.
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
Хавх нь хянагдаж буй хавтас таны VPN-тэй ямар ч холбоогүй үйл явдлаар ч өөрчлөгддөг: Wi-Fi холболт, DHCP шинэчлэлт, кабель залгах. Доорх хамгаалагч чимээтэй триггерийг ашигтай hook болгож, логны мөр хачин цагийн замыг тайлбарлана.
Эзэмшил нь скриптээс гадна plist-д мөн хамаарна. Таны өөрийн бүртгэл бичиж чадах хавтас дахь файлыг гүйцэтгэдэг демон тэр бүртгэлд root өгдөг.
Скриптийг хамгаал, хоёр дахь ажиллагаа юу ч өөрчлөхгүй байг
Скрипт эхлээд туннель байгаа эсэхийг шийдэж, байхгүй бол чимээгүй гарна. Үүний дараах бүхэн давтахad аюулгүй байх ёстой, учир нь триггер нэг холболтоос хамаагүй олон удаа ажилладаг. Дараагийн холболтод өөрчлөгдөх индексийг хатуу кодлохын оронд интерфейсийг ажиллах үед тодорхойл.
#!/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 зам аль хэдийн байгаа үед тэгээс өөр статустай гардаг тул тэгээс өөр бүх статусыг алдаа гэж үздэг скрипт зөвийг хийх бүртээ эвдэрсэн hook мэдээлдэг. Дээрх netstat тест тэр тохиолдлыг тодорхой no-op болгоно.
Интерфейс байгаа нь харагдахаас сул нотолгоо, учир нь бусад VPN клиентүүд болон зарим контейнер орчин utun төхөөрөмжүүдийг мөн үүсгэдэг. scutil --nc status "Office VPN"-аар үйлчилгээнээс өөрөөс нь асууж, чиглүүлэлтэд хүрэхийн өмнө холбогдсон төлвийг шаард. Хариултыг логны мөрөнд хадгал, учир нь долоо хоногийн дараа тэр бичлэг л таны цорын ганц тайлбар болно.
DNS-ийг эвдэхгүйгээр гарцыг буцаа
Туннель үндсэн замыг авах үед энгийн хөтөлбөр оффисоор гарч, локал интернетийн зам ажиллахаа болино. Эхлээд физик интерфейсийн чиглүүлэгчийг барьж аваад, дараа нь үндсэн замыг түүн рүү буцаа. DHCP нь туннелийн өөрийн үндсэн замыг аль хэдийн агуулсан хүснэгтийг задлан шинжлэхээс дээр.
PHYS=en0
GW=$(ipconfig getoption "$PHYS" router)
[ -n "$GW" ] && sudo route -n change default "$GW"
Шийдэгч нь тусдаа хэрэгсэлтэй тусдаа давхарга бөгөөд замыг засах нь тэднийг засдаггүй. scutil --dns-аар юу хүчинтэй байгааг хараад, дараа нь түүнийг үүсгэдэг зүйлийг зас: үйлчилгээний дараалал ба физик үйлчилгээн дэх DNS бичлэгүүд. Кэш цэвэрлэх нь сүлжээ солигдсоны дараа гацсан хайлтыг оношгоодог; үүнийг төлөвлөх шаардлагагүй.
Wi-Fi өөрчлөлтийг даван туулж, DNS гацдаг туннель бол гурав дахь гэмтэл: sudo killall -HUP mDNSResponder шийдэгчийг тохиргоогоо дахин уншихад хүргэдэг. Үүнийг нэг удаа, гараар хэрэглэ.
Ажил өөрөө ажилладаг гэдгийг батла
Хяналтын замд итгэхийн өмнө kickstart -k-оор нэг ажиллагааг албадан хийлгээд, дараа нь ажлын бүртгэсэн гарах статусыг унш. Цэвэр гаралт скрипт ажиллаж байгааг батална; триггер ажиллаж байгааг батлахгүй. Дараа нь ажил ачаалагдсан байхад салгаж дахин холбогдоод, таны хүсээгүй ажиллагааг ажигла.
sudo launchctl kickstart -k system/net.example.tunnel-watch
sudo launchctl print system/net.example.tunnel-watch | grep -E 'last exit code|state ='
Оролдлого бүрийн өмнө болон дараа scutil --nc status-г шалга. Туннель унтарсан үед ажилласан скрипт холболтын замын талаар юу ч батлахгүй.
Задлах салбар нь холбох салбартай ижил хандлагыг хүртэх ёстой: замыг гараар устга, ажлыг ажиллуул, буцаж ирж байгааг батал. Зам нэмээд хэзээ ч устгадаггүй hook долоо хоногийн дараа буруу ажилладаг машиныг орхиж, хоёр үйл явдлыг юу ч холбохгүй. Хоёр зан үйл хоёулаа тогтвол sudo launchctl bootout system/net.example.tunnel-watch ажлыг цэвэрхэн тэтгэвэрт гаргана. Ачаалагдсан үлдээсэн хяналтын демон бол нэг удаагийн засвар сарын дараа тайлбаргүй зам болох зам юм.