Гид по технологиям

Установка OpenConnect VPN (ocserv) на Ubuntu 22.04

7 min read VPN Обновлено 27 Nov 2025
OpenConnect VPN на Ubuntu 22.04 — ocserv
OpenConnect VPN на Ubuntu 22.04 — ocserv

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

Схема подключения OpenConnect VPN

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

Пример правил NAT и FORWARD в UFW

Перезапустите 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)

  1. Сервер отвечает на TCP-порт (по умолчанию 443): ss -tlnp показывает активный ocserv.
  2. Клиент подключается и получает IP из пула 10.10.10.0/24.
  3. Интернет-доступ через VPN: с клиента выполнить curl ifconfig.me и убедиться, что IP — серверный.
  4. DNS-запросы проходят через указанные резолверы (8.8.8.8/8.8.4.4) при включённом tunnel-all-dns.
  5. Автообновление certbot: sudo certbot renew --dry-run проходит без ошибок.

Руководство по устранению инцидентов (runbook)

  1. Если ocserv не стартует — проверить sudo journalctl -u ocserv и sudo systemctl status ocserv.
  2. Если клиенты не получают маршрутизации — проверить sysctl net.ipv4.ip_forward и правила NAT (iptables -t nat -L POSTROUTING).
  3. Если TLS не проходит — проверить openssl s_client -connect vpn.example.com:443 -servername vpn.example.com для диагностики цепочки сертификатов.
  4. При повторных попытках неправильного пароля — проверить /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 и зависимостей.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Настройка Echo Dot — полное руководство
Умный дом

Настройка Echo Dot — полное руководство

Доступ к localhost из Docker
Docker

Доступ к localhost из Docker

Как обезопасить SSH‑сервер на Ubuntu
Безопасность

Как обезопасить SSH‑сервер на Ubuntu

Установка Championship Manager 01/02 на Windows 11/10
Игры

Установка Championship Manager 01/02 на Windows 11/10

Как отключить IE Enhanced Security Configuration
Windows

Как отключить IE Enhanced Security Configuration

Apple Music бесплатно в 2022 — 6 рабочих способов
Музыка

Apple Music бесплатно в 2022 — 6 рабочих способов