, последнее обновление:

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