Народный

Протоколы

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-цикла.

Как работает

  1. ClientHello: клиент включает extension application_layer_protocol_negotiation со списком предпочтений, например ["h2", "http/1.1"].
  2. ServerHello: сервер выбирает один из предложенных и шлёт его обратно.
  3. TLS handshake завершается, оба знают, какой протокол внутри.
  4. Первый прикладной байт уже трактуется как этот протокол — без дополнительного negotiation.

ALPN — текстовый идентификатор. Зарегистрированные у IANA значения:

  • h2 — HTTP/2 (RFC 7540)
  • http/1.1 — HTTP/1.1
  • h3 — 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.

Связанные термины

  • TLS 1.3 — основной handshake, где живёт ALPN.
  • SNI — другое ключевое поле ClientHello.
  • HTTP/3 — ALPN-значение h3.
  • QUIC — несёт собственный ALPN-механизм.
  • Reality — критически зависит от корректного ALPN.