Mac'te split tünel yönlendirmesini Cisco VPN'e zorlama


40

Birisi bir cisco VPN üzerindeki her şey için VPN yönlendirmesini zorlamak için yönlendirme masasını (mac'ta) hacklemeyi bilir? Yapmak istediğim hemen hemen sadece VPN üzerinden 10.121. * ve 10.122.

Yanıtlar:


27

Aşağıdaki benim için çalışıyor. Bunları Cisco VPN'e bağlandıktan sonra çalıştırın. (Cisco markalı istemciyi değil, OS X'in yerleşik Cisco istemcisini kullanıyorum.)

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

10İlk komutta, tünelin diğer tarafında bulunan ağla değiştirin .

192.168.0.1Yerel ağınızın ağ geçidi ile değiştirin .

Böyle bir bash betiğine koydum:

$ 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

Ayrıca VPN'i bağladığınızda bunun otomatik olarak nasıl çalıştırılacağına dair bir açıklama buldum , ancak Cuma günü geç oldu ve denemek istemiyorum :)

Düzenle:

O zamandan beri Cisco VPN kullandığım işi bıraktım, bu yüzden bu bellekten geliyor.

10İlk komuta VPN üzerinden rota istediğiniz ağdır. 10için kısa el 10.0.0.0/8. In Tuan Anh Tran durumda, ağıdır gibi görünüyor 192.168.5.0/24.

İkinci komutta hangi ağ geçidinin belirtileceğine gelince, yerel ağ geçidiniz olmalıdır. Bölünmüş tüneli engelleyen bir VPN'de oturum açtığınızda, tüm tabloların sanal arabirimde yönlendirilmesi için yönlendirme tablolarınızı değiştirerek bu politikayı zorlar. Bu nedenle, varsayılan rotanızı VPN'e geçmeden önceki haline değiştirmek istiyorsunuz .

Ağ geçidini anlamanın en kolay yolu netstat -rn, VPN'de oturum açmadan önce çalıştırmak ve "varsayılan" hedefin sağındaki IP adresine bakmaktır. Örneğin, şu an benim kutumda göründüğü gibi:

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

Ağ geçidim 10.0.1.1- "varsayılan" hedefin sağında.


1
Bana biraz daha açıklayabilir misin? Benim ifconfig utun0 döner: bayraklar = 8051 <UP, pointopoint, ÇALIŞIYOR, MULTİCAST> mtu 1280 inet 192.168.5.102 -> 192.168.5.102 ağ maskesi 0xffffffff. Ayrıca, yukarıdaki 10 ile neyi değiştirmeliyim anlamıyorum. Teşekkür ederim.
Tuan Anh Tran

@TuanAnhTran: Cevabımı güncelledim. Lütfen yardımcı olup olmadığını bana bildirin.
Mark E. Haase,

En son sürüm için /Applications/VPNClient.app yüklü ve ifconfig tarafından listelenen utun0'ları göremiyorum. GIF0, stf0 ve fw0 adaptörleri görüyorum. Hangisinin doğru adaptör olduğunu nasıl belirlerim? Bağlı olduğunda ve vpn olmadan ifconfig çıktısında bir fark görmüyorum (en1'in MTU değeri hariç).
haridsv

1
LaunchDaemons'a aşina olmayanlar için, cevabımda, VPN'e her bağlanışınızda çalıştırılacak bir betiğin nasıl çağırılacağını açıklayan bir rehber yazdım . (Bu arada, +1 mükemmel cevap, ama işe yaraması için biraz daha ihtiyacım vardı).
dr jimbob

1
Ne yazık ki bu benim Cisco AnyConnect istemcimde çalışmıyor.
jeremyjjbrown

5

Mehaase'den gelen bilgileri kullanarak, Mac'te bu işlemi gerçekten kolaylaştıran bir Python betiği yazdım. Çalıştırdığınızda, komut dosyası güvenlik duvarı bilgilerinizi kaydedecek, AnyConnect istemcisini başlatacak, giriş yapmayı bekleyecek, ardından yolları ve güvenlik duvarını düzeltecektir. Sadece betiği 'terminal' den çalıştırın.

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

Bu önceki cevabın içindeki Python betiği yardımcı oldu, ancak AnyConnect'in cihazdaki diğer arayüzleri (VMware arayüzleri gibi) devralmak için kullandığı rotaları dikkate almadı. Ayrıca birden fazla VPN ağını da kullanamadı.

İşte kullandığım komut dosyası:

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

Bu cisco ile herhangi bir bağlantı 3.1.0 ile çalışıyor mu? Sanmıyorum ... 3.1.0 için güncellenmiş bir betiğiniz var mı? Teşekkürler!
Kosta,

2

Büyük olasılıkla yöneticiniz, 10.121. * Ve 10.122. * Alt ağları için yerel yönlendirmeyi kullanmak için VPN bağlantılarını ayarlamak ve uzaktan kumandanın (ev makinenizin) tüm istekleri yönlendirmesine izin vermek zorundadır. (onlara bant genişliği ve sorumluluk kazandırır)

