Настройка OpenVPN через TCP 443 и проксирование через Nginx / HAProxy
В условиях жестких корпоративных фаерволов и публичных Wi-Fi сетей возникают ограничения:
- Блокировка любых исходящих портов, кроме TCP 80 (HTTP) и TCP 443 (HTTPS).
- Активное сканирование фаерволом порта 443 (Active Probing): при обнаружении заголовков OpenVPN порт мгновенно блокируется.
- Необходимость разместить на одном публичном IPv4 адресе одновременно боевой веб-сайт и VPN-сервер.
- Падение производительности веб-сервера при прямом пробросе трафика.
1. Архитектура SSL Multiplexing (Разделение протоколов)
Мультиплексор (HAProxy или sslh) слушает входящие соединения на порту 0.0.0.0:443. При поступлении запроса он анализирует первые байты пакета: если это валидный HTTPS-запрос от браузера — он передается на локальный Nginx (127.0.0.1:8443), если это хэндшейк OpenVPN — он уходит на локальный сокет OpenVPN (127.0.0.1:1194).
2. Настройка мультиплексирования через HAProxy (/etc/haproxy/haproxy.cfg)
global
log /dev/log local0
maxconn 4096
defaults
log global
mode tcp
timeout connect 5s
timeout client 50s
timeout server 50s
frontend SSL_MUX_FRONTEND
bind 0.0.0.0:443
mode tcp
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
# Если в начале идет сигнатура OpenVPN, отправляем на VPN:
use_backend OPENVPN_BACKEND if !{ req_ssl_hello_type 1 }
# Весь стандартный TLS трафик направляем на реальный веб-сервер:
default_backend HTTPS_WEB_BACKEND
backend HTTPS_WEB_BACKEND
mode tcp
server nginx_web 127.0.0.1:8443 check
backend OPENVPN_BACKEND
mode tcp
timeout server 2h
server ovpn_srv 127.0.0.1:1194 check3. Конфигурация OpenVPN Сервера (/etc/openvpn/server-tcp.conf)
# Работа строго в режиме TCP на локальном сокете:
proto tcp-server
port 1194
local 127.0.0.1
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
server 10.9.0.0 255.255.255.0
cipher AES-256-GCM
auth SHA256
keepalive 10 120
# Маскировка под реальный веб-сервер при некорректных запросах:
port-share 127.0.0.1 84434. Альтернатива: Легковесный мультиплексор `sslh`
# /etc/default/sslh:
DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:8443 --openvpn 127.0.0.1:1194 --pidfile /var/run/sslh/sslh.pid" Частые вопросы (FAQ)
Почему TCP режим OpenVPN работает медленнее, чем UDP?
При потере пакетов на физическом уровне протокол TCP внутри туннеля и внешний TCP мультиплексора начинают одновременно выполнять повторную передачу (TCP Meltdown), что вызывает кратковременные просадки скорости.
Как директива port-share защищает от активного сканирования DPI?
Если цензор или сканер безопасности отправляет обычный HTTP/HTTPS запрос на порт OpenVPN, сервер не сбрасывает соединение (что выдало бы VPN), а прозрачно проксирует запрос на локальный веб-сервер, возвращая реальный сайт-визитку.
Можно ли добавить проксирование SSH на этот же 443 порт?
Да, мультиплексор sslh и HAProxy поддерживают одновременное разделение на SSH, HTTPS, OpenVPN и Shadowsocks на одном единственном порту 443.
Теряется ли реальный IP-адрес клиента веб-сайта при использовании HAProxy?
Чтобы веб-сервер Nginx видел реальные IP посетителей, настройте передачу PROXY Protocol: добавьте директиву send-proxy в конфигурации HAProxy и proxy_protocol в директиве listen у Nginx.