MAATRIX / Блог / ocserv (OpenConnect) на AlmaLinux 9: пошаговая установка

ocserv (OpenConnect) на AlmaLinux 9: пошаговая установка

MAATRIX

Протокол Cisco AnyConnect давно вышел за пределы корпоративных сетей: он проходит через капризные прокси и файрволы лучше многих альтернатив, а клиенты для него есть на всех платформах из коробки. Серверная реализация этого протокола — открытый ocserv, и на AlmaLinux 9 его ставят из репозитория EPEL за несколько минут. Разберём по шагам: установку, генерацию сертификатов, конфиг ocserv.conf, настройку firewalld и первое подключение клиентом.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое ocserv и когда он уместен

Ocserv (OpenConnect Server) — это серверная часть протокола, который изначально придумала Cisco для AnyConnect, а сообщество openconnect реализовало как открытый совместимый стек и клиент, и сервер. Технически это TLS-туннель поверх TCP с переключением на DTLS (UDP) для основного трафика, когда сеть это позволяет, и с автоматическим откатом на TCP, если UDP заблокирован. Именно эта особенность делает ocserv удобным там, где WireGuard или OpenVPN на нестандартном UDP-порту режут агрессивные корпоративные и провайдерские файрволы: TLS на 443-м порту снаружи почти неотличим от обычного HTTPS-трафика.

Второй практический плюс — экосистема клиентов. Штатный VPN-клиент в Windows, macOS, iOS и Android умеет работать с Cisco AnyConnect и его совместимыми реализациями без установки стороннего приложения, а на Linux есть открытый CLI-клиент openconnect и графическая надстройка для NetworkManager. Для пользователя, который не готов разбираться в конфигах WireGuard, это ощутимо ниже порог входа.

Минусы тоже стоит проговорить честно: TLS-туннель тяжелее по накладным расходам, чем WireGuard, конфигурация ocserv.conf крупнее и педантичнее к деталям, а вся экосистема заметно менее массовая — документации и готовых рецептов меньше. Если вам нужен максимально быстрый и простой в настройке туннель для себя одного, WireGuard на VPS обычно проще. Ocserv имеет смысл, когда важна маскировка под HTTPS, поддержка мобильных клиентов из коробки или подключение нескольких пользователей с централизованным управлением через один бинарный файл сервера.

Устанавливаем ocserv из EPEL

В базовых репозиториях AlmaLinux 9 пакета ocserv нет — он живёт в EPEL. Сначала подключите репозиторий, если его ещё нет в системе:

sudo dnf install -y epel-release
sudo dnf makecache

Дальше ставим сам ocserv и утилиты для работы с сертификатами gnutls-utils, они понадобятся на следующем шаге:

sudo dnf install -y ocserv gnutls-utils

Пакет разворачивает конфигурацию по умолчанию в /etc/ocserv/ocserv.conf, создаёт системного пользователя ocserv и юнит systemd. Проверить, что установка прошла штатно, можно командой:

ocserv --version

На этом этапе сервис ещё не запускаем — сначала подготовим сертификаты и допишем конфиг, иначе он не поднимется.

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

TLS-сертификаты для сервера

Ocserv требует сертификат сервера и, в базовом сценарии с самоподписанным CA, отдельный сертификат удостоверяющего центра. Создайте рабочую директорию и сгенерируйте ключ и сертификат CA:

sudo mkdir -p /etc/ocserv/ssl
cd /etc/ocserv/ssl

sudo certtool --generate-privkey --outfile ca-key.pem

Опишите шаблон CA в файле ca.tmpl:

cn = "VPN CA"
organization = "Ваша организация"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key

Сгенерируйте самоподписанный сертификат CA и следом ключ и сертификат самого сервера — здесь важно указать реальный домен или IP сервера в cn и dns_name/ip_address:

sudo certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem

sudo certtool --generate-privkey --outfile server-key.pem

Шаблон сервера server.tmpl:

cn = "vpn.example.com"
dns_name = "vpn.example.com"
tls_www_server
encryption_key
signing_key
expiration_days = 3650

И сам сертификат сервера, подписанный вашим CA:

sudo certtool --generate-certificate --load-privkey server-key.pem \
  --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem \
  --template server.tmpl --outfile server-cert.pem

Такой сертификат работает без ограничений, но клиент при первом подключении покажет предупреждение о недоверенном CA — это нормально для самоподписанной схемы, пользователь один раз подтверждает исключение. Если у вас есть публичный домен, который уже настроен (DNS для AlmaLinux 9), разумнее выпустить обычный сертификат Let's Encrypt через certbot и указать в конфиге его — тогда предупреждений не будет вовсе.

Конфигурация ocserv.conf

Откройте /etc/ocserv/ocserv.conf и приведите ключевые директивы к следующему виду. Часть строк в файле уже есть по умолчанию — просто поправьте значения, остальное можно оставить как есть:

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

tcp-port = 443
udp-port = 443

run-as-user = ocserv
run-as-group = ocserv
socket-file = /run/ocserv-socket
chroot-dir = /var/lib/ocserv

max-clients = 32
max-same-clients = 2

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

