Настройка OpenConnect VPN сервера: полное руководство с Let's Encrypt

Пошаговая инструкция по установке и настройке OpenConnect (ocserv) на Linux. Включает выпуск SSL-сертификата Let's Encrypt, создание пользователей, настройку сети и брандмауэра.

Что такое OpenConnect и зачем он нужен

OpenConnect (ocserv) — это сервер SSL VPN с открытым исходным кодом, совместимый с протоколом Cisco AnyConnect. Он позволяет организовать удалённый доступ к корпоративной сети или безопасный выход в интернет, маскируя трафик под обычный HTTPS. Это делает его незаметным для большинства межсетевых экранов и прокси-серверов.

В отличие от классических IPSec VPN, SSL VPN не требует сложной настройки клиентского ПО и работает через стандартный порт 443. OpenConnect поддерживает шифрование TLS 1.2/1.3, аутентификацию по паролю, сертификатам и двухфакторную аутентификацию. Он подходит как для отдельных пользователей, так и для организаций, которым нужно гибкое управление доступом.

Подготовка сервера: системные требования и предварительные шаги

Перед установкой убедитесь, что ваш сервер соответствует минимальным требованиям:

  • Операционная система: Debian 11/12, Ubuntu 20.04/22.04/24.04 или любой современный дистрибутив Linux.
  • Права root или пользователя с доступом к sudo.
  • Доменное имя, направленное на IP-адрес сервера (например, vpn.example.com).
  • Открытые порты 443 TCP и UDP.

Первым делом обновите систему:

sudo apt update && sudo apt upgrade -y

Затем включите пересылку IP-пакетов. Отредактируйте файл /etc/sysctl.conf или создайте отдельный файл в /etc/sysctl.d/:

net.ipv4.ip_forward = 1

Примените настройки:

sudo sysctl -p

Настройте синхронизацию времени через NTP. Откройте /etc/systemd/timesyncd.conf и укажите серверы:

NTP=0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org

Перезапустите службу:

sudo systemctl restart systemd-timesyncd

Проверьте статус командой timedatectl.

Установка OpenConnect VPN сервера (ocserv)

В большинстве дистрибутивов ocserv доступен в стандартных репозиториях. Установите его вместе с certbot для работы с Let's Encrypt:

sudo apt install ocserv certbot -y

Если вам нужна новейшая версия с функцией camouflage (маскировка трафика), возможно, потребуется подключить тестовый репозиторий или скомпилировать из исходников. Для обычных сценариев версии из репозитория достаточно.

После установки проверьте статус службы:

sudo systemctl status ocserv

Если автозагрузка не включена, добавьте её:

sudo systemctl enable ocserv

Сделайте резервную копию исходного конфигурационного файла:

sudo cp /etc/ocserv/ocserv.conf /etc/ocserv/ocserv.conf.bak

Получение SSL-сертификата от Let's Encrypt

Для шифрования соединений используйте бесплатные сертификаты Let's Encrypt. Они выдаются на 90 дней и автоматически обновляются.

Выполните команду, заменив vpn.example.com на ваше доменное имя:

sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email your@email.com -d vpn.example.com

Убедитесь, что порт 80 TCP открыт, так как certbot использует его для проверки домена. После успешного получения сертификаты будут сохранены в /etc/letsencrypt/live/vpn.example.com/.

Настройте автоматическое обновление сертификатов. Certbot обычно добавляет задачу в cron, но для перезапуска ocserv после обновления добавьте в файл /etc/letsencrypt/renewal/vpn.example.com.conf строку:

post_hook = systemctl restart ocserv

Если вы предпочитаете самоподписанные сертификаты, можно создать их с помощью certtool из пакета gnutls-bin. Однако для клиентов, не доверяющих вашему CA, потребуется вручную установить корневой сертификат.

Настройка конфигурационного файла ocserv

Основной файл конфигурации — /etc/ocserv/ocserv.conf. Отредактируйте его, указав пути к сертификатам:

server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pem
server-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem

Если используете самоподписанные сертификаты, укажите:

server-cert = /etc/ocserv/server.pem
server-key = /etc/ocserv/server.key
ca-cert = /etc/ocserv/ca.pem

Настройте аутентификацию. Для хранения паролей в файле используйте:

auth = "plain[passwd=/etc/ocserv/ocpasswd]"

Закомментируйте строку auth = "pam", если она активна.

Задайте параметры сети:

ipv4-network = 10.30.1.0/24
dns = 8.8.8.8
dns = 8.8.4.4

Ограничьте количество подключений:

max-clients = 16
max-same-clients = 2

Настройте защиту от подбора паролей:

max-ban-score = 80
ban-reset-time = 300
ban-points-wrong-password = 10
ban-points-connection = 1

