কীভাবে ম্যাকের উপরে সিসকো ভিপিএন-তে স্প্লিট টানেল রাউটিংকে বাধ্য করা যায়


40

সিসকো ভিপিএন-এর উপর দিয়ে প্রতিটি কিছুর জন্য ভিপিএন রাউটিং জোর করে পরাস্ত করতে রাউটিং টেবিলটি (ম্যাকের উপর) হ্যাক করতে হয় তা যে কেউ জানেন? আমি যা করতে চাই তা হ'ল কেবল 10.121 * * এবং 10.122 * * ভিপিএন এর উপর ঠিকানা এবং সরাসরি সমস্ত কিছু ইন্টারনেটে।

উত্তর:


27

নিম্নলিখিত আমার জন্য কাজ করে। সিসকো ভিপিএন-এ সংযুক্ত হওয়ার পরে এগুলি চালান। (আমি ওএস এক্স-এর বিল্ট-ইন সিসকো ক্লায়েন্ট ব্যবহার করছি, সিসকো ব্র্যান্ডেড ক্লায়েন্ট নয়))

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প্রথম কমান্ড নেটওয়ার্ক যে আপনি যে VPN উপর রুট করতে চান। 10জন্য সংক্ষিপ্ত হাত 10.0.0.0/8। ইন Tuan Anh থেকে Tran এর মামলা, এটা দেখে মনে হচ্ছে নেটওয়ার্ক 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- এটি "ডিফল্ট" গন্তব্যের ডানদিকে।


1
আপনি আমার জন্য আরও কিছু ব্যাখ্যা করতে পারেন? আমার ifconfig utun0 আয়: পতাকা = 8051 <ইউপি, POINTOPOINT দৌড়ানো, মাল্টিকাস্ট> MTU 1280 Inet 192.168.5.102 -> 192.168.5.102 নেটমাস্ক 0xffffffff। উপরের 10 নম্বর দিয়ে আমার কী প্রতিস্থাপন করা উচিত তাও আমি বুঝতে পারি না। ধন্যবাদ.
তুয়ান আন ট্রান

@ টুয়ান অ্যান্টট্রান: আমি আমার উত্তর আপডেট করেছি। যদি এটি সাহায্য করে তবে আমাকে জানান।
মার্ক ই। হাজেস

সর্বশেষতম সংস্করণের জন্য, আমি / অ্যাপ্লিকেশনস / ভিপিএনক্লিয়েন্ট.এপ ইনস্টল করেছি এবং আমি ইউফোনফিগ দ্বারা তালিকাভুক্ত ইউটিউন0 দেখতে পাচ্ছি না। আমি gif0, stf0 এবং fw0 অ্যাডাপ্টার দেখতে পাচ্ছি। সঠিক অ্যাডাপ্টার কোনটি নির্ধারণ করব? আমি ভিপিএন সংযুক্ত (এনএনএর এমটিইউ মান ব্যতীত) ছাড়া এবং ছাড়া আইকনফিগ আউটপুটে কোনও পার্থক্য দেখতে পাচ্ছি না।
হরিদসভ

1
লঞ্চডেমনগুলির সাথে পরিচিত নয় তাদের জন্য, আমি এখানে আমার উত্তরে একটি গাইড লিখেছিলাম যাতে আপনি যখন ভিপিএন-তে সংযুক্ত হন প্রত্যেকবার স্ক্রিপ্টটি চালানোর জন্য কীভাবে কল করতে পারেন । (যাইহোক, +1 চমত্কার উত্তর, তবে আমার কাজটি চালানোর জন্য আমার আরও কিছুটা প্রয়োজন ছিল)।
ডাঃ জিম্বোব

1
দুঃখের বিষয় এটি আমার সিসকো যেকোন সংযোগ ক্লায়েন্টে কাজ করে না।
jeremyjjbrown

5

মেহেস থেকে তথ্য ব্যবহার করে , আমি একটি পাইথন স্ক্রিপ্ট লিখেছিলাম যা ম্যাকের উপর এই প্রক্রিয়াটিকে সত্যিই সহজ করে তুলেছে । আপনি যখন এটি চালান, স্ক্রিপ্টটি আপনার ফায়ারওয়াল তথ্য সংরক্ষণ করবে, যেকোন সংযোগ ক্লায়েন্ট চালু করবে, লগইনের জন্য অপেক্ষা করবে, তারপরে রুটগুলি এবং ফায়ারওয়ালটি ঠিক করবে। 'টার্মিনাল' থেকে স্ক্রিপ্টটি চালান।

#!/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")

4

