Как разрешить доступ локальной сети при подключении к Cisco VPN?

Как я могу поддерживать локальный доступ к локальной сети при подключении к Cisco VPN?

При подключении с использованием Cisco VPN сервер должен указывать клиенту, чтобы он запрещал доступ к локальной сети.

Предполагая, что этот параметр на стороне сервера нельзя отключить, как разрешить доступ к локальной сети, когда он подключен к клиенту Cisco VPN?


Раньше я думал, что это просто вопрос добавления маршрутов, которые захватывают трафик локальной сети с более высокой метрикой, например:

  Network 
Destination      Netmask        Gateway       Interface  Metric
   10.0.0.0  255.255.0.0       10.0.0.3        10.0.0.3      20  <--Local LAN
   10.0.0.0  255.255.0.0  192.168.199.1  192.168.199.12       1  <--VPN Link

И пытается удалить 10.0.x.x -> 192.168.199.12 маршрут не имеет никакого эффекта:

>route delete 10.0.0.0
>route delete 10.0.0.0 mask 255.255.0.0
>route delete 10.0.0.0 mask 255.255.0.0 192.168.199.1
>route delete 10.0.0.0 mask 255.255.0.0 192.168.199.1 if 192.168.199.12
>route delete 10.0.0.0 mask 255.255.0.0 192.168.199.1 if 0x3

И хотя это все еще может быть просто проблемой маршрутизации, попытки добавить или удалить маршруты терпят неудачу.

На каком уровне драйвер клиента Cisco VPN делает то, что в сетевом стеке, которое принимает, переопределяет способность локального администратора администрировать свою машину?

Клиент Cisco VPN не может использовать магию. Это все еще программное обеспечение, работающее на моем компьютере. Какой механизм он использует для вмешательства в сеть моей машины? Что происходит, когда в сеть поступает пакет IP/ICMP? Где в сетевом стеке есть пакет?

Смотрите также


Изменить: вещи, которые я еще не пробовал:

>route delete 10.0.*

Обновление: поскольку Cisco отказалась от своего старого клиента в пользу AnyConnect (VPN на основе HTTP SSL), этот вопрос, нерешенный, можно оставить как пережиток истории.

В дальнейшем мы можем попытаться решить ту же проблему со своим новым клиентом.

12 ответов

Проблема с Anyconnect заключается в том, что он сначала изменяет таблицу маршрутизации, затем присматривает за ней и исправляет ее, если вы измените ее вручную. Я нашел обходной путь для этого. Работает с версиями 3.1.00495, 3.1.05152, 3.1.05170 и, вероятно, с чем-либо еще в семействе 3.1. Может работать с другими версиями, по крайней мере, аналогичная идея должна работать при условии, что код не будет переписан. К счастью для нас, компания Cisco поместила вызов няни "бодрствующий ребенок" в общую библиотеку. Таким образом, идея заключается в том, что мы предотвращаем действия vpnagentd через LD_PRELOAD.

  1. Сначала мы создаем файл hack.c:

    #include <sys/socket.h>
    #include <linux/netlink.h>
    
    int _ZN27CInterfaceRouteMonitorLinux20routeCallbackHandlerEv()
    {
      int fd=50;          // max fd to try
      char buf[8192];
      struct sockaddr_nl sa;
      socklen_t len = sizeof(sa);
    
      while (fd) {
         if (!getsockname(fd, (struct sockaddr *)&sa, &len)) {
            if (sa.nl_family == AF_NETLINK) {
               ssize_t n = recv(fd, buf, sizeof(buf), MSG_DONTWAIT);
            }
         }
         fd--;
      }
      return 0;
    }
    
  2. Затем скомпилируйте это так:

    gcc -o libhack.so -shared -fPIC hack.c
    
  3. устанавливать libhack.so в путь к библиотеке Cisco:

    sudo cp libhack.so  /opt/cisco/anyconnect/lib/
    
  4. Сбить агента:

    /etc/init.d/vpnagentd stop
    
  5. Убедитесь, что это действительно вниз

    ps auxw | grep vpnagentd
    

    Если не, kill -9 просто чтобы убедиться.

  6. Затем исправьте /etc/init.d/vpnagentd, добавив LD_PRELOAD=/opt/cisco/anyconnect/lib/libhack.soгде vpnagentd вызывается так, что это выглядит так:

    LD_PRELOAD=/opt/cisco/anyconnect/lib/libhack.so /opt/cisco/anyconnect/bin/vpnagentd
    
  7. Теперь запустите агент:

    /etc/init.d/vpnagentd start
    
  8. Исправьте iptables, потому что AnyConnect портит их:

    iptables-save | grep -v DROP | iptables-restore
    

    Вы можете сделать что-то более продвинутое здесь, чтобы разрешить доступ только к определенным узлам локальной сети.

  9. Теперь исправьте маршруты по своему усмотрению, например:

    route add -net 192.168.1.0 netmask 255.255.255.0 dev wlan0
    
  10. Проверьте, действительно ли они там:

    route -n
    

