ルーティングテーブル(Mac)をハッキングして、Cisco VPN上のあらゆるものに対するVPNルーティングの強制を無効にする方法を知っている人はいますか?私がやりたいことのほとんどは、VPN経由で10.121。*と10.122。*のアドレスのみを持ち、それ以外はすべてインターネットに直接接続することです。
次は私のために働きます。 Cisco VPNへの接続後にこれらを実行します。 (私はOSの組み込みのCiscoクライアントを使用しており、Ciscoブランドのクライアントは使用していません。)
Sudo route -nv add -net 10 -interface utun0
Sudo route change default 192.168.0.1
最初のコマンドの10
を、トンネルの反対側にあるネットワークに置き換えます。
192.168.0.1
をローカルネットワークのゲートウェイに置き換えます。
次のように、bashスクリプトに入れます。
$ 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
私はまた、VPNに接続するときに これを自動的に実行する の方法についての説明も見つけましたが、金曜日は遅く、試してみる気がありません:)
それ以来、Cisco VPNを使用していた仕事を辞めたので、これはメモリからのものです。
最初のコマンドの10
は、VPN経由でルーティングするネットワークです。 10
は10.0.0.0/8
の省略形です。 Tuan Anh Tranの場合 ネットワークは192.168.5.0/24
のようです。
2番目のコマンドで指定するゲートウェイについては、ローカルゲートウェイである必要があります。スプリットトンネリングを防止するVPNにログインすると、すべてのパケットが仮想インターフェイスでルーティングされるようにルーティングテーブルを変更することにより、そのポリシーが適用されます。したがって、VPNに接続する前に、デフォルトのルートをに戻す必要があります。
ゲートウェイを理解する最も簡単な方法は、VPNにログインする前にnetstat -rn
を実行し、「デフォルト」の宛先の右側にあるIPアドレスを確認することです。たとえば、今の私の箱の外観は次のとおりです。
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
です—「デフォルト」の宛先の右側にあります。
mehaaseからの情報 を使用して、Pythonスクリプトを記述しました。このスクリプトは、Macでこのプロセスを本当に簡略化します。実行すると、スクリプトによってファイアウォール情報が保存され、起動します。 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")
Pythonスクリプトの この以前の回答 のスクリプトは役に立ちましたが、AnyConnectがデバイス上の他のインターフェイスを引き継ぐために使用したルート(たとえば、 VMwareインターフェイスとして)複数のVPNネットワークを処理することもできませんでした。
これが私が使用するスクリプトです:
#!/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。*サブネットのローカルルーティングを使用するようにVPN接続を設定し、リモート(ホームマシン)が残りの要求をすべてルーティングできるようにする必要があります。 (それは彼らに帯域幅と責任を節約します)
シスコの「VPNクライアント」を使用していますか? OS X?
oS XのVPN(ネットワーキング設定ペインで設定)を使用している場合は、[詳細]をクリックして[VPNオンデマンド]タブを選択できるはずです。次に、VPNが使用する必要なサブネットを指定します。
Locamatic の関数に似た、スプリットトンネルルーティングを有効にするためにログオン時に実行できる(そして実行/非表示を維持できる)ネイティブの「アプリ」が必要でした。おそらく、ある時点でLocamaticをフォークして、それで遊んでみます。このAppleScriptをGithubにアップロードすることもできます。 this 答えが示唆するように、私はデーモンをいじりたくありませんでした。
このスクリプトは、VPNにデフォルトのVPN (Cisco IPSec)
名があり、VPNルートが10.10.10.1/22
> 10.10.20.10
であることを前提としています。これらは変更する必要があります/追加のルートが追加されます。 VPNが接続されているときに(このスクリプトを有効にする前に)terminal> netstat -rn
を実行して、VPNが追加したルートを確認します。
このスクリプトは、通知センターでうなり声スタイルの通知も生成します。
私のCisco VPNが既存のゲートウェイをUCSc
からUGScI
(en0インターフェイス固有)ルートに変更し、ルートを追加すると、 Mark E. Haase 's answer でいくつかの問題に遭遇しましたUCS
ルートとしてのVPNゲートウェイ。2つのデフォルトゲートウェイの削除と元の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>
次のコードを正確に使用して、新しい1行のrouteNOPASSWD
ファイル(拡張子なし)を作成します(これにより、誤ってSudoアクセスを防止できます。詳細については、google visudo
を参照してください。これにより、AppleScriptのSudoコマンドがパスワードなしで実行できるようになりますプロンプト、次の場合は省略ルーティングテーブルを変更する必要がある場合は、パスワードプロンプトが必要です):
%admin ALL = (ALL) NOPASSWD: /sbin/route
このファイルを/etc/sudoers.d
にコピーします
端末で次のコマンドを実行します(2番目のコマンドはパスワードのプロンプトを表示します-これにより、AppleScriptのSudo route
コマンドがパスワードのプロンプトなしで実行され、スクリプトがルーティングテーブルを変更するときにパスワードプロンプトが必要な場合は省略します)。
chmod 440 /private/etc/sudoers.d/routeNOPASSWD
Sudo chown root /private/etc/sudoers.d/routeNOPASSWD
最後にアプリをSystem Prefs> Users and Groups> login itemsに追加します
私は同じ問題を抱えており、@ mehaaseのおかげでこれが機能しました
@mehaaseの回答に従って~/vpn.sh
を作成したら、次の手順を使用して、これを実行可能なアプリケーションオートマトンスクリプトに追加できます。
do Shell script "Sudo ~/vpn.sh" with administrator privileges
また、ターミナルからchmod 700 ~/vpn.sh
を実行して、スクリプトに実行権限を与える必要がある場合もあります。
後 VPNに接続するだけで、このアプリケーションスクリプトを実行できます。管理者パスワードを入力し、[OK]-[完了]をクリックします。 :)
接続しているルーターの管理者に、スプリットトンネリングを実行する別の「グループ」を設定し、そのグループのグループ名とグループパスワードを含むPCFファイルを提供するよう依頼する必要があります。