isolate-workers = true
cisco-client-compat = true
dtls-legacy = true

device = vpns
predictable-ips = true

ipv4-network = 192.168.90.0
ipv4-netmask = 255.255.255.0

dns = 1.1.1.1
dns = 8.8.8.8

route = default

Пара нюансов, на которых спотыкаются впервые: tcp-port и udp-port совпадают намеренно — именно так работает переключение TCP/DTLS для одного клиента на одном порту 443. Если на сервере уже занят 443-й порт веб-сервером, выберите другой, например 8443, но тогда его придётся явно указывать и в клиенте. Директива route = default заворачивает весь трафик клиента в туннель — это классический full-tunnel VPN; если нужен доступ только к внутренней сети сервера, замените на конкретные подсети через route = 192.168.1.0/255.255.255.0.

Пользователи, firewalld и IP-forwarding

Ocserv по умолчанию аутентифицирует пользователей по логину и паролю из файла, который задан в директиве auth. Создайте первого пользователя утилитой ocpasswd:

sudo ocpasswd -c /etc/ocserv/ocpasswd tester

Утилита дважды спросит пароль и запишет хэш в указанный файл. Добавить ещё одного пользователя — та же команда с другим именем, удалить — флаг -d.

Дальше нужно включить пересылку пакетов на уровне ядра, иначе трафик от клиентов не будет ходить дальше туннельного интерфейса:

echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/60-ocserv.conf
sudo sysctl --system

И открыть порт в firewalld вместе с маскарадингом (NAT), который выпускает трафик клиентов в интернет через внешний интерфейс сервера:

sudo firewall-cmd --permanent --zone=public --add-port=443/tcp --add-port=443/udp
sudo firewall-cmd --permanent --zone=public --add-masquerade
sudo firewall-cmd --reload

Если вы выбрали порт, отличный от 443, замените его в обеих строках --add-port. На AlmaLinux 9 по умолчанию активен SELinux в режиме enforcing — обычно ocserv из EPEL заводится с ним без правки, но если вы вынесли сертификаты в нестандартный путь и сервис не стартует с ошибками доступа к файлам, восстановите контексты командой sudo restorecon -Rv /etc/ocserv/. Если по-прежнему собственный экран AlmaLinux с фаерволом для вас в новинку, есть отдельный разбор настройки firewalld с нуля.

Запуск, проверка и подключение клиентом

Включаем и запускаем сервис, добавляя его в автозагрузку:

sudo systemctl enable --now ocserv
sudo systemctl status ocserv

Если статус active (running), смотрим лог на предмет предупреждений:

sudo journalctl -u ocserv -f

Пока сервис работает, можно в реальном времени посмотреть его состояние и подключённых клиентов через штатную утилиту управления occtl — она общается с сервером через сокет, заданный в конфиге:

sudo occtl show status
sudo occtl show users

Для проверки с клиентской стороны на Linux или из другого экземпляра сервера поставьте пакет openconnect (sudo dnf install -y openconnect на AlmaLinux/EPEL или аналог для вашей ОС) и подключитесь:

sudo openconnect --protocol=anyconnect vpn.example.com:443

Клиент спросит логин и пароль, которые вы задали через ocpasswd, и при самоподписанном сертификате — подтверждение доверия к отпечатку. После успешного подключения появится интерфейс tun0, а ip route на клиенте покажет туннель как маршрут по умолчанию, если вы не меняли route в конфиге. На Windows, macOS, iOS и Android для тестового подключения подойдёт бесплатное приложение Cisco Secure Client, либо open source клиент OpenConnect GUI — вводите адрес сервера и порт так же, как в CLI-команде выше.

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем ocserv отличается от OpenVPN и WireGuard, когда его выбирать?

Ocserv маскируется под обычный HTTPS-трафик на 443-м порту и проще проходит через жёсткие корпоративные файрволы и DPI, а клиенты для него встроены в мобильные ОС. За это платите более тяжёлым протоколом и менее массовой экосистемой. Подробное сравнение подходов — в статье WireGuard или OpenVPN: что выбрать для сервера.

Обязательно ли покупать сертификат, или подойдёт самоподписанный?

Самоподписанный CA полностью рабочий вариант, клиент один раз подтверждает исключение при первом подключении. Если у вас есть домен, удобнее выпустить бесплатный сертификат через Let's Encrypt — тогда предупреждений не будет вовсе.

Клиент пишет TLS handshake failed или не подключается — в чём дело?

Чаще всего порт закрыт в firewalld, пути к сертификатам в ocserv.conf указаны неверно, либо сервис не был перезапущен после правки конфига. Проверьте sudo firewall-cmd --list-all и sudo journalctl -u ocserv — там обычно видна точная причина.

Как ограничить число одновременных клиентов?

Директивы max-clients и max-same-clients в ocserv.conf — первая задаёт общий лимит подключений на сервер, вторая — сколько сессий разрешено одному логину одновременно.

Как оплатить сервер под ocserv из России?

У MAATRIX доступна оплата картой российского банка, по СБП, криптовалютой и токеном MAAT — иностранная карта для аренды не нужна.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →