SNI (Server Name Indication)
Что это
SNI (Server Name Indication) — расширение TLS, добавленное в RFC 3546 (2003), актуальная версия в RFC 6066 (2011). Позволяет клиенту сообщить серверу, к какому именно домену он хочет подключиться, ещё до установки шифрованного канала.
Зачем нужен
Один IP-адрес может хостить сотни сайтов (shared hosting, CDN). Когда браузер подключается по HTTPS, сервер должен ответить правильным сертификатом для запрашиваемого домена. Без SNI сервер не знал бы, какой сертификат отдать.
Пример: на IP 93.184.216.34 висят и example.com, и example.org. Клиент говорит: SNI: example.com → сервер отдаёт сертификат для example.com.
Где живёт в TLS handshake
SNI отправляется в ClientHello — самое первое сообщение TLS-хэндшейка, которое идёт в открытом виде по сети. Это его главная проблема с точки зрения приватности и обхода блокировок.
Как SNI используется для блокировок
Провайдер / ТСПУ / DPI смотрят в SNI:
- Если SNI =
rutracker.org→ дропаем соединение (или заворачиваем на заглушку) - Если SNI =
google.com→ пропускаем
Это основа современных блокировок в РФ — DNS уже давно недостаточно (обходится DoH), а по IP блочить неудобно (CDN-адреса общие). SNI — прямое и точное совпадение.
Как скрыть SNI
ECH (Encrypted Client Hello)
ECH — новое TLS-расширение, шифрует часть ClientHello (включая SNI) через ключ, полученный из DNS HTTPS-записи. Внедряется в Firefox, частично в Chrome и Cloudflare. В РФ Cloudflare-ECH заблокировали в конце 2024 — cм. детали.
Reality: SNI как оружие
Reality использует SNI наоборот: клиент шлёт SNI популярного сайта (например Microsoft), и Reality-сервер этот сайт как раз и имитирует. Для ТСПУ трафик выглядит как честный HTTPS к Microsoft, потому что и SNI и сертификат — настоящие.
Domain Fronting
Старая техника: SNI = невинный сайт, но HTTP Host-заголовок (после TLS) — реальная цель. Работало на Google/AWS/Cloudfront, потом все крупные провайдеры это запретили (Google в 2018, AWS в 2019).
Что видно, а что нет
| Без ECH | С ECH | |
|---|---|---|
| IP назначения | видно | видно |
| SNI (домен) | видно в открытую | зашифрован |
| ALPN (h2/h1) | видно | зашифрован |
| Данные (после handshake) | шифр | шифр |