Как разрешить доступ локальной сети при подключении к 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? Где в сетевом стеке есть пакет?
Смотрите также
- Нет интернет-соединения с Cisco VPN
- Cisco VPN Client прерывает соединение с моим сервером LDAP
- Cisco VPN останавливает просмотр Windows 7
- Как я могу запретить создание маршрута в Windows XP при подключении к Cisco VPN?
- Перераспределение локальной сети и интернет-трафика в VPN
- VPN-клиент "Разрешить доступ к локальной сети"
- Разрешить локальный доступ к локальной сети для клиентов VPN в примере конфигурации концентратора VPN 3000
- Доступ к локальной сети пропал при подключении к VPN
- Документация Windows XP: Маршрут
Изменить: вещи, которые я еще не пробовал:
>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.
Сначала мы создаем файл
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; }
Затем скомпилируйте это так:
gcc -o libhack.so -shared -fPIC hack.c
устанавливать
libhack.so
в путь к библиотеке Cisco:sudo cp libhack.so /opt/cisco/anyconnect/lib/
Сбить агента:
/etc/init.d/vpnagentd stop
Убедитесь, что это действительно вниз
ps auxw | grep vpnagentd
Если не,
kill -9
просто чтобы убедиться.Затем исправьте /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
Теперь запустите агент:
/etc/init.d/vpnagentd start
Исправьте iptables, потому что AnyConnect портит их:
iptables-save | grep -v DROP | iptables-restore
Вы можете сделать что-то более продвинутое здесь, чтобы разрешить доступ только к определенным узлам локальной сети.
Теперь исправьте маршруты по своему усмотрению, например:
route add -net 192.168.1.0 netmask 255.255.255.0 dev wlan0
Проверьте, действительно ли они там:
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. См. также мой комментарий здесь .
Создать
~/.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
Сохраните его и закройте.
Затем запустите это:
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 .
Скриншоты и последовательность событий при подключении:
Когда я запускаю команду выше, происходит вот что:
открывает веб-страницу с надписью «Powered by Okta» (как указано внизу — см. снимок экрана ниже) и которая запрашивает мое имя пользователя и пароль для двухфакторной аутентификации Duo SSO (единый вход). Мое имя пользователя и пароль уже заполнены — возможно, потому, что я делал это раньше. В нем говорится: «Мы обнаружили некоторые ошибки. Пожалуйста, просмотрите форму и внесите исправления». Не обращайте внимания на эту ошибку. Я думаю, это просто потому, что имя пользователя и пароль были введены автоматически, и он их пока не обнаруживает. Чтобы он их обнаружил, мне просто нужно щелкнуть в поле имени пользователя мое уже введенное имя пользователя и Tabдважды нажать. В результате взаимодействия с полями ввода форма обнаруживает наличие моего имени пользователя и пароля. Затем он автоматически проверяет мое имя пользователя и пароль, поскольку они уже введены, а затем загружает новую веб-страницу.
На новой странице я проверяю, что мой правильный номер телефона или устройство выбран в поле «Устройство», затем нажимаю кнопку «Отправить мне push-уведомление», и на мой телефон отправляется push-запрос двухфакторной аутентификации Duo. Я аутентифицируюсь на своем телефоне в приложении Duo, после чего окно веб-страницы автоматически закрывается.
Обратите внимание: на скриншоте выше написано, что мое компьютерное программное обеспечение устарело просто потому, что оно хочет, чтобы я обновил свою версию браузера Chrome до последней. Если я не буду делать это хотя бы раз в 10 дней или около того, VPN-сервер не позволит мне войти в систему.
Затем в терминале печатается несколько заявлений о выходе из браузера (показано чуть ниже), затем он запрашивает мой пароль (также показан чуть ниже) для моего имени пользователя 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).
Успех! Теперь я полностью подключен к 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:
- Откройте клиент Cisco AnyConnect и щелкните вкладку «VPN». Это будет выглядеть так. Адрес вашего VPN-сервера указан в поле «Подключиться к».
- Нажмите кнопку «Подключиться», и в новом окне браузера откроется окно «Powered by Okta» «Duo SSO».
- Используйте этот адрес 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
Рекомендации
Вот большинство дополнительных ссылок, которые мне пришлось просмотреть, чтобы выяснить некоторые зависимости и связанную с ними информацию. выше.
- kb.rice.edu: VPN: openconnect VPN для Linux с использованием аутентификации Duohttps://kb.rice.edu/page.php?id=113148
- https://github.com/dlenski/openconnect/issues/116
- ***** Python 3.7.0 Нет модуля с именем «PyQt5.QtWebEngineWidgets».
- Нет модуля с именем _cffi_backend.
- https://github.com/Nike-Inc/gimme-aws-creds/issues/158
- https://bobbyhadz.com/blog/python-no-module-named-pyqt5
- [мой ответ] Как установить PyQt5 в Python3 и здесь
- ***** Ссылка openconnect-sso в самом верху этой темы — это то, как я впервые узнал об openconnect-sso!:
- [мои вопросы и ответы] Отключите VPN для определенных локальных устройств, таких как встроенная плата Linux, к которой мне нужно подключиться по SSH (Разрешить локальный (LAN) доступ при использовании VPN)
- [мой ответ] Как правильно выключить?Как правильно закрыть openconnect?Как правильно выключить?
- https://github.com/vlaci/openconnect-sso
- Все проблемы, которые я открывал: https://github.com/vlaci/openconnect-sso/issues?q=is%3Aissue+author%3AElectricRCAircraftGuy+
- [моя проблема] невероятно сложна из-за некоторых простых проблем с зависимостямиModuleNotFoundError: нет модуля с именем «PyQt5» [решено; пожалуйста, обновите инструкции по установке, добавив эту информацию]
- https://github.com/dlenski/openconnect/issues/143
- https://gitlab.com/openconnect/openconnect/-/issues/84https://gitlab.com/openconnect/openconnect/-/issues/84https://gitlab.com/openconnect/openconnect/-/issues/84
- Поиск в Google по запросу «открытое соединение с двухфакторной аутентификацией Duo».
- ***** Поиск в Google
"openconnect" with duo two factor authentication and "okta"
- https://www.reddit.com/r/archlinux/comments/8wclaz/openconnect_and_two_factor_auth/
- https://duo.com/docs/okta
- [мой ответ] Cisco Anyconnect не работает в Ubuntu 18.04 с двухфакторной аутентификацией
- чиновник
openconnect
репо - я думаю!: https://gitlab.com/openconnect/openconnect - https://docs.python-guide.org/starting/install3/linux/
- Имеете дело с несколькими версиями Python и PIP?
- ***** https://github.com/vlaci/openconnect-sso/issues/81 — помогло исправить некоторые ошибки/проблемы при запуске.
openconnect-sso
в Убунту 22.04
Смотрите также
Моя компания до сих пор использует этот 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.
Чтобы использовать его таким образом:
- Убедитесь, что ваш VPN отключен
- Запустите прокси-сервер localhost, используя что угодно. Моим любимым инструментом был tinyproxy со следующей конфигурацией:
Port 8888
Listen 127.0.0.1
Timeout 600
- Бегать
demuxpipe demux -l <local port> -w <local proxy port>
- Бегать
demuxpipe mux -l <proxy port> -w <demux port> -b <port you want to send data from>
- Подключитесь к с вашего устройства
- Включите 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