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

· 3 минуты на чтение
Подключение к Cisco VPN с Linux Openconnect CLI

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

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

Спонсор поста

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 <YOR_VPN_IP>
Использование прокси

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

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

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

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

sudo kill all -SIGINT openconnect

Перезапись resolv.conf

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

Рандомный блок

Непрерывное подключение к Cisco AnyConnect VPN

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

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

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

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

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

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

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

sudo nano ~/vpn.sh
Не забудьте заменить переменные в строке 15 на свои.
#!/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

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

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  --passwd-on-stdin vpn.example.com
root     28445  0.0  0.6 101864 13148 ?        S    21:15   0:00 openconnect -u  --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
Struchkov Mark
Struchkov Mark
Задавайте вопросы, если что-то осталось не понятным👇