OpenConnect поверх VLESS: корпоративный VPN, который не режет DPI
Семёнов Евгений Сергеевич, директор АйТи Фреш. 15+ лет в корпоративных VPN. В 2025-м у нас на практике началось обвальное падение качества чистых OpenConnect-туннелей: у одних клиентов DPI режет соединение через пять минут, у других SSL handshake прерывается на середине. Вариант «поменять порт» перестал работать: системы DPI уже давно определяют AnyConnect по характерному TLS handshake. В статье — рабочая связка ocserv+VLESS Reality, которую я выкатил на четырёх клиентов за последние полгода.
Зачем OpenConnect если есть чистый VLESS
Хороший вопрос. VLESS-клиенты сегодня позволяют и туннелировать весь трафик, и работать с маршрутизацией. Но у корпоратива есть специфика, которую VLESS плохо закрывает:
- Групповые политики и AD-интеграция. OpenConnect умеет authorization через PAM, LDAP, сертификаты AD CS. VLESS работает только на уровне UUID.
- Split-DNS, split-tunnel, push routes. OpenConnect отдаёт клиенту списки DNS, маршрутов, прокси — как настоящий корпоративный VPN. VLESS — это L4-туннель, маршрутизация на клиенте руками.
- Клиентское ПО. Для Windows и macOS есть официальный Cisco AnyConnect, который воспринимается как легитимный корпоративный VPN и не конфликтует с групповыми политиками.
- Учёт и аудит. В ocserv есть подробные логи, счётчики трафика, управление сессиями через occtl — для корпоративного аудита.
Собственно, связка даёт лучшее от обоих: снаружи — неотличимый от обычного HTTPS трафик VLESS Reality, внутри — полноценный корпоративный OpenConnect со всеми удобствами.
Архитектура связки
У меня на практике работают две схемы.
Схема A: VLESS как внешний маскировщик. На VPS в европейском дата-центре стоит Xray с VLESS Reality на 443. Клиент подключается к VLESS, в нём поднимается SOCKS5 на localhost, через этот SOCKS OpenConnect идёт к корпоративному ocserv, расположенному за NAT в офисе или на другом VPS. DPI видит только VLESS-трафик к cdn-домену, внутри которого туннелирован OpenConnect.
Схема B: один сервер, два сервиса. Xray слушает 443 с VLESS, плюс fallback на локальный порт 8443, где живёт ocserv. Клиент сначала устанавливает VLESS-сессию, в ней настроен прокси на OpenConnect. Плюсы схемы B — один VPS, минусы — чуть сложнее конфигурация и общая точка отказа.
Железо и сеть
Для офиса до 100 удалёнщиков подходит VPS 2 vCPU / 2 ГБ RAM / 30 ГБ SSD с честным каналом 500 Мбит/с. Локация — Европа или Турция, поближе к России. У нас в АйТи Фреш под основной пул развёрнуто два сервера во Франкфурте и Стокгольме, резерв — в Амстердаме.
| Параметр | Рекомендация |
|---|---|
| ОС | Ubuntu 22.04 LTS или Debian 12 |
| CPU | 2 vCPU с AES-NI (проверка: grep aes /proc/cpuinfo) |
| RAM | 2 ГБ (на 100 одновременных сессий достаточно) |
| Канал | 500 Мбит/с симметрично, с анлим-трафиком |
| IP | Белый IPv4, желательно из «чистого» пула хостера |
| Домен | A-запись на IP, обязательно валидный TLS-сертификат Let's Encrypt |
Установка Xray с VLESS Reality
Ставим Xray через официальный скрипт, конфиг — минимальный для Reality:
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
# Генерим ключ Reality
xray x25519
# Получаем privateKey и publicKey, запоминаем
# UUID для пользователя
xray uuid
Конфиг /usr/local/etc/xray/config.json:
{
"inbounds": [{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [{"id": "<UUID>", "flow": "xtls-rprx-vision"}],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"dest": "www.microsoft.com:443",
"serverNames": ["www.microsoft.com"],
"privateKey": "<PrivateKey>",
"shortIds": ["", "01a2b3c4d5e6f7"]
}
}
}],
"outbounds": [{"protocol": "freedom"}]
}
systemctl restart xray
Проверяем, что 443 слушается и корректно проксирует на microsoft.com при обычном TLS-подключении:
curl -v https://ваш_домен:443
# Ответ должен быть от Microsoft
Установка ocserv на внутренний порт
OpenConnect-сервер ставится на тот же VPS или отдельный, но обязательно за TLS. В связке с VLESS можно обойтись self-signed — наружу всё равно смотрит Xray:
apt install ocserv gnutls-bin -y
# Self-signed сертификат
certtool --generate-privkey --outfile /etc/ocserv/server-key.pem
cat > /etc/ocserv/server.tmpl << EOF
organization = "ITfresh"
cn = "vpn.internal"
expiration_days = 3650
signing_key
tls_www_server
EOF
certtool --generate-self-signed --load-privkey /etc/ocserv/server-key.pem \
--template /etc/ocserv/server.tmpl --outfile /etc/ocserv/server-cert.pem
Основные параметры /etc/ocserv/ocserv.conf:
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
tcp-port = 8443
udp-port = 8443
run-as-user = nobody
run-as-group = daemon
server-cert = /etc/ocserv/server-cert.pem
server-key = /etc/ocserv/server-key.pem
max-clients = 128
max-same-clients = 3
keepalive = 32400
dpd = 90
mobile-dpd = 1800
try-mtu-discovery = true
cert-user-oid = 2.5.4.3
tls-priorities = "NORMAL:-VERS-SSL3.0:-ARCFOUR-128"
auth-timeout = 240
idle-timeout = 86400
ipv4-network = 10.77.0.0
ipv4-netmask = 255.255.255.0
dns = 10.10.0.10
route = 10.10.0.0/16
cisco-client-compat = true
# Создаём пользователя
ocpasswd -c /etc/ocserv/ocpasswd vpnuser1
systemctl enable --now ocserv
# Проверяем, что слушает 8443
ss -tlnp | grep 8443
Связка через fallback в Xray
В схеме B Xray принимает на 443 и, если запрос не VLESS — перенаправляет на ocserv. Но OpenConnect по TLS несложно отличить от сайта, поэтому мы идём другим путём: VLESS на 443, клиент использует свой VPN-клиент (Hiddify), в нём настраивается локальный SOCKS, через который стартует ocserv-клиент.
На клиенте Windows:
- Устанавливаем Hiddify, импортируем профиль VLESS Reality.
- В настройках Hiddify включаем локальный SOCKS5 на 127.0.0.1:2080.
- Ставим OpenConnect GUI (openconnect-gui).
- В профиле OpenConnect указываем Proxy: socks5://127.0.0.1:2080, адрес: vpn.internal:8443.
- Логинимся vpn-паролем, получаем корпоративный IP из 10.77.0.0/24.
Интеграция с Active Directory
Для корпоративной сети авторизацию OpenConnect я всегда привязываю к доменной учётке. ocserv поддерживает RADIUS и PAM — через RADIUS он ходит в наш NPS, проверяя логин/пароль в AD и учитывая членство в группе VPN_Users.
# /etc/ocserv/ocserv.conf
auth = "radius[config=/etc/radcli/radiusclient.conf,groupconfig=true]"
# /etc/radcli/radiusclient.conf
authserver nps.corp.ru:1812
acctserver nps.corp.ru:1813
servers /etc/radcli/servers
# /etc/radcli/servers
nps.corp.ru vashSharedSecret
На стороне NPS добавляем сервер ocserv как RADIUS-клиент, и создаём Network Policy с условием «Windows Groups = VPN_Users».
Мини-кейс: логистика, 70 удалёнщиков
В январе 2026 года клиент — логистическая компания в Москве, 180 человек, 70 из них работают удалённо. Предыдущий VPN на L2TP/IPsec лёг в декабре 2025 после обновления правил DPI: у 40% сотрудников соединение рвалось каждые 20 минут. Задача — развернуть стабильный удалённый доступ к корпоративной 1С, CRM Bitrix24 и внутреннему AD FS.
Схема: VPS 4 vCPU / 4 ГБ во Франкфурте, Xray VLESS Reality с маскировкой под aws.amazon.com, ocserv на 127.0.0.1:8443 с RADIUS-авторизацией в корпоративный NPS через SSH-туннель. Клиенты — Hiddify+OpenConnect GUI, инструкция на две страницы, раздана сотрудникам.
Результаты за месяц работы:
- Стабильные сессии без обрывов — 99,4% времени.
- Средняя скорость канала через VPN — 280 Мбит/с (у офиса 500 Мбит/с uplink).
- Жалоб в саппорт — 3 за первую неделю (неправильная настройка профиля), 0 за последующие 3 недели.
- Стоимость: VPS 18 €/мес + 85 000 руб. разовая работа по настройке и документации.
Маршрутизация и split-tunnel
Для корпоративного VPN важно, чтобы через туннель шёл только трафик к корпоративным ресурсам, а остальной — напрямую. Это снижает нагрузку на сервер и убирает проблемы с доступом сотрудников к внешним сервисам.
# В ocserv.conf
route = 10.10.0.0/16 # локальные сети офиса
route = 192.168.100.0/24 # удалённый филиал
route = 172.16.0.0/12 # VPN-сеть дата-центра
# Не гнать в туннель всё
tunnel-all-dns = false
dns = 10.10.0.10 # корпоративный DNS только для push
no-route = 0.0.0.0/0 # дефолтный маршрут у клиента
На нашем стенде с выделенным Dell Xeon Platinum 8280 и коммутацией 40G Mellanox задержка между ocserv на VPS и корпоративным NPS составляет 12 мс — пользователи не ощущают разницы с прямым подключением.
Мониторинг и отладка
Для отладки связки я держу три источника логов:
- Xray access.log — показывает входящие VLESS-сессии.
- ocserv syslog (journalctl -u ocserv) — сессии OpenConnect, ошибки авторизации.
- NPS Event Viewer — отказы и успехи RADIUS-аутентификации.
# Мониторинг активных ocserv-сессий
occtl show users
occtl show status
# Тест производительности одного канала
speedtest-cli # из-под VPN-клиента
Телеметрию отправляю в Grafana+Prometheus через node_exporter и xray-exporter, чтобы видеть RPS, активные сессии и ошибки в реальном времени.
Разворачиваем корпоративный VPN с маскировкой
Связка ocserv + VLESS Reality для офисов от 30 удалённых сотрудников. Настройка на ваших VPS или на наших серверах в дата-центре МТС, интеграция с AD/NPS, клиентские инструкции на русском, мониторинг через Grafana. Работа под ключ за 3–5 рабочих дней.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — частые вопросы про OpenConnect+VLESS
- Чем связка OpenConnect+VLESS лучше чистого OpenConnect?
- Чистый OpenConnect работает по TLS на 443, что в ряде случаев блокируется DPI. Внешний VLESS Reality поверх транспорта делает канал неотличимым от обычного HTTPS-трафика к реальному сайту — это снижает вероятность блокировки, сохраняя удобство AnyConnect-совместимого клиента.
- Нужен ли клиент для такой связки?
- Да, работает это через VLESS-клиент (например, Hiddify) с локальным SOCKS, через который потом OpenConnect соединяется с сервером. Либо через обратный подход — VLESS на входе, OpenConnect на бэке. Оба варианта рабочие.
- Можно ли использовать один сервер для обеих ролей?
- Да, ocserv и Xray прекрасно уживаются на одном VPS. Xray слушает 443 с VLESS Reality, внутренний порт проксирует в ocserv. Для офиса до 100 удалёнщиков достаточно сервера 2 vCPU / 2 ГБ RAM в европейском дата-центре.
- Какая производительность у связки?
- В наших тестах — около 300 Мбит/с на VPS 4 vCPU/4 ГБ без аппаратной криптографии. С AES-NI на хост-процессоре — до 800 Мбит/с. Задержка добавляет 5–15 мс по сравнению с чистым OpenConnect.
- Какой SNI использовать в Reality?
- Любой реальный популярный домен с TLS 1.3 и X25519 — github.com, aws.amazon.com, cloudflare.com. Важно, чтобы домен реально работал и был достижим с сервера. Избегайте доменов, запрещённых в вашей юрисдикции.