Пилим гейт в рабочую VPN с помощью OpenConnect
OpenConnect - это клиент для Cisco AnyConnect, который позволяет использовать оный на *NIX/macOS. В этой инструкции я опишу как поднимал гейт в рабочую сетку на своем сервере, чтобы не засорять систему официальным цисковым клиентом и отвязаться от имплементации оного для каждой ОС.
Подготовка
Надо установить (или убедиться, что уже стоит):
- iproute2 - для поднятия tun0 с помощью утилиты ip.
- openconnect - сам клиент Cisco AnyConnect.
- resolvconf - для использования DNS серверов из VPN. Внимание: с LXC контейнерами в Proxmox resolvconf работать не будет, DNS из VPN на виртуалке использоваться не будут!
Настройка
Скрипт для отмены замены системных настроек DNS
Если вы запускаете это в виртуалке - смена DNS вам определенно не нужна, так как вы почти наверняка не будете заходить с нее куда-то по внутренним доменам, а проблем добавить оно может - начиная от отсутствия ресолва нужных доменов вроде репозиториев Debian и кончая тупой утечкой. Поэтому сохраняем следующее в /opt/vpn-script.sh
:
#!/bin/sh
#
#
export INTERNAL_IP4_DNS=
. /usr/share/vpnc-scripts/vpnc-script
Этот скрипт надо сделать исполняемым:
chmod +x /opt/vpn-script.sh
Скрипт запуска
Закидываем следующее в /opt/vpn.sh
:
#!/bin/sh
VPNURL=https://URL
VPNGRP=GROUP
VPNUSER=USER
VPNPASS=PASS
if [ $USER != "root" ]
then
echo "Must be run as root."
exit
fi
ip tuntap add mode tun dev tun0
ip link set dev tun0 up
echo $VPNPASS | openconnect $VPNURL --user=$VPNUSER --authgroup=$VPNGRP --interface=tun0 --passwd-on-stdin --pid-file=/opt/openconnect.pid --script=/opt/vpn-script.sh
ip link set dev tun0 down
ip tuntap remove mode tun dev tun0
Поменяйте значения VPN*
переменных в начале скрипта на ваши. Возможно, VPNGRP
можно опустить (и удалить параметр из строки запуска openconnect).
На всякий пожарный дайте права на исполнение:
chmod +x /opt/vpn.sh
Если вам необходимо использовать DNS сервера, предоставляемые компанией или VPN провайдером, удалите параметр –script
из строки запуска!
Systemd
Закидываем в /etc/systemd/system/vpn.service
следующее:
[Unit]
Description=vpn
After=network.target
[Service]
User=root
Restart=always
ExecStart=/opt/vpn.sh
PIDFile=/opt/openconnect.pid
[Install]
WantedBy=multi-user.target
Перезагружаем сервисы:
systemctl daemon-reload
Стартуем:
systemctl start vpn
Что дальше?
- Проверьте, что маршрутизация работает, попинговав какой-то хост или сделав запрос
curl
‘ом. - Настроить маршрутизацию для ваших устройств на основном роутере. **Не забудьте закрыть доступ всем, кроме вас самих, иначе вас поимеет служба безопасности. Получить маршруты можно вот так:
ip r | grep tun0 | awk {' print $1 '}
FAQ
Вопрос | Ответ |
---|---|
Почему скрипт должен исполняться от рута? | Потому что openconnect вносит изменения в таблицу маршрутизации, для чего необходимы права суперпользователя. |