कोई भी जानता है कि सिस्को वीपीएन पर हर चीज के लिए वीपीएन रूटिंग को मजबूर करने के लिए राउटिंग टेबल (मैक पर) को कैसे हैक किया जाए? बहुत कुछ जो मैं करना चाहता हूं, वह केवल 10.121। * और 10.122 है। * वीपीएन पर पते और बाकी सब सीधे इंटरनेट पर।
कोई भी जानता है कि सिस्को वीपीएन पर हर चीज के लिए वीपीएन रूटिंग को मजबूर करने के लिए राउटिंग टेबल (मैक पर) को कैसे हैक किया जाए? बहुत कुछ जो मैं करना चाहता हूं, वह केवल 10.121। * और 10.122 है। * वीपीएन पर पते और बाकी सब सीधे इंटरनेट पर।
जवाबों:
निम्नलिखित मेरे लिए काम करता है। सिस्को वीपीएन से कनेक्ट करने के बाद इन्हें चलाएं। (मैं ओएस एक्स के अंतर्निहित सिस्को ग्राहक का उपयोग कर रहा हूं, सिस्को ब्रांडेड क्लाइंट का नहीं।)
sudo route -nv add -net 10 -interface utun0
sudo route change default 192.168.0.1
10
पहले कमांड को उस नेटवर्क से बदलें जो सुरंग के दूसरी तरफ है।
192.168.0.1
अपने स्थानीय नेटवर्क के प्रवेश द्वार से बदलें ।
मैंने इसे बाश स्क्रिप्ट में डाला, जैसे:
$ cat vpn.sh
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Run this as root"
exit 1
fi
route -nv add -net 10 -interface utun0
route change default 192.168.0.1
जब आप वीपीएन कनेक्ट करते हैं तो मुझे यह स्वचालित रूप से चलाने के बारे में स्पष्टीकरण मिला , लेकिन शुक्रवार को देर हो चुकी है और मुझे इसे आज़माने का मन नहीं है :)
मैंने तब से नौकरी छोड़ दी है जहां मैं सिस्को वीपीएन का उपयोग कर रहा था, इसलिए यह मेमोरी से है।
10
पहले आदेश में नेटवर्क है कि आप वीपीएन से अधिक मार्ग करना चाहते हैं। 10
के लिए छोटा हाथ है 10.0.0.0/8
। में Tuan Anh ट्रॅन के मामले, ऐसा लगता है कि नेटवर्क है 192.168.5.0/24
।
दूसरे कमांड में निर्दिष्ट करने के लिए किस गेटवे के लिए, यह आपका स्थानीय गेटवे होना चाहिए। जब आप एक वीपीएन में लॉग-इन करते हैं जो स्प्लिट-टनलिंग को रोकता है, तो यह आपकी रूटिंग टेबल को बदलकर उस पॉलिसी को लागू कर रहा है ताकि सभी पैकेट वर्चुअल इंटरफ़ेस पर रूट हो जाएं। इसलिए आप अपने डिफ़ॉल्ट मार्ग को वापस उसी जगह बदलना चाहते हैं जो वीपीएन पर मिलने से पहले था ।
गेटवे का पता लगाने का सबसे आसान तरीका netstat -rn
वीपीएन में प्रवेश करने से पहले चलना है , और आईपी पते को "डिफ़ॉल्ट" गंतव्य के दाईं ओर देखना है। उदाहरण के लिए, यहाँ अभी मेरे बॉक्स पर क्या दिखता है:
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 10.0.1.1 UGSc 29 0 en1
10.0.1/24 link#5 UCS 3 0 en1
10.0.1.1 0:1e:52:xx:xx:xx UHLWIi 55 520896 en1 481
10.0.1.51 7c:c5:37:xx:xx:xx UHLWIi 0 1083 en1 350
10.0.1.52 127.0.0.1 UHS 0 0 lo0
मेरा प्रवेश द्वार है 10.0.1.1
- यह "डिफ़ॉल्ट" गंतव्य के दाईं ओर है।
मेहासे की जानकारी का उपयोग करते हुए , मैंने एक पायथन स्क्रिप्ट लिखी जो वास्तव में मैक पर इस प्रक्रिया को सरल बनाती है। जब आप इसे चलाते हैं, तो स्क्रिप्ट आपकी फ़ायरवॉल जानकारी को सहेजेगी, AnyConnect क्लाइंट लॉन्च करेगी, लॉगिन की प्रतीक्षा करेगी, फिर मार्गों और फ़ायरवॉल को ठीक करें। बस 'टर्मिनल' से स्क्रिप्ट चलाएँ।
#!/usr/bin/python
# The Cisco AnyConnect VPN Client is often configured on the server to block
# all other Internet traffic. So you can be on the VPN <b>OR</b> you can have
# access to Google, etc.
#
# This script will fix that problem by repairing your routing table and
# firewall after you connect.
#
# The script does require admin (super user) access. If you are prompted for
# a password at the start of the script, just enter your normal Mac login
# password.
#
# The only thing you should need to configure is the vpn_ip_network.
# Mine is 10.x.x.x so I just specify '10' but you could be more specific
# and use something like '172.16'
vpn_ip_network = '10'
import sys
import subprocess
def output_of(cmd):
lines = subprocess.Popen(cmd if isinstance(cmd, list) else cmd.split(' '), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]
try:
lines = lines.decode('utf-8')
except Exception:
pass
return [line.strip() for line in lines.strip().split('\n')]
sys.stdout.write("Mac Account Login ")
good_firewall_ids = set([line.partition(' ')[0] for line in output_of('sudo ipfw -a list')])
sys.stdout.write('Firewall Saved.\n')
gateway = None
for line in output_of('route get default'):
name, delim, value = line.partition(':')
if name == 'gateway':
gateway = value.strip()
p = subprocess.Popen(['/Applications/Cisco/Cisco AnyConnect VPN Client.app/Contents/MacOS/Cisco AnyConnect VPN Client'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
was_disconnected = False
while True:
line = p.stdout.readline()
if line == '' or p.poll():
sys.stdout.write("Never connected!\n")
break
try:
line = line.decode('utf-8')
except Exception:
pass
if 'Disconnected' in line:
sys.stdout.write('Waiting for you to enter your VPN password in the VPN client...\n')
was_disconnected = True
if 'Connected' in line:
if was_disconnected:
subprocess.Popen(['sudo','route','-nv','add','-net',vpn_ip_network,'-interface','utun0'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).wait()
subprocess.Popen(['sudo','route','change','default',gateway], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).wait()
unfriendly_firewall_ids = list(set([line.partition(' ')[0] for line in output_of('sudo ipfw -a list')])-good_firewall_ids)
extra = ''
if unfriendly_firewall_ids:
subprocess.Popen('sudo ipfw delete'.split(' ') + unfriendly_firewall_ids, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).wait()
sys.stdout.write("VPN connection established, routing table repaired and %d unfriendly firewall rules removed!\n" % len(unfriendly_firewall_ids))
else:
sys.stdout.write("VPN connection established and routing table repaired!\n")
else:
try:
subprocess.Popen.kill(p)
sys.stdout.write('VPN was already connected. Extra VPN client closed automatically.\n')
except Exception:
sys.stdout.write('VPN was already connected. Please close the extra VPN client.\n')
break
break
else:
sys.stdout.write("Couldn't get gateway. :-(\n")
इस पिछले उत्तर में पायथन लिपि मददगार थी, हालाँकि, यह उन मार्गों का ध्यान नहीं रखती थी, जो AnyConnect डिवाइस पर अन्य इंटरफेस (जैसे VMware इंटरफेस) को लेने के लिए उपयोग करते थे। यह भी कई वीपीएन नेटवर्क को संभालने में सक्षम नहीं था।
यहां वह स्क्रिप्ट है जिसका मैं उपयोग करता हूं:
#!/bin/bash
HOME_NETWORK=192.168
HOME_GATEWAY=192.168.210.1
WORK_NETWORKS="X.X.X.X/12 10.0.0.0/8 X.X.X.X/16"
# What should the DNS servers be set to?
DNS_SERVERS="10.192.2.45 10.216.2.51 8.8.8.8"
##
## Do not edit below this line if you do not know what you are doing.
##
function valid_ip()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
# Nuke any DENY firewall rules
for RULE in `sudo ipfw list | grep deny | awk '{print $1}' | xargs`; do sudo ipfw delete $RULE; done
# Delete any routes for the home network that Anyconnect might have made
sudo route delete -net ${HOME_NETWORK}
sudo route add -net ${HOME_NETWORK} ${HOME_GATEWAY}
# Get the AnyConnect interface
ANYCONNECT_INTERFACE=`route get 0.0.0.0 | grep interface | awk '{print $2}'`
# Add the work routes
for NETWORK in ${WORK_NETWORKS}; do
sudo route -nv add -net ${NETWORK} -interface ${ANYCONNECT_INTERFACE}
done
# Set the default gateway
sudo route change default ${HOME_GATEWAY}
# Mass route changes
for NET in `netstat -nr | grep -e ^${HOME_NETWORK} | grep utun1 | awk '{print $1}' | xargs`; do
if valid_ip ${NET}; then
echo "Changing route for network"
sudo route change ${NET} ${HOME_GATEWAY}
else
echo "Changing route for host"
sudo route change -net ${NET} ${HOME_GATEWAY}
fi
done
# Set the nameservers
sudo scutil << EOF
open
d.init
d.add ServerAddresses * ${DNS_SERVERS}
set State:/Network/Service/com.cisco.anyconnect/DNS
quit
EOF
संभावना से अधिक आपके व्यवस्थापक को 10.121। * और 10.122 के लिए स्थानीय रूटिंग का उपयोग करने के लिए वीपीएन कनेक्शन स्थापित करना चाहिए। सबनेट और रिमोट (आपके घर की मशीन) को बाकी सभी अनुरोधों को रूट करने दें। (यह उन्हें बैंडविड्थ और दायित्व बचाता है)
क्या आप सिस्को के "वीपीएन क्लाइंट" का उपयोग कर रहे हैं? ओएस ओएस एक्स?
यदि आप OS X के वीपीएन का उपयोग करते हैं (नेटवर्किंग प्राथमिकता फलक के माध्यम से सेट करें) तो आपको "उन्नत" पर क्लिक करने और "वीपीएन ऑन डिमांड" टैब का चयन करने में सक्षम होना चाहिए। फिर वीपीएन का उपयोग करने के लिए आवश्यक सबनेट की आपूर्ति करें।
मुझे एक देशी 'ऐप' चाहिए था, जिसे मैं लोकमेटिक के फंक्शन के समान स्प्लिट टनल राउटिंग को सक्षम करने के लिए लॉगऑन (और रनिंग / हिडन) रख सकता हूं । शायद मैंने किसी समय लोकोमैटिक को कांटा और उसके साथ खेलूँ। मैं इस AppleScript को Github पर भी अपलोड कर सकता हूं। मैं एक डेमॉन के साथ गड़बड़ नहीं करना चाहता था क्योंकि यह उत्तर बताता है।
यह स्क्रिप्ट मानता है कि वीपीएन का डिफ़ॉल्ट VPN (Cisco IPSec)
नाम है और वीपीएन मार्ग 10.10.10.1/22
> है 10.10.20.10
। इन्हें बदलने / अतिरिक्त मार्गों को जोड़ने की आवश्यकता होगी। netstat -rn
वीपीएन से जुड़े मार्गों को देखने के लिए टर्मिनल> जब वीपीएन जुड़ा हो (इस स्क्रिप्ट को सक्षम करने से पहले)।
यह स्क्रिप्ट नोटिफिकेशन सेंटर में ग्रो-स्टाइल नोटिफिकेशन भी बनाती है :)
मैं मार्क ई। हासे के उत्तर के साथ कुछ मुद्दों में भाग गया क्योंकि मेरा सिस्को वीपीएन UCSc
एक UGScI
(en0 इंटरफ़ेस विशिष्ट) मार्ग से मौजूदा गेटवे को संशोधित करता है और वीपीएन गेटवे को एक UCS
मार्ग के रूप में जोड़ता है , दो डिफ़ॉल्ट गेटवे को हटाने और वापस जोड़ने की आवश्यकता है। मूल UGSc
डिफ़ॉल्ट गेटवे
StackExchange / google के लिए धन्यवाद, यह मेरा पहला AppleScript है और मैं इसे कुछ घंटों के लिए बिना गॉगलिंग के साथ नहीं रख पाऊंगा।
सुझाव / सुधार / अनुकूलन का स्वागत करते हैं!
AppleScript ( GitHubGist ):
global done
set done to 0
on idle
set status to do shell script "scutil --nc status "VPN (Cisco IPSec)" | sed -n 1p"
# do shell script "scutil --nc start "VPN (Cisco IPSec)"
if status is "Connected" then
if done is not 1 then
display notification "VPN Connected, splitting tunnel"
set gateway to do shell script "( netstat -rn | awk '/default/ {if ( index($6, \"en\") > 0 ){print $2} }' ) # gets non-VPN default gateway"
do shell script "sudo route delete default" # deletes VPN-assigned global (UCS) default gateway
do shell script "sudo route delete default -ifscope en0" # deletes en0 interface-specific (UGScI) LOCAL non-vpn gateway that prevents it being re-added as global default gateway
do shell script "sudo route add default " & gateway # re-adds LOCAL non-vpn gateway (from get command above) as global default gateway
do shell script "sudo route add 10.10.10.1/22 10.10.20.10" # adds VPN route
display notification "VPN tunnel has been split"
set done to 1
end if
else
if done is not 2 then
display notification "VPN Disconnected"
set done to 2
end if
end if
return 5
end idle
ऐप के रूप में सहेजें:
राइट क्लिक> पैकेज सामग्री दिखाएं, निम्न को info.plist में जोड़ें (यह ऐप आइकन को डॉक से छुपाता है, ऐप pkill -f 'Split Tunnel'
को छोड़ने के लिए एक्टिविटी मॉनिटर या टर्मिनल का उपयोग आवश्यक है , यदि आप डॉक आइकन चाहते हैं, तो छोड़ दें:
<key>LSBackgroundOnly</key>
<string>1</string>
routeNOPASSWD
निम्नलिखित कोड का उपयोग करके एक नई एक-लाइन फ़ाइल (कोई एक्सटेंशन) नहीं बनाएं (यह गलत तरीके से किए जाने पर sudo एक्सेस को रोक सकता है, visudo
अधिक जानकारी के लिए Google - यह ऐप्पलस्क्रिप्ट में sudo कमांड को पासवर्ड प्रॉम्प्ट के बिना चलाने की अनुमति देता है, छोड़ देना चाहिए अगर WANT पासवर्ड प्रॉम्प्ट जब रूटिंग टेबल को बदलना होगा):
%admin ALL = (ALL) NOPASSWD: /sbin/route
इस फ़ाइल को कॉपी करें /etc/sudoers.d
टर्मिनल में निम्नलिखित कमांड चलाएं (पासवर्ड के लिए दूसरी कमांड प्रॉम्प्ट करेगी - यह sudo route
AppleScript में कमांड्स को पासवर्ड के लिए प्रॉम्प्ट किए बिना चलाने की अनुमति देता है , अगर स्क्रिप्ट राउटिंग टेबल बदलने पर पासवर्ड प्रॉम्प्ट वांछित है, तो छोड़ दें)
chmod 440 /private/etc/sudoers.d/routeNOPASSWD
sudo chown root /private/etc/sudoers.d/routeNOPASSWD
आखिर में ऐप को सिस्टम प्रीफ़्स> यूज़र्स और ग्रुप्स> लॉगिन आइटम में जोड़ें
आपको उस राउटर के व्यवस्थापक से पूछने में सक्षम होना चाहिए जिसे आप एक अलग "समूह" सेट करने के लिए कनेक्ट कर रहे हैं जो कि विभाजित टनलिंग करता है और आपको एक पीसीएफ फ़ाइल देता है जिसमें उस समूह के लिए समूह का नाम और समूह पासवर्ड होता है।
मेरे पास एक ही मुद्दा था और यह @mehaase के लिए धन्यवाद काम कर रहा है
~/vpn.sh
@Mehaase द्वारा उत्तर के रूप में बनाने के बाद आप इन चरणों का उपयोग करके इसे एक रनवेबल एप्लिकेशन ऑटोमेटर स्क्रिप्ट में डाल सकते हैं:
do shell script "sudo ~/vpn.sh" with administrator privileges
chmod 700 ~/vpn.sh
स्क्रिप्ट निष्पादित विशेषाधिकारों को देने के लिए आपको टर्मिनल से चलाने की आवश्यकता हो सकती है ।
वीपीएन से कनेक्ट करने के बाद आप बस इस एप्लिकेशन स्क्रिप्ट को चला सकते हैं। अपना व्यवस्थापक पासवर्ड दर्ज करें और ठीक क्लिक करें - पूर्ण हुआ। :)