Укажите приоритет шифрования, отключив устаревшие протоколы:

tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-ALL:+VERS-TLS1.2:-ARCFOUR-128"

Создание пользователей и управление доступом

Создайте файл для хранения учётных записей:

sudo touch /etc/ocserv/ocpasswd
sudo chmod 600 /etc/ocserv/ocpasswd

Добавьте пользователя:

sudo ocpasswd -c /etc/ocserv/ocpasswd username

Система запросит пароль. Пользователи могут подключаться одновременно, если это не запрещено параметром max-same-clients.

Для более сложных сценариев можно настроить аутентификацию через PAM, LDAP или Kerberos. В таком случае измените строку auth на:

auth = "pam"

и настройте соответствующие модули.

Также поддерживается двухфакторная аутентификация (2FA) через OATH или RADIUS.

Настройка сети, маршрутизации и брандмауэра

После настройки ocserv необходимо разрешить пересылку трафика и настроить NAT, если VPN-сервер используется для выхода в интернет.

Добавьте правило iptables:

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Для nftables:

nft add table nat
nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule nat postrouting oifname "eth0" masquerade

Если используете UFW, откройте порты:

sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo ufw reload

Для раздельной маршрутизации (split-tunneling) укажите в конфигурации:

route = 192.168.10.0/255.255.255.0
route = 192.168.11.0/255.255.255.0
no-route = 192.168.1.0/255.255.255.0

Если нужно направлять все DNS-запросы через VPN, включите:

tunnel-all-dns = true

Запуск службы и подключение клиентов

После всех настроек перезапустите ocserv:

sudo systemctl restart ocserv

Проверьте статус:

sudo systemctl status ocserv

Для подключения используйте клиент OpenConnect (Linux, Windows, macOS) или Cisco AnyConnect (Windows, macOS, Android, iOS).

Пример подключения из командной строки Linux:

sudo openconnect vpn.example.com

Введите имя пользователя и пароль.

На мобильных устройствах установите приложение OpenConnect или AnyConnect и укажите адрес сервера.

Если подключение не устанавливается, проверьте логи:

sudo journalctl -u ocserv -f

Дополнительные возможности: производительность и безопасность

Для повышения производительности можно включить алгоритм управления перегрузкой TCP BBR. Добавьте в /etc/sysctl.d/99-xtune.conf:

net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

Примените настройки:

sudo sysctl -p /etc/sysctl.d/99-xtune.conf

Отключите IPv6, если он не используется:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Для дополнительной безопасности настройте изоляцию рабочих процессов:

isolate-workers = true

Используйте occtl для мониторинга активных подключений:

sudo occtl show users

Регулярно обновляйте сертификаты и следите за логами на предмет подозрительной активности.

Вопросы и ответы

Чем OpenConnect отличается от OpenVPN?

OpenConnect использует протокол SSL/TLS и совместим с Cisco AnyConnect, что позволяет ему маскироваться под HTTPS-трафик. OpenVPN использует собственный протокол на основе OpenSSL и часто требует отдельного порта. OpenConnect проще проходит через строгие брандмауэры и прокси.

Можно ли использовать самоподписанные сертификаты вместо Let's Encrypt?

Да, можно. Самоподписанные сертификаты обеспечивают такой же уровень шифрования, но клиенты будут выдавать предупреждение о недоверенном сертификате. Чтобы избежать этого, нужно установить корневой сертификат вашего CA на каждом клиенте.

Как добавить нового пользователя в OpenConnect?

Используйте команду sudo ocpasswd -c /etc/ocserv/ocpasswd username. Она запросит пароль и добавит запись в файл. Убедитесь, что в конфигурации указана аутентификация через plain[passwd=...].

Почему клиент не может подключиться к серверу?

Возможные причины: не открыт порт 443 (TCP/UDP) в брандмауэре, не настроена пересылка IP, неверно указаны пути к сертификатам, или домен не направлен на IP сервера. Проверьте логи journalctl -u ocserv -f для диагностики.

Как настроить split-tunneling в OpenConnect?

В файле конфигурации укажите маршруты, которые должны идти через VPN, с помощью параметра route. Например: route = 192.168.10.0/255.255.255.0. Для исключения подсетей используйте no-route.

Как автоматически обновлять сертификаты Let's Encrypt?

Certbot добавляет задачу в cron. Убедитесь, что в файле /etc/letsencrypt/renewal/вашдомен.conf есть строка post_hook = systemctl restart ocserv. Проверить задачу можно командой sudo crontab -l.

Поддерживает ли OpenConnect двухфакторную аутентификацию?

Да, ocserv поддерживает 2FA через RADIUS, OATH или комбинацию нескольких методов аутентификации. Для настройки потребуется указать несколько источников в параметре auth.