Протоколы
ALPN — Application-Layer Protocol Negotiation
TLS-расширение для договорённости о вложенном протоколе (h2, h3, http/1.1) в рамках одного handshake. Главный сигнал для DPI: что внутри TLS-туннеля.
Определение
ALPN (Application-Layer Protocol Negotiation) — расширение TLS, описанное в RFC 7301 (2014), позволяющее клиенту и серверу в рамках одного TLS-handshake договориться о application-layer протоколе. Клиент шлёт список поддерживаемых протоколов (h2, http/1.1, h3, doq, кастомные строки), сервер выбирает один.
Без ALPN до 2014 года HTTPS-сервер не знал, говорит ли клиент HTTP/1.1 или какой-то другой протокол, и сервер обычно дефолтил на HTTP/1.1. С появлением HTTP/2, HTTP/3, DNS-over-HTTPS, WebSocket-over-TLS и других стало критически важно различать их сразу — иначе нельзя обновляться на HTTP/2 без redirect-цикла.
Как работает
- ClientHello: клиент включает extension
application_layer_protocol_negotiationсо списком предпочтений, например["h2", "http/1.1"]. - ServerHello: сервер выбирает один из предложенных и шлёт его обратно.
- TLS handshake завершается, оба знают, какой протокол внутри.
- Первый прикладной байт уже трактуется как этот протокол — без дополнительного negotiation.
ALPN — текстовый идентификатор. Зарегистрированные у IANA значения:
h2— HTTP/2 (RFC 7540)http/1.1— HTTP/1.1h3— HTTP/3 (RFC 9114)doq— DNS-over-QUIC (RFC 9250)acme-tls/1— для ACME tls-alpn-01 challenge
ALPN и DPI
ALPN — главный сигнал для DPI в TLS-трафике после SNI. До TLS 1.3 SNI и ALPN видны открытым текстом в ClientHello. После TLS 1.3 они тоже видны (если не используется ECH).
ТСПУ и GFW используют ALPN для:
- Категоризации:
h2илиhttp/1.1→ обычный веб-трафик, пропустить. Кастомный ALPN типаxray-vless→ подозрительно, проверить. - Replay-атак: цензор повторяет ClientHello к VPN-серверу. Если сервер ALPN-negotiate’ит другое значение, чем реальный сайт — replay-fail, IP в blocklist.
VLESS Reality обязательно копирует ALPN целевого реального сайта (h2 от microsoft.com) и согласовывает то же значение — иначе deep packet replay выявит подмену.
ALPN в production VPN-конфигах
- Xray-core / sing-box: параметр
alpnв TLS-secter позволяет задать список. Для Reality — обязательно["h2"]или["http/1.1"]в зависимости от target-сайта. - WireGuard: не использует TLS, ALPN не применим.
- OpenVPN-tls-crypt: TLS-handshake внутренний, без ALPN-negotiation для прикладного OpenVPN-протокола.
- Hysteria 2 (QUIC): ALPN внутри QUIC-handshake. По умолчанию кастомное значение, что фингерпринтит протокол — рекомендуется ставить
h3.
ALPN-fingerprinting
Уникальные комбинации ALPN-значений в ClientHello — компонент TLS-fingerprint:
- Обычный Chrome:
[h2, http/1.1] - Boring/Go-tls с дефолтом:
[h2](без http/1.1) — выдаёт boring-based прокси. - xray-core старых версий:
[](пустой ALPN) — мгновенный fingerprint.
uTLS и подобные библиотеки имитируют ALPN-список современных браузеров.
Источники
- RFC 7301 — спецификация ALPN.
- IANA ALPN registry — актуальный список зарегистрированных protocol IDs.