Предыдущая, более простая версия этого хака дала функцию, которая только "возвращала 0;" - на этом постере отмечалось, что "единственный побочный эффект, который я наблюдал до сих пор, заключается в том, что vpnagentd использует 100% ЦП, о чем сообщает top, но общий ЦП составляет всего 3% пользователей и 20% системы, а система прекрасно реагирует". Я ограничил это, кажется, что он делает два выбора в цикле, когда простаивает, возвращаясь из обоих быстро, но он никогда не читает и не записывает - я предполагаю, что вызов, который я вырезал с помощью LD_PRELOAD, должен был прочитать. Возможно, есть более чистый способ сделать это, но для меня это пока хорошо. Если у кого-то есть лучшее решение, поделитесь ".

Проблема с тривиальным взломом состоит в том, что оно заставляет одно ядро ​​процессора постоянно работать на 100%, эффективно уменьшая количество потоков аппаратного процессора на единицу - было ли ваше соединение vpn активным или нет. Я заметил, что выборки, которые делал код, находились в сокете netlink, который отправляет данные vpnagentd при изменении таблицы маршрутизации. vpnagentd постоянно замечает, что в сокете netlink есть новое сообщение и вызывает routeCallBackHandler, чтобы разобраться с ним, но поскольку тривиальный хак не очищает новое сообщение, он просто продолжает вызываться снова и снова. новый код, приведенный выше, сбрасывает данные netlink, поэтому бесконечный цикл, который привел к 100% -ному процессору, не происходит.

Если что-то не работает, делай gdb -p $(pidof vpnagentd)после прикрепления:

b socket
c
bt

и посмотрите, в каком вызове вы находитесь. Затем просто догадайтесь, какой из них вы хотите вырезать, добавьте его в hack.c и перекомпилируйте.

Это ОЧЕНЬ запутанно, но если вы создаете минимальную виртуальную машину с помощью VMWare Player или аналогичного устройства и запускаете в ней клиент Cisco AnyConnect VPN, возможно, можно настроить маршрутизацию по своему усмотрению с использованием виртуальных сетевых адаптеров VMWare или просто использовать ВМ для доступа к любым ресурсам, необходимым через Cisco SSL VPN и "перетаскивание" файлов на / с вашей реальной машины.

Для тех, кто хочет сохранить контроль над своей таблицей маршрутизации при использовании SSL AnyConnect SSL VPN, проверьте OpenConnect. Он поддерживает Cisco AnyConnect SSL VPN и не пытается нарушать или "защищать" записи таблицы маршрутизации. Vadzim ссылается на это в комментарии выше.

Попробовав все, кроме исправления клиента AnyConnect Secure Mobility, я смог успешно заменить его в Windows на графический интерфейс OpenConnect. Это позволило мне поддерживать подключение к локальным ресурсам (и обновлять таблицу маршрутизации).

Я использую OpenConnect в Windows, но он также поддерживает Linux, BSD и macOS (среди других платформ) в соответствии со страницей проекта.

Программное обеспечение Shrew Soft VPN также помогло мне, как предположил Иан Бойд .

Он может импортировать профили клиента Cisco VPN. Я использовал Cisco VPN Client версии 5.0.05.0290, и после установки Shrew VPN (версия 2.1.7) и импорта профиля Cisco я смог получить доступ к локальной локальной сети при подключении к корпоративной VPN без какой-либо дополнительной настройки подключения Shrew VPN (или программного обеспечения).

Спасибо Sasha Pachev за хороший взлом выше.

vpnagentd также портит распознаватель, перезаписывая изменения, внесенные в /etc/resolv.conf, Я решил это, в конечном итоге выиграв гонку против него:

#!/bin/bash

dnsfix() {
    [ -f /etc/resolv.conf.vpnbackup ] || echo "Not connected?" >&2 || return 0 # do nothing in case of failure
    while ! diff -q /etc/resolv.conf /etc/resolv.conf.vpnbackup #>/dev/null
    do
         cat /etc/resolv.conf.vpnbackup >/etc/resolv.conf
    done
    chattr +i /etc/resolv.conf
    diff -q /etc/resolv.conf /etc/resolv.conf.vpnbackup >/dev/null 
}

while ! dnsfix
do
    echo "Retrying..."
    chattr -i /etc/resolv.conf
done

Не забудь chattr -i /etc/resolv.conf при отключении.

Я пытаюсь решить эту проблему путем перехвата обратного вызова, как для метода маршрутов, описанного выше, но пока не могу найти соответствующий обратный вызов или метод.

Обновление 1/2: A strace показал, что vpnagentdиспользует inotify API для отслеживания изменений файла распознавателя. С этого момента это было вниз по склону. Вот дополнительный хак:

int _ZN18CFileSystemWatcher11AddNewWatchESsj(void *string, unsigned int integer)
{
  return 0;
}

Это немного излишне, так как отключает просмотр всех файлов для агента. Но, похоже, работает хорошо.

