تاسو په /etc/ppp/ip-up کې د route حکم اېږدئ، د دفتر تونل بیا وصلوئ، او فایل هیڅکله نه چلېږي۔ په سکریپټ کې هیڅ ستونزه نشته: هغه اړیکه په PPP کې نه تېریږي۔ دننه شوي Cisco IPSec او IKEv2 کلاینټونه هیڅکله pppd نه پیلوي، نو د هک فولډر هیڅکله نه لوستل کیږي، په داسې حال کې چې PPTP او له IPSec پورته L2TP لا هم ترې تېریږي۔ وټاکئ چې کوم حالت لرئ، بیا غیر-PPP حالت د launchd څارنې کار څخه پیل کړئ۔

د هر هک له سمولو مخکې انټرفیس وګورئ

دوه حکمونه فیصله کوي چې کوم میکانېزم کار کولی شي۔ ترتیبات شوي خدمتونه ولیکئ، بیا هغه انټرفیسونه ولیکئ چې د تونل د پورته‌یدو پر مهال شته۔ د انټرفیس نوم ثبوت دی؛ په System Settings کې لیبل نه دی۔

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

هغه خدمت چې ppp0 تولیدوي د PPP هکونه چلوي او ستاسو فایل به چلوي۔ د Cisco IPSec یا IKEv2 خدمت پرځای utun وسیله تولیدوي، یو تونل انټرفیس چې PPP پوړ نلري، نو په /etc/ppp کې هیڅ شی نشي ورته رسیدلی۔ کله چې دواړه ډوله ښکاره شي، وګورئ چې کوم خدمت سره وصل شوي یاست۔ خلک د کلاینټ نوم لوستلو سره یوه ماسپښین په غلط هک کې ضایع کوي۔

په 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 یا ګرافیکي ایډیټر له لارې جوړیږي ډیری وخت د ستاسو حساب ملکیت وي، یا د چلیدو بټ نلري، او بیا د ورک هک په څیر غلی ناکامه کیږي۔ اوس 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 نوي کول، کیبل نښلول۔ لاندې ساتونکی شوریدونکی محرک په ګټور هک بدلوي، او د لاګ یوه کرښه په عجیبه ساعت کې لاره تشریح کوي۔

ملکیت سکریپټ ته سربېره plist هم رانغاړي۔ هغه ډیمون چې په داسې فولډر کې فایل چلوي چې ستاسو خپل حساب پکې لیکلی شي، هغه حساب ته root ورکوي۔

سکریپټ وساتئ ترڅو دوهم چلونکی هیڅ شی ونه بدلوي

سکریپټ لومړی فیصله کوي چې تونل شته که نه، او که نه وي غلی وتلی۔ له هغې وروسته هر څه باید د تکرار لپاره خوندي وي، ځکه محرک له یوې اړیکې ډېر ځله چلېږي۔ انټرفیس په چلیدو وخت کې حل کړئ، نه دا چې هغه انډیکس کلک کوډ کړئ چې په راتلونکې اړیکه کې بدلیږي۔

#!/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 کله چې لاره لا شته په غیر صفر حالت وتلی، نو هغه سکریپټ چې هر غیر صفر حالت ناکامي ګڼي، هرکله چې سم کار کوي د مات هک راپور ورکوي۔ پورتنۍ 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 وګورئ۔ هغه سکریپټ چې د تونل د ښکته‌یدو پر مهال چل شوی د اړیکې لارې په اړه هیڅ نه ثابتوي۔

د ویجاړولو څانګه د نښلولو څانګې په څیر پاملرنې وړ ده: لاره په لاس لرې کړئ، کار ته اجازه ورکړئ چې وګرځي، او تایید کړئ چې بېرته راځي۔ هغه هک چې لاره اضافه کوي او هیڅکله یې نه لرې کوي یوه ماشین پریږدي چې یوه اونۍ وروسته بد چلند کوي، پرته له دې چې څه دوه پېښې سره ونښلوي۔ کله چې دواړه چلندونه پاتې شي، sudo launchctl bootout system/net.example.tunnel-watch کار په پاکه توګه تقاعد کوي۔ بار شوی پریښودل شوی څارنه ډیمون هغه لار ده چې یو ځلي ترمیم میاشتې وروسته ناڅرګنده لاره کیږي۔

اړوندې مقالې