понедельник, 16 апреля 2018 г.

annyconnect on ubuntu

Вообще говоря с гуем было бы куда проще. Но у нас server-side решение, по этому будем плакать и колоться.
Что бы потом можно было не подглядывая в шпоры делать sudo service vpn2work start

По мотивам заметок https://askubuntu.com/a/7617 ставим зависимости `sudo apt-get install vpnc network-manager-openconnect network-manager-vpnc vpnc-scripts`
и потом запустить `sudo openconnect https://vpn.my-corp-name.ru` и прописать что то такое
vpn.my-corp-name.ru
group: RemoteVPN
user: corp-user@rcom.local
password: hardpass

Если у вас все зевелось с пол пинка, то вам повезло.

openconnect routes trouble


Если не завелось и у вас отваливается даже ssh соединение - битек-вилы.
С огромной долей вероятности с vpn-сервера вы стягиваете новые роуты и затираете ими старые. Ну а как можно обратиться к виртуалке, если она не знает айпишник gateway'я и ли покрутить вам какую-нибудь веб-приложку? Да ни как.
Но отчаяние проходит, если начать гуглить `openconnect split routing`. По запросу достаточно теории, но как вы помните, мы ставили `vpnc-scripts` , которые положили в `ls -la /usr/share/vpnc-scripts/` Более того, на сайте есть отсылка на исхода. Если у вас творится непонятная херня, вам пригодится любая информация, почитайте на досуге.

И среди них есть интересный  момент и запрос уже надо составлять так `openconnect CISCO_SPLIT_INC` в зависимости от натренированности вашего гугл-профиля на технические изыскания вы рано или поздно придете на форум bsd'шников . Там чувачок посмотрел что уже украдено до нас еще в далеком 2009 году и решил повторить решение с враппером. Оно одно из самых адекватных.

как это говно должно работать - теория


Вы сначала узнаете ip ресурсов, которые вам нужны.
Потом прописываете их в враппере.
Враппер вы пинаете спец командой для авторизации используя хост, пользовательскую группу, имя пользака ну и пароль.
Враппер передает их стародавним скриптам соединения и вытягивает только необходимые роуты.
У вас поднимается соединение с сохранением текущего gw и нового gw для вычисления необходимого ip, к которому вы хотите обращаться по ту сторону туннеля. Ну тоесть без целевого ip вы нихрена не сможете.
Это волшебно, но придется поебаться. Добрая фея в отпуске, остались только зарисовки на салфетке от freebsd'шников и своя логика.

проба пера


вот тут ебаный пиздец, держитесь ребзя. На данном моменте у меня пригорало чуть пониже спины, по этому выложу финальный вариант реализации под ubuntu server.
Создаем новый файл `sudo vim /usr/share/vpnc-scripts/vpnc-script-corp-split` со следующим содержимым

#!/bin/sh

# Add one IP to the list of split tunnel
add_ip ()
{
    export CISCO_SPLIT_INC_${CISCO_SPLIT_INC}_ADDR=$1
    export CISCO_SPLIT_INC_${CISCO_SPLIT_INC}_MASK=255.255.255.255
    export CISCO_SPLIT_INC_${CISCO_SPLIT_INC}_MASKLEN=32
    export CISCO_SPLIT_INC=$(($CISCO_SPLIT_INC + 1))
}

# Initialize empty split tunnel list
export CISCO_SPLIT_INC=0

# Delete DNS info provided by VPN server to use internet DNS
# Comment following line to use DNS beyond VPN tunnel
unset INTERNAL_IP4_DNS

# List of IPs beyond VPN tunnel
add_ip 10.61.0.96 # dev stage
add_ip 10.61.0.97 # preprod stage
add_ip 10.60.0.145 # prod 

# Execute default script
. /usr/share/vpnc-scripts/vpnc-script
и делаем из него исполняемый файл `sudo chmod r+x /usr/share/vpnc-scripts/vpnc-script-corp-split`


Теперь делаем пользовательский скрипт, который будет пинать враппер `vim ~/vpn_to_work.sh` со следующим содержимым
#!/bin/sh
sudo openconnect --user=corp-user@rcom.local \
    --authgroup=RemoteVPN --script=/usr/share/vpnc-scripts/vpnc-script-corp-split\
    vpn.my-corp-name.ru

целевое решение


для начала сделаем конфиг `sudo vim /etc/vpnc/work.conf` для подключения
# connection parameters to my-corp-name
user=corp-user@rcom.local
authgroup=RemoteVPN
script=/usr/share/vpnc-scripts/vpnc-script-corp-split
no-dtls
no-cert-check
passwd-on-stdin

что бы использовать командой `sudo vim /etc/vpnc/vpn2work.sh` с содержимым
#!/bin/sh
VPN_CONFIG="/etc/vpnc/work.conf"
VPN_HOST="https://vpn.my-corp-name.ru"
VPN_PASS='myhardpass'
PID="/var/run/openconnect.pid"
TEMP_LOG="/tmp/status.txt"
echo ${VPN_PASS} | openconnect --config=${VPN_CONFIG}\
    ${VPN_HOST} &> $TEMP_LOG 2>&1
если заработало, то поехали дальше

сервис


можно сделать косо по мотивам https://github.com/jibla/ubuntu-openconnect-command
но не вышел аленький цветочек, потому что `Failed to start vpn.service: Unit vpn.service not found.` явно намекает, что не хватает systemd скрипта или еще чего то.
Можно было только `sudo /etc/init.d/vpn.sh stop` но я это все колхозил не для того, что бы помнить еще эти фигли.

По мотивам https://wiki.archlinux.org/index.php/Systemd_(Русский)
и https://discourse.osmc.tv/t/setting-openconnect-to-autoconnect-at-startup/8601/2
Делаем `sudo vim /etc/systemd/system/vpn2work.service` c потрохами
[Unit]
Description=Connect to my corporation VPN
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
Environment="password=hardpassword"
ExecStart=/bin/sh -c 'echo $password | sudo openconnect \
    -b --config=/etc/vpnc/work.conf https://vpn.my-corp-name.ru'
Restart=always

[Install]
WantedBy=multi-user.target

и прогоняем
sudo systemctl daemon-reload
sudo systemctl start vpn2work
sudo systemctl status vpn2work
кстати, изначально задуманная команда тоже будет работать `sudo service vpn2work start`