Скрипт оболочки клиента vpn, представленный ниже, объединяет все функции (обновлен, чтобы включить этот дополнительный хак). chattr больше не используется / нужен.

Обновление 3: исправлены настройки имени пользователя / пароля в скрипте. Теперь он использует vpn.conf файл с форматом, описанным ниже (и разрешения только для root).

#!/bin/bash

# Change this as needed
CONF="/etc/vpnc/vpn.conf"
# vpn.conf format
#gateway <IP>
#username <username>
#password <password>
#delete_routes <"route spec"...> eg. "default gw 0.0.0.0 dev cscotun0"
#add_routes <"route spec"...> eg. "-net 192.168.10.0 netmask 255.255.255.0 dev cscotun0" "-host 10.10.10.1 dev cscotun0"

ANYCONNECT="/opt/cisco/anyconnect"

usage() {
    echo "Usage: $0 {connect|disconnect|state|stats|hack}"
    exit 1
}

CMD="$1"
[ -z "$CMD" ] && usage

ID=`id -u`

VPNC="$ANYCONNECT/bin/vpn"

dnsfix() {
    [ -f /etc/resolv.conf.vpnbackup ] || echo "Not connected?" >&2 || return 0 # do nothing in case of failure
    while ! diff -q /etc/resolv.conf /etc/resolv.conf.vpnbackup >/dev/null
    do
         cat /etc/resolv.conf.vpnbackup >/etc/resolv.conf
    done
#    chattr +i /etc/resolv.conf
    diff -q /etc/resolv.conf /etc/resolv.conf.vpnbackup >/dev/null 
}

case "$CMD" in
    "connect")
        [ $ID -ne 0 ] && echo "Needs root." && exit 1
        HOST=`grep ^gateway $CONF | awk '{print $2}'`
        USER=`grep ^user $CONF | awk '{print $2}'`
        PASS=`grep ^password $CONF | awk '{print $2}'`
        OLDIFS=$IFS
        IFS='"'
        DEL_ROUTES=(`sed -n '/^delete_routes/{s/delete_routes[ \t\"]*//;s/\"[ \t]*\"/\"/g;p}' $CONF`)
        ADD_ROUTES=(`sed -n '/^add_routes/{s/add_routes[ \t\"]*//;s/\"[ \t]*\"/\"/g;p}' $CONF`)
        IFS=$OLDIFS

        /usr/bin/expect <<EOF
set vpn_client "$VPNC";
set ip "$HOST";
set user "$USER";
set pass "$PASS";
set timeout 5
spawn \$vpn_client connect \$ip
match_max 100000
expect { 
    timeout {
        puts "timeout error\n"
        spawn killall \$vpn_client
        exit 1
    }
    ">> The VPN client is not connected." { exit 0};
    ">> state: Disconnecting" { exit 0};
    "Connect Anyway?"
}
sleep .1
send -- "y\r"
expect { 
    timeout {
        puts "timeout error\n"
        spawn killall \$vpn_client
        exit 1
    }
    "Username:"
}
sleep .1
send -- "\$user\r"
expect { 
    timeout {
        puts "timeout error\n"
        spawn killall \$vpn_client
        exit 1
    }
    "Password: "
}
send -- "\$pass\r";
expect eof
EOF
        sleep 2
        # iptables
        iptables-save | grep -v DROP | iptables-restore

        # routes
        for ROUTE in "${DEL_ROUTES[@]}"
        do
#            echo route del $ROUTE
            route del $ROUTE
        done
        for ROUTE in "${ADD_ROUTES[@]}"
        do
#            echo route add $ROUTE
            route add $ROUTE
        done

        # dns
        while ! dnsfix
        do
            echo "Try again..."
#            chattr -i /etc/resolv.conf
        done

        echo "done."
        ;;
    "disconnect")
#        [ $ID -ne 0 ] && echo "Needs root." && exit 1
        # dns
#        chattr -i /etc/resolv.conf

        $VPNC disconnect
        ;;
    "state"|"stats")
        $VPNC $CMD
        ;;
    "hack")
        [ $ID -ne 0 ] && echo "Needs root." && exit 1
        /etc/init.d/vpnagentd stop
        sleep 1
        killall -9 vpnagentd 2>/dev/null
        cat - >/tmp/hack.c <<EOF
#include <sys/socket.h>
#include <linux/netlink.h>

int _ZN27CInterfaceRouteMonitorLinux20routeCallbackHandlerEv()
{
  int fd=50;          // max fd to try
  char buf[8192];
  struct sockaddr_nl sa;
  socklen_t len = sizeof(sa);

  while (fd) {
     if (!getsockname(fd, (struct sockaddr *)&sa, &len)) {
        if (sa.nl_family == AF_NETLINK) {
           ssize_t n = recv(fd, buf, sizeof(buf), MSG_DONTWAIT);
        }
     }
     fd--;
  }
  return 0;
}

