ඔබ /etc/ppp/ip-up තුළ route විධානයක් තබා, කාර්යාල උමං සම්බන්ධතාවය නැවත සම්බන්ධ කරන නමුත් ගොනුව කිසිදා ක්‍රියාත්මක නොවේ. ස්ක්‍රිප්ටයේ කිසිදු වරදක් නැත: එම සම්බන්ධතාවය PPP හරහා කිසිසේත් යන්නේ නැත. ආවේණික Cisco IPSec සහ IKEv2 සේවාලාභීන් කිසිදා pppd ආරම්භ නොකරන බැවින් hook ඩිරෙක්ටරිය කිසිදා කියවන්නේ නැත, නමුත් PPTP සහ IPSec මත L2TP තවමත් එය හරහා යයි. ඔබට ඇත්තේ කුමන අවස්ථාවද තීරණය කර, පසුව PPP නොවන අවස්ථාව launchd අධීක්ෂණ කාර්යයකින් අවුලුවන්න.

කිසිදු hook එකක් සංස්කරණය කිරීමට පෙර අතුරුමුහුණත පරීක්ෂා කරන්න

විධාන දෙකක් තීරණය කරන්නේ කුමන ක්‍රියාවිධියට ක්‍රියා කළ හැකිද යන්නයි. වින්‍යාසගත සේවා ලැයිස්තුගත කර, පසුව උමං සක්‍රීයව ඇති විට පවතින අතුරුමුහුණත් ලැයිස්තුගත කරන්න. අතුරුමුහුණතේ නම සාක්ෂියයි; System Settings හි ලේබලය නොවේ.

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 ලබා දෙයි.

දෙවන ධාවනයක් කිසිවක් නොවෙනස් කරන ලෙස ස්ක්‍රිප්ටය ආරක්ෂා කරන්න

ස්ක්‍රිප්ටය පළමුව උමං තිබේද යන්න තීරණය කර, නොමැති විට නිහඬව පිටවේ. ඉන් පසු සියල්ල නැවත කළ හැකි විය යුතුය, මන්ද ට්‍රිගරය එක් සම්බන්ධතාවයකට වඩා බොහෝ විට ක්‍රියාත්මක වේ. ඊළඟ සම්බන්ධතාවයේදී වෙනස් වන දර්ශකයක් දෘඩ කේතනය නොකර, ධාවන කාලයේදී අතුරුමුහුණත විසඳන්න.

#!/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 සටහන්. හැඹිලිය හිස් කිරීම ජාල මාරුවකින් පසු සිරවූ සොයාබැලීමක් රෝග විනිශ්චය කරයි; එය සැලසුම් කළ යුතු දෙයක් නොවේ.

DNS නතර වන අතර Wi-Fi වෙනසක් මඟ හරින උමං තුන්වන දෝෂයයි: 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 කාර්යය පිරිසිදුව විශ්‍රාම යවයි. පූරණය කර ඉතිරි කළ අධීක්ෂණ ඩේමනය එක් වරක් කළ අලුත්වැඩියාවක් මාස ගණනකින් පැහැදිලි නොකළ මාර්ගයක් බවට පත්වන මාර්ගයයි.

අදාළ ලිපි