Cisco'nun "VPN İstemcisi" kullanıyor musunuz? os OS X?

Eğer OS X’in VPN'sini kullanıyorsanız (ağ Tercihleri ​​Bölmesiyle ayarlanır) "gelişmiş" e tıklayıp "Talep Üzerine VPN" sekmesini seçmelisiniz. daha sonra VPN'in kullanması için gerekli alt ağları sağlayın.


4
OS X vpn istemcisi, "Talep Üzerine VPN" seçeneklerine sahip olmayan ayrı bir "Cisco" seçeneğine (PPTP ve L2TP'den ayrı) sahiptir.
Mark E. Haase,

2

Locamatic işlevine benzer şekilde, Split Tunnel yönlendirmesini etkinleştirmek için oturum açarken çalıştırabilen (ve çalışmaya devam ederek / saklanabilen) yerel bir 'uygulama' istedim . Belki bir noktada Locamatic'i çatallayacağım ve onunla oynayacağım. Ayrıca bu AppleScript’i Github’a yükleyebilirim. Bu cevabın önerdiği gibi bir daemon ile uğraşmak istemedim .

Bu komut dosyası VPN'in varsayılan bir VPN (Cisco IPSec)adı olduğunu ve VPN yolunun 10.10.10.1/22> olduğunu varsayar 10.10.20.10. Bunların değiştirilmesi / ilave yolların eklenmesi gerekecek. netstat -rnVPN bağlıyken (bu betiği etkinleştirmeden önce) VPN ile eklenen rotaları görmek için terminali çalıştırın .

Bu komut dosyası aynı zamanda Bildirim Merkezi’nde growl tarzı bildirimler oluşturur :)

görüntü tanımını buraya girin

Birlikte bazı sorunlarla karşılaştıysanız Mark E. Haase 'ın cevabı bir gelen benim Cisco VPN değiştirir mevcut ağ geçidi olarak UCScbir karşı UGScI(en0 arayüz özgü) rota ve VPN ağ geçidi ekler UCSiki varsayılan ağ geçitleri silinmesini gerektirecek ve arka ekleyerek, rota orijinal UGScvarsayılan ağ geçidi

StackExchange / google’a şükürler olsun ki bu benim ilk AppleScript'im ve birkaç saatlik googling olmadan bir araya getiremedim.

Öneriler / düzeltmeler / optimizasyonlar hoş geldiniz!

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

uygulama olarak kaydet:

Tünel Uygulamasının kaydetme ayarları

sağ tık> paket içeriğini göster, aşağıdakini info.plist'e ekleyin (bu uygulama simgesini dock'tan gizler, uygulamadan pkill -f 'Split Tunnel'çıkmak için Aktivite İzleyicisi veya terminal kullanımı gerektiriyorsa> bir dock simgesi istemiyorsanız atlayın:

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

Yeni bir tek satırlık oluşturmak routeNOPASSWDTAM aşağıdaki kodu kullanarak dosyayı (hiçbir uzantı) (bu yanlış yapılırsa Sudo erişimi engelleyebilir, google visudofazla bilgi için - bu AppleScript sudo komutları istemi bir şifre OLMADAN çalışmasını sağlar, sen ihmali İSTİYORUM eğer yönlendirme tablosunun değiştirilmesi gerektiğinde bir şifre istemi):

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

bu dosyayı kopyala /etc/sudoers.d

Aşağıdaki komutları terminalde çalıştırın (ikinci komut parola isteyecektir - bu sudo routeAppleScript'teki komutların parola sormaksızın çalıştırılmasını sağlar, komut dosyası yönlendirme tablosunu değiştirirken bir parola istemi isteniyorsa atlayın)

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

Sonunda uygulamayı Sistem Tercihleri> Kullanıcılar ve Gruplar> giriş öğelerine ekleyin.

Bölünmüş Tünel Giriş Öğesi


1

Bağlandığınız yönlendiricinin yöneticisine, tüneli bölecek şekilde ayrı bir "grup" kurmasını ve size o grup için grup adını ve grup şifresini içeren bir PCF dosyası vermesini isteyebilmeniz gerekir.


2
Bu olmayacak :) Paranoyak

1

Aynı sorunu yaşadım ve @mehaase sayesinde bu çalışmaya başladım

~/vpn.sh@Mehaase tarafından cevaplandırıldığı şekliyle oluşturduktan sonra, aşağıdaki adımları kullanarak bunu çalıştırılabilir bir uygulama otomator komut dosyasına koyabilirsiniz:

  1. Automator kullanarak yeni bir uygulama oluşturun
  2. Kütüphane> Yardımcı Programlar'ın altına "Bir AppleScript Çalıştır" ekleyin
  3. Giriş: do shell script "sudo ~/vpn.sh" with administrator privileges
  4. Kayıt etmek

chmod 700 ~/vpn.shKomut dosyasının yürütme ayrıcalıklarını vermek için Terminal'den çalıştırmanız da gerekebilir .

VPN'e bağlandıktan sonra bu uygulama betiğini çalıştırabilirsiniz. Yönetici şifrenizi girin ve tamam - Tamam 'ı tıklayın. :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.