int _ZN18CFileSystemWatcher11AddNewWatchESsj(void *string, unsigned int integer)
{
  return 0;
}
EOF
        gcc -o /tmp/libhack.so -shared -fPIC /tmp/hack.c
        mv /tmp/libhack.so $ANYCONNECT
        sed -i "s+^\([ \t]*\)$ANYCONNECT/bin/vpnagentd+\1LD_PRELOAD=$ANYCONNECT/lib/libhack.so $ANYCONNECT/bin/vpnagentd+" /etc/init.d/vpnagentd
        rm -f /tmp/hack.c
        /etc/init.d/vpnagentd start
        echo "done."
        ;;
    *)
        usage
        ;;
esac

Как использовать «openconnect» (через оболочку) с двухфакторной аутентификацией SAML и Duo через систему единого входа Okta (SSO)

Протестировано и работает как минимум на Ubuntu 18.04 и 22.04.
В целях безопасности я затемнил соответствующие части скриншотов.
Этот ответ также находится в моем репозитории здесь: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/vpn/openconnect-sso.md .

Cisco AnyConnect — VPN-клиент с невероятно строгими ограничениями. Он маршрутизирует весь трафик через VPN и блокирует все локальные соединения после подключения к VPN.

Мой предпочтительный способ решить эту проблему — просто использовать . Он совместим с серверами Cisco AnyConnect, а его клиент разрешает локальные подключения даже при подключении VPN, маршрутизируя через VPN только необходимый трафик (через разделенное туннелирование ) для достижения конечных точек, которые в противном случае недоступны без VPN. Таким образом, решается эта проблема и разрешается доступ к локальной сети при подключении к Cisco VPN.

Пример 1. Простой пример с двухфакторной аутентификацией Duo.

Вот пример того, как подключиться к VPN Университета Райса с помощью: :

      # install
sudo apt update 
sudo apt install vpnc-scripts openconnect

# connect
# NB: for the **second password** field when running the commands below, type
# `pin`, `push`, `phone`, or `sms` to specify how you'd like to receive your 
# two-factor authentication request. Add a number to the end of the command if
# you have multiple registered devices. Ex: `push2`, `phone2`, `sms2`, etc.

# Option 1: runs in the background
openconnect -b --quiet --user=netID --authgroup=RiceNet connect.rice.edu
# Option 2: runs in the background
openconnect -b --quiet --no-dtls --user=netID --authgroup=RiceNet connect.rice.edu

# Option 3: runs in the foreground
openconnect --no-dtls connect.rice.edu

Чтобы отключиться , используйте Ctrl+ Cв терминале, если процесс запущен на переднем плане. Или, если процесс выполняется в фоновом режиме, откройте любой терминал и выполните одну из следующих команд, чтобы безопасно отправить работающему процессу сигнал прерывания Ctrl+ C, например:


Более подробную информацию см. в моем ответе здесь:

Пример 2 [Что я использую]: использование оболочки для аутентификации SAML через систему единого входа Okta (SSO) и двухфакторную аутентификацию Duo.

Мой случай более сложный, поэтому я не могу использовать OpenConnectсамо собой. Вместо этого я должен использоватьОболочка «OpenConnect Single Sign-On (SSO)», которая обеспечивает двухфакторную аутентификацию SAML через Okta вместо клиента Cisco AnyConnect.

Я обнаружил, что установка , но эти инструкции должны облегчить вам задачу:

      sudo apt update
sudo apt install vpnc-scripts openconnect   # install openconnect
sudo apt install python3 pip

python3 -m pip install --upgrade pip
python3 -m pip install openconnect-sso      # install openconnect-sso

# install openconnect-sso dependencies, including forcing a reinstall of PyQt5

# uninstall
python3 -m pip uninstall PyQt5
python3 -m pip uninstall PyQt5-sip
python3 -m pip uninstall PyQtWebEngine
python3 -m pip uninstall keyring

# reinstall
python3 -m pip install PyQt5
python3 -m pip install PyQt5-sip
python3 -m pip install PyQtWebEngine
python3 -m pip install keyring

python3 -m pip install cffi

# Check the version
# My output is: `openconnect-sso 0.7.3`
openconnect-sso --version

Использование (примечание: информацию о том, как найти адрес вашего сервера и группу SAML, см. ниже):

