Cara memaksa perutean terowongan terpisah pada Mac ke Cisco VPN

40

Adakah yang tahu cara meretas tabel perutean (pada mac) untuk mengalahkan pemaksaan perutean VPN untuk semua hal melalui cisco VPN? cukup banyak yang ingin saya lakukan adalah hanya memiliki 10.121. * dan 10.122. * alamat melalui VPN dan yang lainnya langsung ke internet.

Sathyajith Bhat
sumber

Jawaban:

27

Berikut ini berfungsi untuk saya. Jalankan ini setelah terhubung ke Cisco VPN. (Saya menggunakan klien Cisco bawaan OS X, bukan klien bermerek Cisco.)

sudo route -nv add -net 10 -interface utun0
sudo route change default 192.168.0.1

Ganti 10perintah pertama dengan jaringan yang ada di sisi lain terowongan.

Ganti 192.168.0.1dengan gateway jaringan lokal Anda.

Saya memasukkannya ke skrip bash, seperti ini:

$ 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

Saya juga menemukan penjelasan tentang cara menjalankan ini secara otomatis ketika Anda menghubungkan VPN, tetapi ini terlambat pada hari Jumat dan saya merasa tidak ingin mencobanya :)

Edit:

Sejak itu saya meninggalkan pekerjaan di mana saya menggunakan Cisco VPN, jadi ini dari memori.

The 10dalam perintah pertama adalah jaringan yang Anda inginkan untuk rute di atas VPN. 10adalah tangan pendek untuk 10.0.0.0/8. Dalam kasus Tuan Anh Tran, sepertinya jaringannya 192.168.5.0/24.

Adapun gateway mana yang harus ditentukan dalam perintah kedua, itu harus gateway lokal Anda. Ketika Anda masuk ke VPN yang mencegah split-tunneling, itu memberlakukan kebijakan itu dengan mengubah tabel perutean Anda sehingga semua paket dialihkan pada antarmuka virtual. Jadi, Anda ingin mengubah rute default Anda kembali ke apa itu sebelum mendapatkan VPN .

Cara termudah untuk mengetahui gateway adalah dengan menjalankan netstat -rnsebelum masuk ke VPN, dan lihat alamat IP di sebelah kanan tujuan "default". Misalnya, inilah tampilannya di kotak saya sekarang:

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

Gerbang saya adalah 10.0.1.1- di sebelah kanan tujuan "default".

Mark E. Haase
sumber
1
Bisakah Anda jelaskan sedikit lebih banyak untuk saya? ifconfig saya mengembalikan utun0: flags = 8051 <UP, POINTOPOINT, RUNNING, MULTICAST> mtu 1280 inet 192.168.5.102 -> 192.168.5.102 netmask 0xffffffff. Saya juga tidak mengerti apa yang harus saya ganti dengan angka 10 di atas. Terima kasih.
Tuan Anh Tran
@TuanAnhTran: Saya memperbarui jawaban saya. Tolong beri tahu saya jika itu membantu.
Mark E. Haase
Untuk versi terbaru, saya telah menginstal /Applications/VPNClient.app dan saya tidak melihat utun0 terdaftar oleh ifconfig. Saya melihat adaptor gif0, stf0 dan fw0. Bagaimana cara menentukan adaptor yang tepat? Saya tidak melihat perbedaan dalam keluaran ifconfig dengan dan tanpa vpn terhubung (kecuali untuk nilai MTU en1).
haridsv
1
Bagi mereka yang tidak terbiasa dengan LaunchDaemons, saya menulis panduan dalam jawaban saya di sini yang menjelaskan cara memanggil skrip untuk dijalankan setiap kali Anda terhubung ke VPN . (Ngomong-ngomong, +1 menjawab dengan sangat baik, tetapi saya perlu sedikit lebih banyak untuk mendapatkan intinya bekerja).
dr jimbob
1
Sayangnya ini tidak berfungsi pada klien Cisco AnyConnect saya.
jeremyjjbrown
5

Menggunakan informasi dari mehaase, saya menulis skrip Python yang benar-benar menyederhanakan proses ini di Mac. Ketika Anda menjalankannya, skrip akan menyimpan info firewall Anda, meluncurkan klien AnyConnect, tunggu login, lalu perbaiki rute dan firewall. Jalankan script dari 'terminal'.

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

Skrip Python dalam jawaban sebelumnya ini sangat membantu, namun, itu tidak menangani rute yang digunakan AnyConnect untuk mengambil alih antarmuka lain pada perangkat (seperti antarmuka VMware). Itu juga tidak dapat menangani beberapa jaringan VPN.

Berikut ini skrip yang saya gunakan:

#!/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
Kate Gray
sumber
Apakah ini berfungsi dengan cisco anyconnect 3.1.0? Saya rasa tidak ... Apakah Anda memiliki skrip yang diperbarui untuk 3.1.0? Terima kasih!
costa
2

