Содержание

Подключение к Cisco VPN с Linux Openconnect CLI

Oбновлена 2021-01-29: Добавил информацию о непрерывном подключении к VPN

При разработке приложения вы разворачиваете промежуточные версии на контуре внутри своей компании. Но у вашего заказчика может быть свой контур за VPN. Это усложняет CI CD.

Как настроить CI/CD в GitLab, я рассказывал в другой статье.

Сегодня мы разберемся, как подключиться к Cisco VPN используя openconnect.

OpenConnect – это открытое приложение для подключения к виртуальным частным сетям с реализацией подключений точка-точка, которое изначально было написано в качестве замены проприетарного клиента Cisco AnyConnect SSL VPN.

Причиной для разработки OpenConnect послужила серия недостатков, обнаруженных в решении Cisco под Linux:

  • отсутствие поддержки архитектур отличных от i386 (для платформ Linux)
  • отсутствие интеграции с NetworkManager
  • отсутствие грамотной поддержки форматов пакетов RPM и DEB
  • невозможность работы в качестве непривилегированного пользователя
  • закрытость кода и др.

По какой-то причине у меня не получилось настроить соединение через AnyConnect, зато получилось через openconnect 😄

Также вам может понадобиться vpn-slice, который есть только для openconnect. Речь о vpn-slice пойдет дальше.

Все манипуляции проводятся на CentOS 7. Для начала устанавливаем openconnect.

sudo apt-get update
sudo apt-get install openconnect

После этого вы уже можете подключиться к vpn

sudo openconnect -u user_name --passwd-on-stdin -b 389.143.64.220

Часто в корпоративных организациях используется прокси, тогда поможет флаг -P. При этом флаг -b после успешного соединения убирает его в фон, чтобы вы могли продолжать пользоваться сервером.

sudo openconnect -u user_name -P <YOU_PROXY_ADDRES> --passwd-on-stdin -b 389.143.64.220

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

Для отключения от VPN используйте эту команду:

sudo kill all -SIGINT openconnect

Ваш файл /etc/resolv.conf будет перезаписан. Из-за этого мы потеряли доступ к сети и выход в интернет.

Эту проблему решает библиотека vpn-slice. Установить ее проще всего через pip3.

Вы должны установить vpn-slice как root, потому что openconnect или vpnc должны будут иметь возможность вызывать vpn-slice во время работы как root. Например для изменения /etc/hosts
sudo pip3 install https://github.com/dlenski/vpn-slice/archive/master.zip
sudo ln -s /usr/local/bin/vpn-slice /usr/bin/vpn-slice

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

sudo openconnect -u user_name -P <YOU_PROXY> -s "vpn-slice -v --dump 21.16.41.48 21.16.41.49" --passwd-on-stdin -b 298.138.32.210
  • 21.16.41.48 – ip нужного вам сервера за vpn.
  • 21.16.41.49 – второй нужный вам сервер.

Таким образом мы подключились к VPN, и получили доступ только не обходимым нам серверам.

Мне нужно было поддерживать почти непрерывное VPN-соединение с сервером с другого сервера. Сервер 1 был частью сети, которая обеспечивала защищенный доступ VPN к внешним соединениям через Cisco Anyconnect.

Для этого я использую OpenConnect для подключения к серверу и сценарий bash для непрерывной проверки соединения и, если он отключен, для повторного подключения.

Обратите внимание, что в приведенном ниже подходе пароль vpn хранится в виде открытого текста в файле sh, что представляет потенциальную угрозу безопасности. Сценарий должен быть заблокирован, чтобы пользователи без авторизации не могли просматривать его содержимое.

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

Создадим скрипт, который:

  1. Подключится к VPN;
  2. Каждые n секунд проверяет, подключен ли он
  3. Подключается к VPN, если соединение прервано

В приведенном ниже примере мы создадим сценарий vpn.sh.

sudo nano ~/vpn.sh
#!/bin/bash
 
OPENCONNECT_PID=""
RUNNING=""
 
function checkOpenconnect {
    ps -p $OPENCONNECT_PID &> /dev/null
    RUNNING=$?
 
    #echo $RUNNING &>> reconnect.log
}
 
function startOpenConnect {
    # start here open connect with your params and grab its pid
    echo "<PASSWORD_USER>" | sudo openconnect -P <PROXY> -u <USERNAME> --authgroup <USER_AUTH_GROUP> --passwd-on-stdin --servercert pin-sha256:<SERT_SERVER> --script 'vpn-slice -v --dump <IP_SERVER_TWO>' <VPN_IP> & OPENCONNECT_PID=$!
}
 
startOpenConnect
 
while true
do
    # sleep a bit of time
    sleep 15
    checkOpenconnect
    [ $RUNNING -ne 0 ] && startOpenConnect
done
Используйте свою команду sudo openconnect для подключения. Выше приведена команда для примера, возможно она вам не подойдет.

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

sudo chown root:root vpn.sh
sudo chmod 711 vpn.sh
Запуск скрипта в фоновом режиме.

Как только вы отладите свой скрипт, вы можете запустить его как фоновый скрипт:

cd ~/
sudo ./vpn.sh &

Остановка фонового скрипта.
Используйте ps, чтобы найти PID сценария VPN и процесса openconnect:

sudo ps -aux | grep vpn

Например, в моей системе выполнение приведенного выше дает:

user:~$ sudo ps -aux | grep vpn
root     10524  0.0  0.1  51420  2108 ?        S    Mar05   0:00 sudo ./vpn.sh
root     10525  0.0  0.1  11524  2836 ?        S    Mar05   0:26 /bin/bash ./vpn.sh
root     28443  0.0  0.1  51420  3912 ?        S    21:15   0:00 sudo openconnect -u <USER> --passwd-on-stdin vpn.example.com
root     28445  0.0  0.6 101864 13148 ?        S    21:15   0:00 openconnect -u <USER> --passwd-on-stdin vpn.example.com
ubuntu   29396  0.0  0.0  12944  1084 pts/1    S+   22:14   0:00 grep --color=auto vpn

Я бы убил PID 10525 и 28445, вот так:

sudo kill 10525 28445

Комментарии