Установка OpenConnect VPN (ocserv) на Ubuntu 22.04
- Руководство по установке и настройке OpenConnect (ocserv) на Ubuntu 22.04: настройка брандмауэра, сборка ocserv из исходников, получение TLS-сертификата через Certbot, конфигурация сервера, маршрутизация и автоперезапуск клиента.
- В статье также есть разделы по обеспечению безопасности, отладке типичных ошибок, чек-листы для ролей и тестовым критериям приёмки.

OpenConnect VPN, известный как ocserv, — это бесплатное open-source решение VPN с возможностями уровня предприятия. Он основан на протоколе Cisco AnyConnect, широко используемом в корпоративной среде. В этом руководстве вы узнаете, как установить сервер OpenConnect на Ubuntu 22.04 и как подключаться к нему с помощью клиента OpenConnect.
Предварительные требования
- Сервер с Ubuntu 22.04.
- Ненепользователь root с правами sudo.
- Полное доменное имя (FQDN), например
vpn.example.com. - Обновите систему:
$ sudo apt update
$ sudo apt upgrade- Установите базовые пакеты (некоторые могут уже быть установлены):
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -yПримечание: в командах ниже сохраняются исходные команды без изменений; при копировании замените vpn.example.com и username на свои значения.
Шаг 1 — Настройка брандмауэра (ufw)
Ubuntu по умолчанию предоставляет ufw (Uncomplicated Firewall). Проверьте статус:
$ sudo ufw statusЕсли статус “inactive”, разрешите SSH и HTTP/HTTPS, чтобы не потерять доступ при включении:
$ sudo ufw allow OpenSSH
$ sudo ufw allow http
$ sudo ufw allow httpsВключите ufw:
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupПроверьте статус снова:
$ sudo ufw statusОжидаемый результат:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)Важно: сохраняйте доступ по SSH при изменении правил.
Шаг 2 — Установка Git
Если вам нужно клонировать исходники ocserv, установите git:
$ sudo apt install git -yШаг 3 — Установка OpenConnect (ocserv)
Ubuntu 22.04 поставляется со старой версией ocserv (например, 1.1.3). Если вас устраивает версия репозитория, достаточно:
$ sudo apt install ocservВ этом руководстве мы собираем свежую версию (например, 1.1.6) из исходников.
Установите зависимости сборки:
$ sudo apt install -y libgnutls28-dev libev-dev libpam0g-dev liblz4-dev libseccomp-dev \
libreadline-dev libnl-route-3-dev libkrb5-dev libradcli-dev \
libcurl4-gnutls-dev libcjose-dev libjansson-dev libprotobuf-c-dev \
libtalloc-dev libhttp-parser-dev protobuf-c-compiler gperf \
nuttcp lcov libuid-wrapper libpam-wrapper libnss-wrapper \
libsocket-wrapper gss-ntlmssp haproxy iputils-ping freeradius \
gawk gnutls-bin iproute2 yajl-tools tcpdump autoconf automakeКлонируйте репозиторий ocserv и соберите:
$ git clone https://gitlab.com/openconnect/ocserv.git
$ cd ocserv
$ autoreconf -fvi
$ ./configure && make
$ sudo make installФайлы установятся в /usr/local/bin и /usr/local/sbin. Скопируйте systemd unit файл:
$ sudo cp doc/systemd/standalone/ocserv.service /etc/systemd/system/ocserv.serviceОтредактируйте файл сервиса, чтобы указать путь к бинарнику ocserv (если вы собрали из исходников):
$ sudo nano /etc/systemd/system/ocserv.serviceЗамените строку ExecStart на:
$ ExecStart=/usr/local/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.confСохраните и выполните:
$ sudo systemctl daemon-reloadШаг 4 — Генерация SSL-сертификатов (Certbot)
Для защищённого соединения вам нужен TLS-сертификат. Мы используем certbot через snapd (актуальная версия).
Убедитесь, что snapd обновлён:
$ sudo snap install core && sudo snap refresh core
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbotВариант A — standalone (если на сервере нет веб-сервера):
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d vpn.example.comСертификаты будут находиться в /etc/letsencrypt/live/vpn.example.com.
Вариант B — Nginx/Apache (если веб-сервер работает):
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d vpn.example.comили
$ sudo certbot certonly --apache --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d vpn.example.comВариант C — webroot (если используете другой веб-сервер):
$ sudo mkdir -p /var/www/ocserv
$ sudo chown www-data:www-data /var/www/ocserv -RНастройте ваш веб-сервер, чтобы vpn.example.com обслуживал директорию /var/www/ocserv, затем:
$ sudo certbot certonly --webroot --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d vpn.example.comПроверьте планировщик обновления сертификатов:
$ sudo systemctl list-timersИ выполните проверку продления в dry-run:
$ sudo certbot renew --dry-runВажно: snap.certbot.renew.timer обычно добавляется автоматически. Убедитесь, что процесс обновления работает и уведомления доступны на почте администратора.
Шаг 5 — Конфигурация OpenConnect
Если вы ставили ocserv из APT, конфиг обычно уже есть в /etc/ocserv/ocserv.conf. Если собирали из исходников, скопируйте пример и отредактируйте:
$ sudo mkdir /etc/ocserv
$ sudo cp /home/username/ocserv/doc/sample.config /etc/ocserv/ocserv.conf
$ sudo nano /etc/ocserv/ocserv.confКлючевые правки конфигурации:
- Аутентификация пользователей через отдельный файл паролей:
auth = "plain[passwd=/etc/ocserv/ocpasswd]"- Используем TCP-порт (по умолчанию 443). Отключите UDP, если не используете DTLS:
tcp-port = 443
#udp-port = 443Если порт 443 занят веб-сервером, замените на другой, напр., 8443:
tcp-port = 8443- Пути к сертификату и ключу:
server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pem
server-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem- Лимиты клиентов:
max-clients = 16
max-same-clients = 2Установите 0 для неограниченного значения, но обычно лучше ограничивать количество.
- Настройки надежности соединения и MTU:
keepalive = 60
try-mtu-discovery = true- Таймауты простоя (оставьте закомментированными для неограниченного времени):
idle-timeout=1200
mobile-idle-timeout=1800- Домен по умолчанию и подсеть VPN (избегайте конфликтов с локальными подсетями):
default-domain = vpn.example.com
ipv4-network = 10.10.10.0- Принудительная пересылка DNS через VPN:
tunnel-all-dns = true
dns = 8.8.8.8
dns = 8.8.4.4- По умолчанию в примере часто присутствуют маршруты. Если хотите, закомментируйте все
route = ...или настраивайте под нужды вашей сети:
#route = 10.10.10.0/255.255.255.0
#route = 192.168.0.0/255.255.0.0
#route = fef4:db8:1000:1001::/64
#route = defaultСохраните файл.
Шаг 6 — Запуск OpenConnect Server
Запустите сервис и проверьте статус:
$ sudo systemctl start ocserv
$ sudo systemctl status ocservОжидаемый вывод содержит строки о прослушивании TCP на порту 443. Ошибки вроде error connecting to sec-mod socket '/var/run/ocserv-socket.*': No such file or directory обычно нормальны — сокет будет создан при старте.
Шаг 7 — Создание VPN-аккаунтов
Для управления локальными пользователями используйте ocpasswd:
$ sudo ocpasswd -c /etc/ocserv/ocpasswd username
Enter password:
Re-enter password:Файл /etc/ocserv/ocpasswd хранит учётные записи. Чтобы изменить пароль — повторите команду для пользователя.
Для интеграции с LDAP/RADIUS используются дополнительные модули — это описано в документации ocserv.
Шаг 8 — Включение IP Forwarding и ядра
Чтобы сервер маршрутизировал трафик клиентов в Интернет, включите IP forwarding и (опционально) BBR для улучшения TCP.
$ echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/60-custom.conf
$ echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.d/60-custom.conf
$ echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.d/60-custom.conf
$ sudo sysctl -p /etc/sysctl.d/60-custom.confПроверьте, что параметры применены: sysctl net.ipv4.ip_forward и sysctl net.ipv4.tcp_congestion_control.
Шаг 9 — Настройка IP маскарадинга (NAT) в ufw
Найдите имя основного сетевого интерфейса:
$ ip addrВ примере интерфейс называется enp1s0. Добавьте NAT-правило в /etc/ufw/before.rules:
$ sudo nano /etc/ufw/before.rulesДобавьте в конец файла (замените enp1s0 на ваше имя интерфейса):
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.10.10.0/24 -o enp1s0 -j MASQUERADE
# End each table with the 'COMMIT' line or these rules won't be processed
COMMITНайдите секцию с обработкой FORWARD/icmp и добавьте разрешения для VPN-подсети:
# ok icmp code for FORWARD
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT
# allow forwarding for trusted network
-A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT
Перезапустите ufw:
$ sudo systemctl restart ufwПроверьте правило MASQUERADE:
$ sudo iptables -t nat -L POSTROUTINGОжидаемый вывод:
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.10.10.0/24 anywhereШаг 10 — Подключение с помощью клиента OpenConnect
Установите клиент на Ubuntu 22.04:
$ sudo apt install openconnectПодключитесь к серверу (флаг -b переводит клиент в фон после установки соединения):
$ sudo openconnect -b vpn.example.com:443Вас попросят ввести имя пользователя и пароль, указанные на шаге 7.
После успешного подключения ожидаемый вывод может выглядеть так:
Got CONNECT response: HTTP/1.1 200 CONNECTED
CSTP connected. DPD 90, Keepalive 60
No DTLS address
Set up UDP failed; using SSL instead
Configured as 192.168.1.13, with SSL connected and DTLS disabled
Continuing in background; pid 1650Отключение выполняется командой:
$ sudo pkill openconnectСистемные службы для автоподключения клиента
Создадим systemd unit для автоподключения клиента при старте системы:
$ sudo nano /etc/systemd/system/openconnect.serviceВставьте (приведён пример — хранение пароля в явном виде небезопасно; предпочтительнее использовать защищённые хранилища):
[Unit]
Description=OpenConnect VPN Client
After=network-online.target systemd-resolved.service
Wants=network-online.target
[Service]
Type=simple
ExecStart=/bin/bash -c '/bin/echo -n password | /usr/sbin/openconnect vpn.example.com -u username --passwd-on-stdin'
KillSignal=SIGINT
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.targetВключите и запустите сервис:
$ sudo systemctl enable openconnect.service
$ sudo systemctl start openconnect.serviceСкрипт для перезапуска при выходе из suspend:
$ sudo nano /etc/systemd/system/openconnect-restart.service[Unit]
Description=Restart OpenConnect client when resuming from suspend
After=suspend.target
[Service]
Type=simple
ExecStart=/bin/systemctl --no-block restart openconnect.service
[Install]
WantedBy=suspend.targetАктивируйте:
$ sudo systemctl enable openconnect-restart.serviceСервис проверки соединения (вечно пингует и перезапускает при падении):
$ sudo nano /etc/systemd/system/openconnect-check.service[Unit]
Description=OpenConnect VPN Connectivity Checker
After=openconnect.service
[Service]
Type=simple
ExecStart=/bin/bash -c 'for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done'
[Install]
WantedBy=multi-user.targetВключение и запуск (исправленная команда):
$ sudo systemctl enable openconnect-check.service --nowПримечание: этот подход прост, но лучше использовать более аккуратные проверки (nc, curl или systemd watchdog) и логирование.
Безопасность и рекомендации по харднингу
- Права на ключи: установите владельца и права для приватного ключа TLS:
sudo chown root:root /etc/letsencrypt/live/vpn.example.com/privkey.pem
sudo chmod 600 /etc/letsencrypt/live/vpn.example.com/privkey.pem- Ограничьте доступ к файлам конфигурации и ocpasswd:
chmod 640и владелецroot:ocserv(если есть группа ocserv). - Включите fail2ban для защиты от перебора паролей (настройка кастомного фильтра для ocserv возможна).
- Если возможно, используйте двухфакторную аутентификацию (например, RADIUS с поддержкой OTP).
- Отключите логин root по SSH и используйте ключи SSH.
- Используйте минимально необходимые разрешения в UFW, блокируйте неиспользуемые порты.
- Разделите административный доступ и VPN-учётные записи; создавайте отдельные учётки для админов.
Отладка и типичные ошибки
- “sec-mod socket” — это нормальное сообщение при старте; сокет создаётся службой при инициализации.
- Если ocserv не запускается, проверьте журналы:
$ sudo journalctl -u ocserv -b --no-pager- Проблемы с сертификатом: проверьте пути
server-cert/server-keyи права на файлы. - Ошибки NAT/маршрутизации: проверьте
sysctl net.ipv4.ip_forwardи iptables правило MASQUERADE. - Проблемы с DNS у клиента: если tunnel-all-dns=true, проверьте, что сервер проксирует DNS-запросы и DNS-серверы доступны.
- Проверка сетевого порта:
$ sudo ss -tlnp | grep 443Чек-листы по ролям
Администратор сервера:
- Убедиться, что система обновлена.
- Настроить ufw и NAT.
- Получить TLS-сертификат и защитить ключи.
- Настроить backup конфигураций и логов.
DevOps / Сеть:
- Настроить мониторинг доступности (Prometheus/Alertmanager, Zabbix).
- Настроить автоматическое обновление сертификатов.
- Проверить маршрутизацию, SLI/SLO для VPN-сериса.
Пользователь VPN:
- Получить учётные данные и инструкции по подключению.
- Проверить доступ к нужным ресурсам через VPN.
- Сообщать о проблемах с подключением.
Критерии приёмки (Test cases)
- Сервер отвечает на TCP-порт (по умолчанию 443):
ss -tlnpпоказывает активный ocserv. - Клиент подключается и получает IP из пула
10.10.10.0/24. - Интернет-доступ через VPN: с клиента выполнить
curl ifconfig.meи убедиться, что IP — серверный. - DNS-запросы проходят через указанные резолверы (8.8.8.8/8.8.4.4) при включённом tunnel-all-dns.
- Автообновление certbot:
sudo certbot renew --dry-runпроходит без ошибок.
Руководство по устранению инцидентов (runbook)
- Если ocserv не стартует — проверить
sudo journalctl -u ocservиsudo systemctl status ocserv. - Если клиенты не получают маршрутизации — проверить
sysctl net.ipv4.ip_forwardи правила NAT (iptables -t nat -L POSTROUTING). - Если TLS не проходит — проверить
openssl s_client -connect vpn.example.com:443 -servername vpn.example.comдля диагностики цепочки сертификатов. - При повторных попытках неправильного пароля — проверить /var/log/auth.log и включить fail2ban.
Мини-методология тестирования после развёртывания
- Шаг 1: Проверка доступности порта 443 с внешней сети.
- Шаг 2: Подключение клиента из внешней сети, проверка адресации и DNS.
- Шаг 3: Прогон тестов нагрузочного характера (количество одновременных клиентов) в тестовой среде.
- Шаг 4: Проверка восстановления после перезапуска сервиса и после выхода из suspend у клиента.
Короткий глоссарий
- ocserv — серверная реализация OpenConnect VPN.
- DTLS — Datagram TLS, ускоренный режим по UDP для VPN (можно отключить).
- Certbot — инструмент для получения и обновления Let’s Encrypt сертификатов.
- MASQUERADE — форма NAT, заменяющая исходный IP пакетов на IP интерфейса сервера.
Социальная превью и объявление
Open Graph (OG) рекомендации (уже указаны ниже в метаданных): используйте короткий заголовок и описание с акцентом на быстрый старт и безопасность. Изображение можно заменить логотипом компании.
Короткое объявление (100–200 слов):
Установите OpenConnect (ocserv) на Ubuntu 22.04 за один развернутый план: от настройки ufw и получения TLS-сертификатов до запуска ocserv и настройки автоподключения клиента. Руководство содержит практические команды, рекомендации по безопасности, чек-листы для администраторов и runbook для восстановления. Следуйте шагам, чтобы получить рабочий VPN-сервер с TLS, NAT и автоматическим обновлением сертификатов.
Заключение
Это подробное руководство покрывает весь путь: от подготовки системы и сборки ocserv до конфигурации TLS, настройки NAT и автоматизации клиента. Следуйте чек-листам и рекомендациям по безопасности, тестируйте восстановление и автоматическое обновление сертификатов. Если остались вопросы — опишите проблему, лог и шаги по воспроизведению.
Important: сохраняйте приватные ключи и пароли в защищённых хранилищах и избегайте хранения паролей в явном виде в unit-файлах. Регулярно проверяйте обновления безопасности для ocserv и зависимостей.
Похожие материалы
Настройка Echo Dot — полное руководство
Доступ к localhost из Docker
Как обезопасить SSH‑сервер на Ubuntu
Установка Championship Manager 01/02 на Windows 11/10
Как отключить IE Enhanced Security Configuration