Как заставить разделение туннельной маршрутизации на Mac к Cisco VPN

любой знает, как взломать таблицу маршрутизации (на mac), чтобы победить принуждение VPN маршрутизации для каждой вещи по Cisco VPN? довольно много, что я хочу сделать, это иметь только 10.121.* и 10.122.* адреса через VPN и все остальное прямиком в интернет.

29
задан Sathya
26.12.2022 5:17 Количество просмотров материала 3029
Распечатать страницу

7 ответов

следующие работы для меня. Выполните их после подключения к Cisco VPN. (Я использую встроенный клиент Cisco OS X, а не фирменный клиент 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, но это поздно в пятницу, и я не чувствую, как попробовать:)

Edit:

С тех пор я оставил работу, где я использовал Cisco VPN, так что это из памяти.

10 в первой команде-сеть, которую вы хотите маршрутизировать через VPN. 10 - это сокращенная форма 10.0.0.0/8. В дело Туан Ань Трана, похоже, что сеть 192.168.5.0/24.

Что касается шлюза указать во второй команде, это должен быть ваш локальный шлюз. Когда вы входите в VPN, который предотвращает раздельное туннелирование, это принуждает ту политику путем изменения ваших таблиц маршрутизации так, чтобы все пакеты маршрутизировались на виртуальном интерфейсе. Таким образом, вы хотите изменить маршрут по умолчанию обратно к тому, что это было до попадания на VPN.

самый простой способ выяснить шлюз, чтобы запустить netstat -rn перед входом в VPN и посмотрите на 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 - он находится справа от пункта назначения "по умолчанию".

27
отвечен Mark E. Haase 2022-12-27 13:05

С помощью информация от 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")
5
отвечен user652641 2022-12-27 15:22

скрипт 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=
    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 }' | 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 }'`

# 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 }' | 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
4
отвечен Kate Gray 2022-12-27 17:39

скорее всего, администратор должен настроить VPN-подключения для использования локальной маршрутизации для 10.121.* и 10.122.* подсети и пусть удаленный (домашняя машина) маршрут все остальные запросы. (это экономит им пропускную способность и ответственность)

вы используете "VPN-клиент" Cisco? os OS X?

Если вы используете VPN OS X (настройка через Панель сетевых предпочтений) вы должны быть в состоянии нажать кнопку "Дополнительно" и выберите вкладку "VPN по требованию". после этого поставьте необходимые подсети для использования VPN.

2
отвечен Toymakerii 2022-12-27 19:56

вы должны иметь возможность попросить администратора маршрутизатора, к которому вы подключаетесь, настроить отдельную "группу", которая разделяет туннелирование, и предоставить вам файл PCF, содержащий имя группы и пароль группы для этой группы.

1
отвечен Vebjorn Ljosa 2022-12-27 22:13

у меня была та же проблема, и я получил эту работу благодаря @mehaase

после создания ~/vpn.sh Как ответил @mehaase, вы можете поместить это в сценарий запускаемого приложения automator, выполнив следующие действия:

  1. С помощью Automator создать новое приложение
  2. добавить "запустить AppleScript" в разделе Библиотека > утилиты
  3. Enter:do shell script "sudo ~/vpn.sh" with administrator privileges
  4. сохранить

вы также можете запустить chmod 700 ~/vpn.sh из терминала дать скрипт права на выполнение.

после подключение к VPN вы можете просто запустить этот сценарий приложения. Введите пароль администратора и нажмите ok-Done. :)

0
отвечен Dwight Brown 2022-12-28 00:30

я хотел родной "приложение", которое я могу запустить при входе в систему (и продолжать работать / скрытый), чтобы включить разделение туннельной маршрутизации, подобно функции Locamatic. Возможно, в какой-то момент я раскошелюсь на Locamatic и поиграю с ним. Я также могу загрузить этот AppleScript на Github. Я не хотел связываться с демоном как этой ответ напрашивается.

этот скрипт предполагает, что VPN имеет значение по умолчанию VPN (Cisco IPSec) имя и VPN маршрут 10.10.10.1/22 > 10.10.20.10. Они должны быть изменены/добавлены дополнительные маршруты. Запустить терминал > netstat -rn когда VPN подключен (до включения этого сценария), чтобы увидеть VPN-добавленные маршруты.

этот скрипт также генерирует уведомления в стиле growl в Центре уведомлений:)

enter image description here

я столкнулся с некоторыми проблемами с Марк Э. Гаазеs ответ поскольку мой Cisco VPN модифицирует существующий шлюз от UCSc to a UGScI (интерфейс en0 конкретный) маршрут и добавляет VPN-шлюз как UCS маршрут, требующий удаления двух шлюзов по умолчанию и добавления исходного UGSc шлюз по умолчанию

слава Богу за StackExchange / google, это мой первый AppleScript, и я бы не смог собрать его без нескольких часов Google.

предложения/исправления / оптимизации добро пожаловать!

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(, \"en\") > 0 ){print } }' ) # 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

сохранить как приложение:

Split Tunnel app save settings

щелкните правой кнопкой мыши>показать содержимое пакета, добавьте следующее В info.plist (это скрывает иконку приложения из Dock, что требует использования монитора или терминала > pkill -f 'Split Tunnel' чтобы выйти из приложения, опустить, если вы хотите значок Dock:

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

создать новую-строку routeNOPASSWD файл (без расширения), используя следующий код точно (это может предотвратить доступ sudo, если сделано неправильно, google visudo for more info-это позволяет командам sudo в AppleScript работать без запроса пароля, опустить, если вы хотите запрос пароля, когда таблица маршрутизации должна быть изменена):

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

скопировать этот файл в /etc/sudoers.d

выполните следующие команды в терминале (вторая команда запросит пароль - это позволяет sudo route команды в AppleScript для запуска без запроса пароля, опустить, если требуется запрос пароля когда скрипт меняет таблицу маршрутизации)

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

наконец добавить приложение к системе префов > пользователи и группы > элементы входа

Split Tunnel Login Item

0
отвечен goofology 2022-12-28 02:47

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх