Cách buộc định tuyến đường hầm phân chia trên máy Mac sang Cisco VPN


40

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:


27

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ế 10trong lệnh đầu tiên bằng mạng ở phía bên kia của đường hầm.

Thay thế 192.168.0.1bằ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ó :)

Chỉnh sửa:

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 10trong lệnh đầu tiên là mạng mà bạn muốn định tuyến qua VPN. 10là 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 -rntrướ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".


1
Bạn có thể giải thích thêm một chút cho tôi? ifconfig của tôi trả về utun0: flags = 8051 <UP, POINTOPOINT, RUNNING, MULTICAST> mtu 1280 inet 192.168.5.102 -> 192.168.5.102 netmask 0xffffffff. Ngoài ra tôi không hiểu những gì tôi nên thay thế bằng số 10 ở trên. Cảm ơn bạn.
Tuấn Anh Trần

@TuanAnhTran: Tôi đã cập nhật câu trả lời của mình. Xin vui lòng cho tôi biết nếu điều đó giúp.
Đánh dấu E. Haase

Đối với phiên bản mới nhất, tôi đã cài đặt /Appluggest/VPNClient.app và tôi không thấy utun0 được liệt kê bởi ifconfig. Tôi thấy bộ điều hợp gif0, stf0 và fw0. Làm thế nào để tôi xác định đó là bộ chuyển đổi phù hợp? Tôi không thấy bất kỳ sự khác biệt nào trong đầu ra ifconfig có và không có vpn được kết nối (ngoại trừ giá trị MTU của en1).
haridsv

1
Đối với những người không quen thuộc với LaunchDaemons, tôi đã viết một hướng dẫn trong câu trả lời của mình ở đây mô tả cách gọi một tập lệnh để chạy mỗi khi bạn kết nối với VPN . (Nhân tiện, +1 câu trả lời xuất sắc, nhưng tôi cần thêm một chút để làm cho ý chính hoạt động).
dr jimbob

1
Đáng buồn là điều này không hoạt động trên máy khách Cisco AnyConnect của tôi.
jeremyjjbrown

5

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")

4

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

Cái này có hoạt động với cisco anyconnect 3.1.0 không? Tôi không nghĩ rằng nó ... Bạn có một kịch bản cập nhật cho 3.1.0 không? Cảm ơn!
costa

2

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.


4
Ứng dụng khách OS X vpn có tùy chọn "Cisco" riêng biệt (tách biệt với PPTP và L2TP) không có tùy chọn "VPN theo yêu cầu".
Đánh dấu E. Haase

2

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 -rnkhi 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 :)

nhập mô tả hình ảnh ở đây

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 đầuUCScUGScIUCSUGSc

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:

Cài đặt lưu ứng dụng Split Tunnel

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 routeNOPASSWDtệ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 routelệ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

Chia mục đăng nhập đường hầm


1

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 đó.


2
điều đó sẽ không xảy ra :) Họ bị hoang tưởng

1

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.shnhư đượ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:

  1. Sử dụng Automator tạo một Ứng dụng mới
  2. Thêm "Chạy AppleScript" trong Thư viện> Tiện ích
  3. Đi vào: do shell script "sudo ~/vpn.sh" with administrator privileges
  4. Lưu lại

Bạn cũng có thể cần phải chạy chmod 700 ~/vpn.shtừ 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. :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.