Có ai biết cách hack bảng định tuyến (trên máy mac) để đánh bại việc buộc định tuyến VPN cho mọi thứ qua VPN cisco không? hầu như những gì tôi muốn làm chỉ có 10.121. * và 10.122. * địa chỉ qua VPN và mọi thứ khác trực tiếp đến internet.
Có ai biết cách hack bảng định tuyến (trên máy mac) để đánh bại việc buộc định tuyến VPN cho mọi thứ qua VPN cisco không? hầu như những gì tôi muốn làm chỉ có 10.121. * và 10.122. * địa chỉ qua VPN và mọi thứ khác trực tiếp đến internet.
Câu trả lời:
Các công việc sau đây cho tôi. Chạy chúng sau khi kết nối với Cisco VPN. (Tôi đang sử dụng máy khách Cisco tích hợp của OS X, không phải máy khách mang nhãn hiệu Cisco.)
sudo route -nv add -net 10 -interface utun0
sudo route change default 192.168.0.1
Thay thế 10
trong lệnh đầu tiên bằng mạng ở phía bên kia của đường hầm.
Thay thế 192.168.0.1
bằng cổng mạng cục bộ của bạn.
Tôi đặt nó vào một tập lệnh bash, như thế này:
$ 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
Tôi cũng đã tìm thấy một lời giải thích về cách chạy nó tự động khi bạn kết nối VPN, nhưng muộn vào thứ Sáu và tôi không cảm thấy muốn thử nó :)
Tôi đã rời bỏ công việc mà tôi đang sử dụng Cisco VPN, vì vậy đây là từ bộ nhớ.
Các 10
trong lệnh đầu tiên là mạng mà bạn muốn định tuyến qua VPN. 10
là tay ngắn cho 10.0.0.0/8
. Trong trường hợp của Tuấn Anh Trần, có vẻ như mạng là 192.168.5.0/24
.
Đối với cổng nào được chỉ định trong lệnh thứ hai, nó sẽ là cổng cục bộ của bạn. Khi bạn đăng nhập vào VPN ngăn chặn phân chia đường hầm, nó sẽ thực thi chính sách đó bằng cách thay đổi các bảng định tuyến của bạn để tất cả các gói được định tuyến trên giao diện ảo. Vì vậy, bạn muốn thay đổi tuyến đường mặc định của mình trở lại tuyến trước khi vào VPN .
Cách dễ nhất để tìm ra cổng là chạy netstat -rn
trước khi đăng nhập vào VPN và xem địa chỉ IP ở bên phải của đích "mặc định". Ví dụ, đây là những gì nó trông giống như trên hộp của tôi ngay bây giờ:
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
Cổng của tôi là 10.0.1.1
- nó ở bên phải của đích "mặc định".
Sử dụng thông tin từ mehaase, tôi đã viết một tập lệnh Python thực sự đơn giản hóa quá trình này trên Mac. Khi bạn chạy nó, tập lệnh sẽ lưu thông tin tường lửa của bạn, khởi chạy ứng dụng khách AnyConnect, chờ đăng nhập, sau đó sửa các tuyến đường và tường lửa. Chỉ cần chạy tập lệnh từ '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")
Kịch bản Python trong câu trả lời trước này rất hữu ích, tuy nhiên, nó không quan tâm đến các tuyến đường mà AnyConnect đã sử dụng để tiếp quản các giao diện khác trên thiết bị (như giao diện VMware). Nó cũng không thể xử lý nhiều mạng VPN.
Đây là kịch bản tôi sử dụng:
#!/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
Nhiều khả năng quản trị viên của bạn sẽ muốn thiết lập kết nối VPN để sử dụng định tuyến cục bộ cho các mạng con 10.121. * Và 10.122. * Và để điều khiển từ xa (máy chủ của bạn) định tuyến tất cả các yêu cầu còn lại. (nó tiết kiệm cho họ băng thông và trách nhiệm pháp lý)
Bạn có đang sử dụng "Máy khách VPN" của Cisco không? hệ điều hành os X?
nếu bạn sử dụng VPN của OS X (được thiết lập qua Ngăn ưu tiên kết nối mạng), bạn sẽ có thể nhấp vào "nâng cao" và chọn tab "VPN theo yêu cầu". sau đó cung cấp các mạng con cần thiết cho VPN để sử dụng.
Tôi muốn có một 'ứng dụng' gốc mà tôi có thể chạy khi đăng nhập (và tiếp tục chạy / ẩn) để bật định tuyến Split Tunnel, tương tự như chức năng của Locamatic . Có lẽ tôi sẽ rẽ nhánh Locamatic tại một số điểm và chơi với nó. Tôi cũng có thể tải AppleScript này lên Github. Tôi không muốn gây rối với một daemon như câu trả lời này cho thấy.
Kịch bản này giả định VPN có VPN (Cisco IPSec)
tên mặc định và tuyến VPN là 10.10.10.1/22
> 10.10.20.10
. Chúng sẽ cần được thay đổi / bổ sung các tuyến đường. Chạy thiết bị đầu cuối> netstat -rn
khi VPN được kết nối (trước khi bật tập lệnh này) để xem các tuyến đường được thêm VPN.
Tập lệnh này cũng tạo thông báo kiểu gầm gừ trong Trung tâm thông báo :)
Tôi gặp phải một số vấn đề với câu trả lời của Mark E. Haase khi Cisco VPN của tôi sửa đổi cổng hiện có từ tuyến thành (cụ thể giao diện en0) và thêm cổng VPN làm tuyến, yêu cầu xóa hai cổng mặc định và thêm lại cổng mặc định ban đầuUCSc
UGScI
UCS
UGSc
Cảm ơn chúa vì StackExchange / google, đây là AppleScript đầu tiên của tôi và tôi sẽ không thể kết hợp nó với nhau mà không có vài giờ làm việc.
Đề xuất / sửa chữa / tối ưu hóa chào mừng!
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
lưu dưới dạng một ứng dụng:
nhấp chuột phải> hiển thị nội dung gói, thêm phần sau vào info.plist (thao tác này ẩn biểu tượng ứng dụng khỏi thanh công cụ, bắt buộc phải sử dụng Trình giám sát hoạt động hoặc thiết bị đầu cuối> pkill -f 'Split Tunnel'
để thoát ứng dụng, bỏ qua nếu bạn MUỐN biểu tượng dock:
<key>LSBackgroundOnly</key>
<string>1</string>
tạo một routeNOPASSWD
tệp một dòng mới (không có phần mở rộng) bằng cách sử dụng mã sau CHÍNH XÁC (điều này có thể ngăn truy cập sudo nếu thực hiện không chính xác, google visudo
để biết thêm thông tin - điều này cho phép các lệnh sudo trong AppleScript chạy mà KHÔNG cần nhắc mật khẩu, bỏ qua nếu bạn MUỐN một dấu nhắc mật khẩu khi bảng định tuyến cần thay đổi):
%admin ALL = (ALL) NOPASSWD: /sbin/route
sao chép tập tin này vào /etc/sudoers.d
chạy các lệnh sau trong terminal (lệnh thứ hai sẽ nhắc mật khẩu - điều này cho phép các sudo route
lệnh trong AppleScript chạy mà KHÔNG nhắc mật khẩu, bỏ qua nếu muốn có một dấu nhắc mật khẩu khi tập lệnh thay đổi bảng định tuyến)
chmod 440 /private/etc/sudoers.d/routeNOPASSWD
sudo chown root /private/etc/sudoers.d/routeNOPASSWD
cuối cùng thêm ứng dụng vào System Prefs> Users and Groups> mục đăng nhập
Bạn có thể yêu cầu quản trị viên của bộ định tuyến mà bạn đang kết nối để thiết lập một "nhóm" riêng biệt tách đường hầm và cung cấp cho bạn tệp PCF chứa tên nhóm và mật khẩu nhóm cho nhóm đó.
Tôi đã có cùng một vấn đề và đã làm việc này nhờ vào @mehaase
Sau khi tạo ~/vpn.sh
như được trả lời bởi @mehaase, bạn có thể đặt đoạn mã này vào tập lệnh tự động hóa ứng dụng có thể chạy được bằng các bước sau:
do shell script "sudo ~/vpn.sh" with administrator privileges
Bạn cũng có thể cần phải chạy chmod 700 ~/vpn.sh
từ Terminal để cung cấp các đặc quyền thực thi tập lệnh.
Sau khi kết nối với VPN, bạn chỉ cần chạy tập lệnh ứng dụng này. Nhập mật khẩu quản trị viên của bạn và nhấp vào ok - Xong. :)