Большое спасибо @smoser здесь и @lucashtc здесь за помощь в исправлении некоторых проблем, которые я заметил при запуске этого в Ubuntu 22.04. См. также мой комментарий здесь .

  1. Создать~/.my_ssl.confфайл:

            gedit ~/.my_ssl.conf
    

    Затем вставьте в него следующее:

            # Custom configuration to solve some problems while using `openconnect-sso` in Ubuntu 22.04.
    # See: https://github.com/vlaci/openconnect-sso/issues/81#issuecomment-1363355533
    
    openssl_conf = openssl_init
    
    [openssl_init]
    ssl_conf = ssl_sect
    
    [ssl_sect]
    system_default = system_default_sect
    
    [system_default_sect]
    Options = UnsafeLegacyRenegotiation
    

    Сохраните его и закройте.

  2. Затем запустите это:

            VPN_SERVER_ADDRESS="myvpn.whatever.com"   # example server address to connect to
    VPN_SAML_GROUP="whatever-saml-whatever"   # example SAML group name
    VPN_USER="my.username@something.com"      # example username
    # or perhaps just this for the username:
    # VPN_USER="my.username"
    
    # Custom configuration to solve some problems while using `openconnect-sso` in Ubuntu 22.04.
    # See: https://github.com/vlaci/openconnect-sso/issues/81#issuecomment-1363355533
    export QTWEBENGINE_DISABLE_SANDBOX=1
    export OPENSSL_CONF=~/.my_ssl.conf
    
    # connect via `openconnect-sso`
    # The first time ever, you must specify everything
    openconnect-sso --server "${VPN_SERVER_ADDRESS}/${VPN_SAML_GROUP}" --user "${VPN_USER}"
    # Subsequent connection attempts can be done with just this, since apparently
    # the server address, SAML group, and username are cached after the first usage
    openconnect-sso
    

    Обратите внимание, что вы также можете поместить использованные выше переменные в свой файл.export требуется для двух из них, но не дляVPN*переменные, которые я установил выше.

    Добавьте в конец файла:

            # Custom configuration to solve some problems while using `openconnect-sso` in Ubuntu 22.04.
    # See: https://github.com/vlaci/openconnect-sso/issues/81#issuecomment-1363355533
    export QTWEBENGINE_DISABLE_SANDBOX=1
    export OPENSSL_CONF=~/.my_ssl.conf
    
    VPN_SERVER_ADDRESS="myvpn.whatever.com"   # example server address to connect to
    VPN_SAML_GROUP="whatever-saml-whatever"   # example SAML group name
    VPN_USER="my.username@something.com"      # example username
    # or perhaps just this for the username:
    # VPN_USER="my.username"
    

    Теперь выйдите из Ubuntu и войдите снова или восстановите исходный код~/.bashrcфайл:

            . ~/.bashrc
    

    Тогда вы можете просто работать без этих ведущих переменных:

            # the first time
    openconnect-sso --server "${VPN_SERVER_ADDRESS}/${VPN_SAML_GROUP}" --user "${VPN_USER}"
    # Subsequent connection attempts 
    openconnect-sso
    

.my_ssl.conf теперь также является частью моего репозитория eRCaGuy_dotfileseRCaGuy_dotfiles .

Скриншоты и последовательность событий при подключении:

Когда я запускаю команду выше, происходит вот что:

  1. открывает веб-страницу с надписью «Powered by Okta» (как указано внизу — см. снимок экрана ниже) и которая запрашивает мое имя пользователя и пароль для двухфакторной аутентификации Duo SSO (единый вход). Мое имя пользователя и пароль уже заполнены — возможно, потому, что я делал это раньше. В нем говорится: «Мы обнаружили некоторые ошибки. Пожалуйста, просмотрите форму и внесите исправления». Не обращайте внимания на эту ошибку. Я думаю, это просто потому, что имя пользователя и пароль были введены автоматически, и он их пока не обнаруживает. Чтобы он их обнаружил, мне просто нужно щелкнуть в поле имени пользователя мое уже введенное имя пользователя и Tabдважды нажать. В результате взаимодействия с полями ввода форма обнаруживает наличие моего имени пользователя и пароля. Затем он автоматически проверяет мое имя пользователя и пароль, поскольку они уже введены, а затем загружает новую веб-страницу.

  2. На новой странице я проверяю, что мой правильный номер телефона или устройство выбран в поле «Устройство», затем нажимаю кнопку «Отправить мне push-уведомление», и на мой телефон отправляется push-запрос двухфакторной аутентификации Duo. Я аутентифицируюсь на своем телефоне в приложении Duo, после чего окно веб-страницы автоматически закрывается.

    Обратите внимание: на скриншоте выше написано, что мое компьютерное программное обеспечение устарело просто потому, что оно хочет, чтобы я обновил свою версию браузера Chrome до последней. Если я не буду делать это хотя бы раз в 10 дней или около того, VPN-сервер не позволит мне войти в систему.

  3. Затем в терминале печатается несколько заявлений о выходе из браузера (показано чуть ниже), затем он запрашивает мой пароль (также показан чуть ниже) для моего имени пользователя Linux Ubuntu, чтобы он мог работать от имени пользователя root и выполнить окончательное VPN-соединение, как корень. Я ввожу это и нажимаю Enter. Затем он завершает подключение к VPN. Последние несколько строк он распечатывает, начиная с того, где он закрыл окно браузера, а затем запросил мой Linux.sudoпароль, посмотрите следующим образом (обратите внимание, что я изменил свои IP-адреса в выходных данных в целях безопасности):

            [info     ] Terminate requested.           [webengine] 
    [info     ] Exiting browser                [webengine] 
    [info     ] Browser exited                 [openconnect_sso.browser.browser] 
    [info     ] Response received              [openconnect_sso.authenticator] id=success message=
    [sudo] password for gabriel: 
    Connected to xxx.xxx.xxx.x:443
    SSL negotiation with myvpn.whatever.com
    Server certificate verify failed: signer not found
    Connected to HTTPS on myvpn.whatever.com
    Got CONNECT response: HTTP/1.1 200 OK
    CSTP connected. DPD 30, Keepalive 20
    Connected as xx.xxx.x.xxx + aaaa:bbbb:cccc::ddd/64, using SSL
    Established DTLS connection (using GnuTLS). Ciphersuite (DTLS0.9)-(DHE-RSA-4294967237)-(AES-256-CBC)-(SHA1).
    
  4. Успех! Теперь я полностью подключен к VPN, но у меня по-прежнему есть полный доступ к моей локальной сети и я могу подключиться по ssh к своим локальным платам со встроенным Linux!

