ocserv (OpenConnect) на Debian 12: пошаговая установка
ocserv — это открытая реализация протокола Cisco AnyConnect SSL VPN: туннель поднимается поверх TLS на порту 443 и снаружи выглядит как обычный HTTPS-трафик. Это удобно там, где сеть режет всё, кроме веб-протоколов, и там, где на корпоративных ноутбуках уже стоит официальный клиент Cisco AnyConnect — ставить ничего дополнительно не нужно. Разберём полный цикл: установку, сертификаты, конфиг сервера, пользователей, firewall и подключение с разных платформ на Debian 12.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое ocserv и когда он подходит
ocserv реализует тот же протокол, что и коммерческий Cisco AnyConnect, но на open-source стеке: аутентификация и первичный канал управления идут по TLS, а сам трафик — по DTLS (UDP) для скорости, с автоматическим откатом на TLS через тот же порт 443, если UDP на пути к клиенту блокируется. Для клиента это означает, что подключение почти всегда получится поднять — даже из сетей с жёсткой фильтрацией, где режут всё, кроме порта 443.
Из практических плюсов: официальный клиент Cisco AnyConnect уже стоит на многих корпоративных машинах, а свободный клиент OpenConnect есть под Windows, macOS, Linux, Android и iOS. Сам ocserv по умолчанию запускает рабочие процессы в изолированном режиме (isolate-workers) с seccomp-фильтрами — каждое TLS-соединение обрабатывается в отдельном песочнице, и падение одного воркера не роняет сервер целиком.
Из минусов — стоит сказать честно: ocserv менее известен, чем OpenVPN или WireGuard, документации и готовых скриптов меньше, а на мобильных сетях с агрессивной фильтрацией DTLS иногда откатывается на TLS-режим, который заметно медленнее из-за накладных расходов TCP-инкапсуляции. Если приоритет — максимальная скорость и простота, для нового проекта чаще разумнее взять WireGuard; ocserv оправдан там, где важна именно маскировка под HTTPS и совместимость с готовым клиентом AnyConnect.
Подготовка сервера
Ресурсов нужно немного: 1 ядро, 1 ГБ RAM, минимальный диск хватает для десятков одновременных подключений. Обновите систему перед установкой:
apt update && apt upgrade -y
Важный нюанс на старте: ocserv по умолчанию слушает TCP и UDP порт 443. Если на этом же сервере уже работает веб-сервер (nginx, Apache) на 443 — будет конфликт портов. Варианты: вынести ocserv на другой порт (например, 4443, но тогда теряется маскировка под обычный HTTPS-сайт) или развернуть ocserv на отдельном сервере без веб-нагрузки. Для чистого VPN-сервера это не проблема — порт 443 свободен изначально.
Включите форвардинг пакетов на постоянной основе — без него сервер не будет пересылать трафик клиентов дальше в интернет:
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward = 1
EOF
sysctl -p
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстановка ocserv и сертификаты TLS
Пакет ocserv есть в стандартных репозиториях Debian 12, вместе с ним ставим gnutls-bin — набор утилит для работы с сертификатами:
apt install -y ocserv gnutls-bin
Для рабочего запуска нужен TLS-сертификат. Проще всего — self-signed CA и серверный сертификат через certtool. Создайте каталог и ключ/сертификат центра сертификации:
mkdir -p /etc/ocserv/ssl
cd /etc/ocserv/ssl
certtool --generate-privkey --outfile ca-key.pem
Шаблон CA (ca.tmpl):
cn = "ocserv CA"
organization = "MyVPN"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
Выпустите самоподписанный сертификат CA и сертификат сервера:
certtool --generate-self-signed --load-privkey ca-key.pem \
--template ca.tmpl --outfile ca.pem
certtool --generate-privkey --outfile server-key.pem
Шаблон сервера (server.tmpl) — замените IP_СЕРВЕРА на реальный внешний адрес или домен:
cn = "IP_СЕРВЕРА"
dns_name = "IP_СЕРВЕРА"
ip_address = "IP_СЕРВЕРА"
organization = "MyVPN"
expiration_days = 3650
signing_key
encryption_key
tls_www_server
certtool --generate-certificate --load-privkey server-key.pem \
--load-ca-certificate ca.pem --load-ca-privkey ca-key.pem \
--template server.tmpl --outfile server-cert.pem
Самоподписанный сертификат работает сразу, но клиенты будут видеть предупреждение о недоверенном центре — для личного и рабочего использования это некритично. Если сервер привязан к домену, вместо самоподписанного сертификата разумнее выпустить бесплатный через Let's Encrypt (certbot certonly --standalone, порт 80 на время выпуска должен быть свободен) и указать в конфиге пути к fullchain.pem/privkey.pem — тогда клиенты подключаются без предупреждений.
Настройка ocserv.conf
Основной конфиг — /etc/ocserv/ocserv.conf. Ключевые директивы, которые стоит проверить и поправить:
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
tcp-port = 443
udp-port = 443
run-as-user = nobody
run-as-group = daemon
socket-file = /run/ocserv-socket
server-cert = /etc/ocserv/ssl/server-cert.pem
server-key = /etc/ocserv/ssl/server-key.pem
ca-cert = /etc/ocserv/ssl/ca.pem
isolate-workers = true
max-clients = 32
max-same-clients = 2
keepalive = 32400
dpd = 90
mobile-dpd = 1800
ipv4-network = 192.168.100.0
ipv4-netmask = 255.255.255.0
dns = 1.1.1.1
dns = 8.8.8.8
tunnel-all-dns = true
Пояснения по важным полям: auth задаёт способ проверки логина — здесь простой файл паролей ocpasswd, но ocserv умеет и через PAM, RADIUS или сертификаты клиента. dpd/mobile-dpd — интервалы проверки живости соединения; для мобильных клиентов таймаут увеличен, потому что переключение между Wi-Fi и мобильной сетью не должно рвать сессию. tunnel-all-dns = true заставляет клиент отправлять все DNS-запросы через туннель — без этого возможна утечка DNS мимо VPN. ipv4-network/ipv4-netmask — внутренняя подсеть, которая выдаётся клиентам, она не должна пересекаться с локальной сетью сервера.
После правки конфига проверьте синтаксис перед перезапуском:
ocserv -c /etc/ocserv/ocserv.conf -d 1 -f
Команда запускает сервер в foreground-режиме с выводом в консоль — если в конфиге ошибка, вы увидите её сразу, а не будете гадать по логам systemd. Остановите (Ctrl+C) после проверки и переходите к боевому запуску через systemd.
Пользователи, форвардинг и firewall
Создайте первого пользователя утилитой ocpasswd — файл /etc/ocserv/ocpasswd будет создан автоматически при первом запуске:
ocpasswd -c /etc/ocserv/ocpasswd alice
Утилита спросит пароль дважды. Чтобы добавить ещё одного пользователя, повторите команду с новым именем — файл дополняется, а не перезаписывается. Удалить доступ можно флагом -d:
ocpasswd -c /etc/ocserv/ocpasswd -d alice
Теперь настройте NAT и firewall. Если на сервере используется UFW — открытие портов и правило маскарадинга описаны подробно в статье про установку и настройку UFW на VPS; коротко, для ocserv нужно открыть 443/tcp и 443/udp:
ufw allow 443/tcp
ufw allow 443/udp
Само правило маскарадинга UFW через allow/deny не создаёт — его нужно добавить вручную в /etc/ufw/before.rules, в блок *nat:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
COMMIT
Замените eth0 на реальное имя внешнего интерфейса (уточняется командой ip a), затем перезапустите UFW:
ufw disable && ufw enable
Если firewall не используется вовсе или настроен через голый iptables, эквивалент — iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE с последующим сохранением через iptables-persistent.
Запуск, occtl и подключение клиентов
Включите сервис и добавьте в автозагрузку:
systemctl enable --now ocserv
systemctl status ocserv
Для управления и диагностики в реальном времени служит утилита occtl — она общается с работающим сервером через сокет и не требует перезапуска для просмотра состояния:
occtl show status
occtl show users
occtl disconnect user alice
Подключение с клиента возможно двумя путями: официальным Cisco AnyConnect (Windows, macOS) или свободным OpenConnect (Linux, есть GUI-обёртки и под Windows/macOS/Android/iOS). Из командной строки Linux/macOS:
sudo openconnect --user=alice https://IP_СЕРВЕРА:443
С самоподписанным сертификатом клиент спросит подтверждение отпечатка — введите yes, либо заранее передайте отпечаток флагом --servercert pin-sha256:..., чтобы избежать интерактивного запроса в скриптах. На Android и iOS проще всего поставить приложение OpenConnect из соответствующего магазина и указать адрес сервера, логин и пароль в форме — сертификатов вручную вставлять не нужно.
Типичные проблемы при первом подключении:
| Симптом | Вероятная причина | Что проверить | |
|---|---|---|---|
| Клиент не может достучаться до сервера | Закрыт порт 443/tcp или 443/udp | ufw status, `ss -tulnp \ | grep 443` |
| TLS-рукопожатие проходит, дальше обрыв | Ошибка в путях к сертификатам в ocserv.conf | journalctl -u ocserv -f при подключении | |
| Подключение есть, интернета нет | Не включён ip_forward или не работает MASQUERADE | sysctl net.ipv4.ip_forward, правило NAT | |
| DTLS не поднимается, всё идёт через TCP | UDP 443 блокируется по пути (обычная ситуация в мобильных сетях) | Ожидаемое поведение — TLS-фолбэк, не ошибка | |
| Ошибка авторизации при верном пароле | Пользователь не создан в ocpasswd или файл не тот, что указан в auth | cat /etc/ocserv/ocpasswd, сверить путь в конфиге |
Арендуйте сервер под свои задачи!
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
ocserv или OpenVPN — что выбрать?
Если важна маскировка под обычный HTTPS-сайт и совместимость с готовым клиентом Cisco AnyConnect на корпоративных машинах — ocserv. Для универсального личного VPN с большим сообществом и документацией чаще выбирают OpenVPN.
Обязательно ли использовать порт 443?
Нет, порт задаётся директивами tcp-port/udp-port и может быть любым. Но именно 443 даёт эффект маскировки под HTTPS — на другом порту это преимущество теряется.
Можно ли использовать сертификат Let's Encrypt вместо самоподписанного?
Да, и это правильный путь при наличии домена: клиенты подключаются без предупреждений о недоверенном сертификате. Нужно только не забывать про автопродление через certbot renew и перезапуск ocserv после обновления.
Как добавить второго пользователя?
Повторить ocpasswd -c /etc/ocserv/ocpasswd имя — файл паролей дополняется новой записью, перезапускать сервис не нужно.
Почему трафик иногда идёт по TCP, хотя должен по UDP?
Это штатный DTLS-фолбэк: если UDP 443 где-то по пути блокируется (частая ситуация в мобильных и корпоративных сетях), ocserv автоматически переключается на TLS поверх TCP — соединение медленнее, но не разрывается.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →