При разработке приложения вы разворачиваете промежуточные версии на контуре внутри своей компании. Но у вашего заказчика может быть свой контур за VPN. Это усложняет CI CD.
Сегодня мы разберемся, как подключиться к Cisco VPN используя openconnect.
Openconnect
Причиной для разработки 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;
- Каждые n секунд проверяет, подключен ли он;
- Подключается к 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
Например, в моей системе выполнение приведенного выше дает:
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