পূর্ববর্তী উত্তরের পাইথন স্ক্রিপ্টটি সহায়ক ছিল, তবে, যে কোনও সংযোগটি ডিভাইসে অন্য ইন্টারফেসগুলি (যেমন ভিএমওয়্যার ইন্টারফেস) দখল করার জন্য ব্যবহৃত রুটগুলির যত্ন নেয়নি। এটি একাধিক ভিপিএন নেটওয়ার্ক পরিচালনা করতে সক্ষম হয় নি।

আমি যে স্ক্রিপ্টটি ব্যবহার করি তা এখানে:

#!/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

এটি কি সিসকো সাথে কোনও সংযোগ স্থাপন করে 3.1.0? আমি মনে করি না এটি হয় ... আপনার কাছে 3.1.0 এর জন্য কোনও আপডেট স্ক্রিপ্ট আছে? ধন্যবাদ!
কস্টা 0

2

সম্ভবত আপনার প্রশাসক 10.121। * এবং 10.122 এর জন্য স্থানীয় রাউটিং ব্যবহার করতে ভিপিএন সংযোগ স্থাপন করতে চান * * সাবনেট করে এবং সমস্ত অনুরোধের দূরবর্তী (আপনার হোম মেশিন) রুট করতে দিন। (এটি তাদের ব্যান্ডউইথ এবং দায় সংরক্ষণ করে)

আপনি কি সিস্কোর "ভিপিএন ক্লায়েন্ট" ব্যবহার করছেন? ওএস ওএস এক্স?

যদি আপনি ওএস এক্স এর ভিপিএন (নেটওয়ার্কিং অগ্রাধিকার ফলকের মাধ্যমে সেট আপ) ব্যবহার করেন তবে আপনি "অ্যাডভান্সড" এ ক্লিক করতে এবং "ভিপিএন অন ডিমান্ড" ট্যাবটি নির্বাচন করতে সক্ষম হবেন। তারপরে ভিপিএন ব্যবহারের জন্য প্রয়োজনীয় সাবনেট সরবরাহ করুন।


4
ওএস এক্স ভিপিএন ক্লায়েন্টের একটি পৃথক "সিসকো" বিকল্প রয়েছে (পিপিটিপি এবং এল 2 টি পি থেকে পৃথক) যার "ডিমান্ডে ভিপিএন নেই"।
মার্ক ই। হাজেস

2

আমি একটি নেটিভ 'অ্যাপ্লিকেশন' চেয়েছিলাম যা আমি লোকাম্যাটিকের মতোই স্প্লিট টানেলের রাউটিং সক্ষম করতে লগনে চালাতে পারি (এবং চালিয়ে / লুকিয়ে রাখতে পারি) । সম্ভবত আমি কোনও সময়ে লোকাম্যাটিককে কাঁটাচামচ করব এবং এটির সাথে খেলব। আমি এই অ্যাপলস্ক্রিপ্টটি গিথুব এও আপলোড করতে পারি। এই উত্তরটি যেমন বলে দেয় তেমন কোনও ডেমনের সাথে আমি গণ্ডগোল করতে চাইনি ।

এই স্ক্রিপ্টটি ধরে নিয়েছে ভিপিএনের ডিফল্ট VPN (Cisco IPSec)নাম এবং ভিপিএন রুটটি 10.10.10.1/22> 10.10.20.10। এগুলি পরিবর্তন করতে হবে / অতিরিক্ত রুট যুক্ত করা দরকার। টার্মিনাল চালান> netstat -rnযখন ভিপিএন সংযুক্ত থাকে (ভিপিএন যুক্ত হওয়া রুটগুলি দেখতে এই স্ক্রিপ্টটি সক্ষম করার আগে)।

এই স্ক্রিপ্টটি নোটিফিকেশন সেন্টারে গ্রল-স্টাইল বিজ্ঞপ্তিও উত্পন্ন করে :)

এখানে চিত্র বর্ণনা লিখুন

আমি কিছু বিষয় গাড়ীতে আঘাত মার্ক ই Haase এর উত্তর একটি থেকে আমার সিসকো VPN এর মডিফাই বিদ্যমান প্রবেশদ্বার হিসেবে UCScএকটি থেকে UGScI(en0 ইন্টারফেস নির্দিষ্ট) রুট এবং যেমন VPN এর গেটওয়ে যোগ UCS, রুট দুই ডিফল্ট গেটওয়ে মুছে ফেলার গুরুত্বসহ এখন এবং ফিরে যোগ মূল UGScডিফল্ট গেটওয়ে

স্ট্যাকএক্সচেঞ্জ / গুগলের জন্য শুকরিয়া ধন্যবাদ, এটি আমার প্রথম অ্যাপলস্ক্রিপ্ট এবং কয়েক ঘন্টা গুগলিং না করে আমি এটি একসাথে রাখতে সক্ষম হত না।

