మీరు /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 నమోదులు. కాష్ను ఖాళీ చేయడం నెట్వర్క్ మార్పు తర్వాత చిక్కుకున్న శోధనను నిర్ధారిస్తుంది; అది షెడ్యూల్ చేయవలసిన విషయం కాదు.

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 పనిని శుభ్రంగా విరమింపజేస్తుంది. లోడ్ చేసి వదిలిన నిఘా డీమన్ ఒకసారి చేసిన మరమ్మతు నెలల తర్వాత వివరణ లేని మార్గం అయ్యే మార్గం.

సంబంధిత వ్యాసాలు