Kemungkinan besar admin Anda ingin mengatur koneksi VPN untuk menggunakan perutean lokal untuk subnet 10.121. * Dan 10.122. * Dan membiarkan remote (mesin rumah Anda) merutekan semua permintaan lainnya. (Ini menghemat bandwidth dan liabilitas mereka)

Apakah Anda menggunakan "VPN Client" Cisco? os OS X?

jika Anda menggunakan VPN OS X (disiapkan melalui panel Preferensi jaringan) Anda harus dapat mengklik "lanjutan" dan memilih tab "VPN sesuai Permintaan". kemudian berikan subnet yang diperlukan agar VPN dapat digunakan.

Toymakerii
sumber
4
Klien OS X vpn memiliki opsi "Cisco" yang terpisah (terpisah dari PPTP dan L2TP) yang tidak memiliki opsi "VPN on Demand".
Mark E. Haase
2

Saya menginginkan 'aplikasi' asli yang dapat saya jalankan saat masuk (dan terus berjalan / tersembunyi) untuk mengaktifkan perutean Split Tunnel, mirip dengan fungsi Locamatic . Mungkin saya akan bercabang Locamatic di beberapa titik dan bermain dengannya. Saya juga dapat mengunggah AppleScript ini ke Github. Saya tidak ingin dipusingkan dengan dasmon seperti yang disarankan oleh jawaban ini .

Skrip ini menganggap VPN memiliki VPN (Cisco IPSec)nama default dan rute VPN adalah 10.10.10.1/22> 10.10.20.10. Ini perlu diubah / rute tambahan ditambahkan. Jalankan terminal> netstat -rnketika VPN terhubung (sebelum mengaktifkan skrip ini) untuk melihat rute yang ditambahkan VPN.

Script ini juga menghasilkan notifikasi gaya growl di Notification Center :)

masukkan deskripsi gambar di sini

Aku berlari ke dalam beberapa masalah dengan Mark E. Haase 's jawaban sebagai saya memodifikasi Cisco VPN gateway yang ada dari UCScke UGScI(en0 interface tertentu) rute dan menambahkan gateway VPN sebagai UCSrute, mengharuskan penghapusan dua gateway default dan menambahkan kembali UGScgateway default asli

Syukurlah untuk StackExchange / google, ini adalah AppleScript pertama saya dan saya tidak akan bisa menyatukannya tanpa googling beberapa jam.

Saran / koreksi / optimasi diterima!

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

simpan sebagai aplikasi:

Pengaturan penyimpanan aplikasi Split Tunnel

klik kanan> tampilkan isi paket, tambahkan yang berikut ke info.plist (ini menyembunyikan ikon aplikasi dari dock, mengharuskan penggunaan Activity Monitor atau terminal> pkill -f 'Split Tunnel'untuk keluar dari aplikasi, hilangkan jika Anda INGIN ikon dock:

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

buat file satu-baris baru routeNOPASSWD(tanpa ekstensi) menggunakan kode berikut PERSIS (ini dapat mencegah akses sudo jika dilakukan secara tidak benar, google visudountuk info lebih lanjut - ini memungkinkan perintah sudo di AppleScript dijalankan TANPA prompt kata sandi, hilangkan jika Anda INGIN prompt kata sandi ketika tabel routing perlu diubah):

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

salin file ini ke /etc/sudoers.d

jalankan perintah berikut di terminal (perintah kedua akan meminta kata sandi - ini memungkinkan sudo routeperintah dalam AppleScript untuk dijalankan TANPA meminta kata sandi, hilangkan jika prompt kata sandi diinginkan ketika skrip mengubah tabel routing)

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

akhirnya tambahkan aplikasi ke System Prefs> Users and Groups> item login

Item Masuk Terowongan Terpisah

goofologi
sumber
1

Anda harus dapat bertanya kepada administrator perute yang Anda sambungkan untuk mengatur "grup" terpisah yang memisahkan tunneling dan memberi Anda file PCF yang berisi nama grup dan kata sandi grup untuk grup itu.

Vebjorn Ljosa
sumber
2
itu tidak akan terjadi :) Mereka paranoid
1

Saya memiliki masalah yang sama dan berhasil berkat @mehaase ini

Setelah membuat ~/vpn.shseperti yang dijawab oleh @mehaase Anda dapat memasukkan ini ke dalam skrip automator aplikasi yang dapat dijalankan menggunakan langkah-langkah ini:

  1. Menggunakan Automator, buat Aplikasi baru
  2. Tambahkan "Jalankan AppleScript" di bawah Library> Utilities
  3. Memasukkan: do shell script "sudo ~/vpn.sh" with administrator privileges
  4. Menyimpan

Anda mungkin juga perlu menjalankan chmod 700 ~/vpn.shdari Terminal untuk memberikan skrip eksekusi hak istimewa.

Setelah terhubung ke VPN, Anda cukup menjalankan skrip aplikasi ini. Masukkan kata sandi admin Anda dan klik ok - Selesai. :)

Dwight Brown
sumber