পরামর্শ / সংশোধন / অপ্টিমাইজেশান স্বাগত!

অ্যাপলস্ক্রিপ্ট ( গিটহাবজিস্ট ):

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

অ্যাপ হিসাবে সংরক্ষণ করুন:

বিভক্ত টানেল অ্যাপ্লিকেশন সেভ সেটিংস

ডান ক্লিক করুন> প্যাকেজ বিষয়বস্তুগুলি দেখান, নিম্নলিখিত তথ্যগুলি.প্লেস্টে যুক্ত করুন (এটি অ্যাপ আইকনটি ডক থেকে আড়াল করে, ক্রিয়াকলাপ মনিটর বা টার্মিনাল> pkill -f 'Split Tunnel'অ্যাপ্লিকেশনটি বন্ধ করতে প্রয়োজন, যদি আপনি কোনও ডক আইকন চান না তবে বাদ দিন:

<key>LSBackgroundOnly</key>
<string>1</string>

সঠিকভাবে routeNOPASSWDনিম্নলিখিত কোডটি ব্যবহার করে একটি নতুন এক-লাইন ফাইল তৈরি করুন (কোনও এক্সটেনশন নেই) (এটি ভুলভাবে করা গেলে সুডো অ্যাক্সেসকে আটকাতে পারে, visudoআরও তথ্যের জন্য গুগল - এটি অ্যাপলস্ক্রিপ্টে sudo কমান্ডগুলিকে পাসওয়ার্ড প্রম্পট ছাড়া চালানোর অনুমতি দেয়, আপনি চাইলে বাদ দিতে পারেন) যখন রাউটিং টেবিলটি পরিবর্তন করা দরকার তখন একটি পাসওয়ার্ড প্রম্পট:

%admin ALL = (ALL) NOPASSWD: /sbin/route

এই ফাইলটি অনুলিপি করুন /etc/sudoers.d

টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালান (দ্বিতীয় কমান্ডটি পাসওয়ার্ডের জন্য অনুরোধ জানাবে - sudo routeএটি অ্যাপলস্ক্রিপ্টের কমান্ডগুলিকে পাসওয়ার্ডের অনুরোধ ছাড়াই চলতে অনুমতি দেয় , স্ক্রিপ্ট রাউটিং টেবিল পরিবর্তন করার সময় কোনও পাসওয়ার্ড প্রম্পট চাইলে তা বাদ দিন)

chmod 440 /private/etc/sudoers.d/routeNOPASSWD
sudo chown root /private/etc/sudoers.d/routeNOPASSWD

সিস্টেম প্রিফেস> ব্যবহারকারী এবং গোষ্ঠী> লগইন আইটেমগুলিতে শেষ পর্যন্ত অ্যাপটি যুক্ত করুন

বিভক্ত টানেলের লগইন আইটেম


1

আপনি যে রাউটারের সাথে সংযোগ করছেন তার প্রশাসককে একটি পৃথক "গোষ্ঠী" সেটআপ করতে সক্ষম হতে হবে যা বিভক্ত টানেলিং করে এবং আপনাকে একটি গ্রুপের নাম এবং গোষ্ঠী পাসওয়ার্ড সমেত একটি পিসিএফ ফাইল দেয়।


2
এটি ঘটতে যাচ্ছে না :) এগুলি

1

আমার একই সমস্যা ছিল এবং @ মেহাজে এই কাজের ধন্যবাদ পেয়েছি

~/vpn.sh@ মেহাজের জবাব হিসাবে তৈরি করার পরে আপনি এই পদক্ষেপগুলি ব্যবহার করে এটি চালানোর যোগ্য অ্যাপ্লিকেশন স্বয়ংক্রিয় স্ক্রিপ্টে রাখতে পারেন:

  1. অটোমেটার ব্যবহার করে একটি নতুন অ্যাপ্লিকেশন তৈরি করুন
  2. লাইব্রেরী> ইউটিলিটিসের অধীনে "একটি অ্যাপলস্ক্রিপ্ট রান করুন" যুক্ত করুন
  3. প্রবেশ করান: do shell script "sudo ~/vpn.sh" with administrator privileges
  4. সংরক্ষণ

chmod 700 ~/vpn.shস্ক্রিপ্টটি কার্যকর করার সুবিধার্থে আপনাকে টার্মিনাল থেকে চালানোর প্রয়োজনও হতে পারে ।

ভিপিএন এর সাথে সংযুক্ত হওয়ার পরে আপনি সহজেই এই অ্যাপ্লিকেশন স্ক্রিপ্টটি চালাতে পারেন। আপনার প্রশাসকের পাসওয়ার্ড লিখুন এবং ঠিক আছে - ক্লিক করুন। :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.