Что такое 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.