Опять же, чтобы отключиться , используйте Ctrl+ Cв терминале, выполняющем процесс на переднем плане. Или откройте любой терминал и выполните одну из следующих команд, чтобы отправить запущенному процессу Ctrl+C SIGINTбезопасно прервать сигнал следующим образом:

      # to cleanly kill openconnect or openconnect-sso
sudo pkill --signal SIGINT openconnect
# or (same thing)
sudo pkill -SIGINT openconnect

Более подробную информацию см. в моем ответе здесь: :

Если вы используетеsudo pkill openconnectвместо этого он отправляет значение по умолчаниюSIGTERMвместо этого сигнал завершения, который принудительно убивает его, а не убивает его полностью. Если вы допустили эту простую ошибку, просто выключите карту Wi-Fi, а затем снова включите ее, переключив ее с помощью Fn+ F8или аналогичного символа (найдите значок маяка Wi-Fi) на клавиатуре ноутбука. Это сбросит ваше подключение к Интернету, и ваш Интернет снова заработает.

Как узнать адрес вашего VPN-сервера и группу SAML

Протестировано с использованием клиента Cisco AnyConnect Secure Mobility Client версии 4.10.05085 в Linux Ubuntu 18.04:

  1. Откройте клиент Cisco AnyConnect и щелкните вкладку «VPN». Это будет выглядеть так. Адрес вашего VPN-сервера указан в поле «Подключиться к».
  2. Нажмите кнопку «Подключиться», и в новом окне браузера откроется окно «Powered by Okta» «Duo SSO».
    1. Это окно браузера выглядит так:
    2. В окне Cisco AnyConnect теперь отображается поле «Группа» , в котором указана ваша группа SAML:
  3. Используйте этот адрес VPN-сервера и имя группы SAML в приведенной выше команде.

Пример 2 устранения неполадок

Если вы не можете заставить PyQt5 или другие зависимости работать с простым Python3, возможно, ваша версия Python3 слишком старая. Попробуйте принудительно установить и использовать более позднюю версию Python3, как показано ниже. Например, если бы я хотел использовать Python3.8, это выглядело бы так:

      sudo apt update
sudo apt install vpnc-scripts openconnect   # install openconnect
sudo apt install python3.8

python3.8 -m pip install --upgrade pip
python3.8 -m pip install openconnect-sso      # install openconnect-sso

# install openconnect-sso dependencies, including forcing a reinstall of PyQt5

# uninstall
python3.8 -m pip uninstall PyQt5
python3.8 -m pip uninstall PyQt5-sip
python3.8 -m pip uninstall PyQtWebEngine
python3.8 -m pip uninstall keyring

# reinstall
python3.8 -m pip install PyQt5
python3.8 -m pip install PyQt5-sip
python3.8 -m pip install PyQtWebEngine
python3.8 -m pip install keyring

python3.8 -m pip install cffi

# Check the version
# My output is: `openconnect-sso 0.7.3`
openconnect-sso --version

Другие советы

Вы можете просмотреть различную информацию. о вашем VPN-сервере вот так (источник: ):

      openconnect --dump -vvvv myvpn.whatever.com

Рекомендации

Вот большинство дополнительных ссылок, которые мне пришлось просмотреть, чтобы выяснить некоторые зависимости и связанную с ними информацию. выше.

  1. kb.rice.edu: VPN: openconnect VPN для Linux с использованием аутентификации Duohttps://kb.rice.edu/page.php?id=113148
  2. https://github.com/dlenski/openconnect/issues/116
  3. ***** Python 3.7.0 Нет модуля с именем «PyQt5.QtWebEngineWidgets».
  4. Нет модуля с именем _cffi_backend.
  5. https://github.com/Nike-Inc/gimme-aws-creds/issues/158
  6. https://bobbyhadz.com/blog/python-no-module-named-pyqt5
  7. [мой ответ] Как установить PyQt5 в Python3 и здесь
  8. ***** Ссылка openconnect-sso в самом верху этой темы — это то, как я впервые узнал об openconnect-sso!:
  9. [мои вопросы и ответы] Отключите VPN для определенных локальных устройств, таких как встроенная плата Linux, к которой мне нужно подключиться по SSH (Разрешить локальный (LAN) доступ при использовании VPN)
  10. [мой ответ] Как правильно выключить?Как правильно закрыть openconnect?Как правильно выключить?
  11. https://github.com/vlaci/openconnect-sso
    1. Все проблемы, которые я открывал: https://github.com/vlaci/openconnect-sso/issues?q=is%3Aissue+author%3AElectricRCAircraftGuy+
    2. [моя проблема] невероятно сложна из-за некоторых простых проблем с зависимостямиModuleNotFoundError: нет модуля с именем «PyQt5» [решено; пожалуйста, обновите инструкции по установке, добавив эту информацию]
  12. https://github.com/dlenski/openconnect/issues/143
  13. https://gitlab.com/openconnect/openconnect/-/issues/84https://gitlab.com/openconnect/openconnect/-/issues/84https://gitlab.com/openconnect/openconnect/-/issues/84
  14. Поиск в Google по запросу «открытое соединение с двухфакторной аутентификацией Duo».
  15. ***** Поиск в Google "openconnect" with duo two factor authentication and "okta"
  16. https://www.reddit.com/r/archlinux/comments/8wclaz/openconnect_and_two_factor_auth/
  17. https://duo.com/docs/okta
  18. [мой ответ] Cisco Anyconnect не работает в Ubuntu 18.04 с двухфакторной аутентификацией
  19. чиновникopenconnectрепо - я думаю!: https://gitlab.com/openconnect/openconnect
  20. https://docs.python-guide.org/starting/install3/linux/
  21. Имеете дело с несколькими версиями Python и PIP?
  22. ***** https://github.com/vlaci/openconnect-sso/issues/81 — помогло исправить некоторые ошибки/проблемы при запуске.openconnect-ssoв Убунту 22.04

Смотрите также

  1. [мой ответ] Спросите Ubuntu: как установить openconnect-sso в Ubuntu 21.04
  2. [мой ответ] Ошибка сервера: настройка доступа к SSL VPN WatchGuard Firebox в Linux Ubuntu

Моя компания до сих пор использует этот VPN. Клиент vpnc просто меняет настройки iptables таким образом:

# iptables-save
# Сгенерировано iptables-save v1.4.10 в Вс 17 июня 14:12:20 2012
*фильтр:INPUT DROP [0:0]: ВПЕРЕД ПРИНЯТЬ [0:0]:OUTPUT DROP [0:0]
-A ВВОД -s 123.244.255.254/32 -d 192.168.0.14/32 -j ПРИНЯТЬ 
-A ВХОД -i tun0 -j ПРИНЯТЬ 
-A ВВОД -i lo0 -j ПРИНЯТЬ
-A INPUT -j DROP 
-A ВЫХОД -s 192.168.0.14/32 -d 123.244.255.254/32 -j ПРИНЯТЬ 
-A ВЫХОД -o tun0 -j ПРИНЯТЬ 
-A ВЫХОД -o lo0 -j ПРИНЯТЬ 
-A ВЫХОД -j DROP 
COMMIT

Он фильтрует все, кроме трафика VPN.

Просто добавьте фильтр в файл с помощью iptables-save, добавьте строки доступа INPUT и OUTPOUT, соответствующие вашим потребностям, и повторно примените файл с помощью iptables-restore.

например, для доступа к локальной сети на 192.168.0

# Сгенерировано iptables-save v1.4.10 в Вс 17 июня 14:12:20 2012
*фильтр:INPUT DROP [0:0]: ВПЕРЕД ПРИНЯТЬ [0:0]:OUTPUT DROP [0:0]
-A ВВОД -s 123.244.255.254/32 -d 192.168.0.14/32 -j ПРИНЯТЬ 
-A INPUT -s 192.168.0.0/24 -d 192.168.0.14/32 -j ПРИНЯТЬ #local in
-A ВХОД -i tun0 -j ПРИНЯТЬ 
-A ВВОД -i lo0 -j ПРИНЯТЬ 
-A INPUT -j DROP 
-A ВЫХОД -s 192.168.0.14/32 -d 123.244.255.254/32 -j ПРИНЯТЬ 
-A ВЫХОД -s 192.168.0.14/32 -d 192.168.0.0/24 -j ПРИНЯТЬ #local out
-A ВЫХОД -o tun0 -j ПРИНЯТЬ 
-A ВЫХОД -o lo0 -j ПРИНЯТЬ 
-A ВЫХОД -j DROP 
COMMIT

Поскольку я не могу добавлять комментарии, я опубликую здесь. Я работаю на Windows.

Решение, использующее виртуальную машину и запускающее AnyConnect внутри виртуальной машины, а затем использующее виртуальную машину в качестве посредника между вашей рабочей средой и сетью компании, не будет работать, если ваш "любимый" ИТ-отдел маршрутизирует 0.0.0.0 через VPN, то есть даже в вашу локальную сеть (включая эту). между вашим локальным ПК и виртуальной машиной) маршрутизируется через VPN(так!).

Я попытался применить решение, опубликованное @Sasha Pachev, но в итоге я исправил.dll так, что он возвращает 0 в начале функции. В конце концов, после некоторой борьбы с динамической библиотекой, я смог изменить таблицы маршрутизации в соответствии со своими потребностями, но, видимо, этого недостаточно!

Несмотря на то, что мои правила кажутся правильными для достижения разделенного туннелирования, я все равно получаю общий отказ. Сталкивались ли вы с подобной проблемой, как смогли ее решить?

  • Мой шлюз в интернет 192.168.163.2
  • Мой шлюз к сети компании - 10.64.202.1 (таким образом, целая 10.. * Подсеть, которую я рассматриваю как "компанию")

Вот так теперь выглядит моя таблица маршрутизации (после ручных изменений при включенном VPN)

пока результат пинга следующий

C:\Users\Mike>ping -n 1 10.64.10.11
Reply from 10.64.10.11: bytes=32 time=162ms TTL=127

C:\Users\Mike>ping -n 1 8.8.8.8
PING: transmit failed. General failure.

C:\Users\Mike>ping -n 1 192.168.163.2
General failure.

Просто для справки, ниже, как выглядит таблица маршрутов, когда VPN отключен (без изменений)

и вот так выглядит таблица, когда VPN подключен (без изменений) в том случае, когда я пытаюсь пинговать 8.8.8.8 Я просто получаю тайм-аут (поскольку брандмауэр компании не позволяет трафику выходить за пределы интрасети)

Есть новости по этому поводу?

На каком уровне драйвер клиента Cisco VPN делает то, что в сетевом стеке, которое принимает, переопределяет способность локального администратора администрировать свою машину?

Я полностью согласен и задавался вопросом об одном и том же.

В любом случае, это приложение, для установки которого требуются права администратора, и во время работы оно может очень хорошо фильтровать то, что вы делаете ...

Мои попытки на Windows тоже терпят неудачу:

route change 0.0.0.0 mask 0.0.0.0 192.168.1.1 metric 1
 OK!

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.1.1    192.168.1.230     21 <-- LAN
          0.0.0.0          0.0.0.0    192.168.120.1    192.168.120.3      2 <-- VPN

Ха-ха. Нет метрики ниже 20 здесь, кажется.

Я не знаю, правильно ли я понял, но сначала я уточню свое понимание:

У вас есть локальная локальная сеть (например, 10.0.0.0/16, и удаленный сервер Cisco VPN (например, 64.0.0.0/16). Вы хотите подключиться к серверу VPN через клиент Cisco VPN, и все же вам нужно чтобы иметь доступ к локальной сети. В этом случае вы хотите отделить все 10.0.xx/16 от VPN-подключения). В клиенте Mac должен быть добавлен следующий маршрут:

/sbin/route add -net 10.0 -interface en1

где en1 - интерфейс, через который вы подключены к локальной сети. Я знаю, что вы можете добавить то же самое в Windows и Linux.

Попробуйте удалить эти записи с шлюзом 10.64.202.13 посмотри пинг 8.8.8.8 работы, затем добавьте их один за другим и определите, кто из них вызывает проблемы.

Как вы исправили DLL. Я даже не могу изменить таблицу маршрутизации, потому что она продолжает добавлять 0.0.0.0 с VPN-шлюзом назад.

У меня есть довольно специфический обходной путь для конкретного случая использования, связанный с обходом этого ограничения локальной сети: использование прокси-сервера Cisco на другом устройстве, которое по какой-либо причине не может его использовать. В моем случае этим устройством был мой телефон. Обычно это было бы достаточно просто: запустить прокси на моем компьютере и подключиться к нему на моем телефоне. Но, конечно, это не будет работать по локальной сети.

Поэтому я создал этот инструмент: demuxpipe , который использует тот факт, что запуск AnyConnect не разрывает существующие LAN-соединения. Для его использования требуется еще один компьютер, помимо того, на котором есть VPN.

Чтобы использовать его таким образом:

  1. Убедитесь, что ваш VPN отключен
  2. Запустите прокси-сервер localhost, используя что угодно. Моим любимым инструментом был tinyproxy со следующей конфигурацией:
      Port 8888
Listen 127.0.0.1
Timeout 600
  1. Бегатьdemuxpipe demux -l <local port> -w <local proxy port>
  2. Бегатьdemuxpipe mux -l <proxy port> -w <demux port> -b <port you want to send data from>
  3. Подключитесь к с вашего устройства
  4. Включите VPN. Теперь вы подключены!

Для меня точные команды были:

      # on vpn computer (192.168.2.7)
tinyproxy -d -c tinyproxy.conf
demuxpipe demux -l :8889 -w :8888

# on non vpn computer (192.168.2.11)
demuxpipe mux -l :8888 -w 192.168.2.7:8889 -b :9999

# connect on device to: 192.168.2.11:8888
# turn on VPN
Другие вопросы по тегам