DPI Модель противника: как блокируют VPN

Прежде чем учить «как обойти», надо понять что именно детектит современный DPI. Reality, ShadowTLS, AmneziaWG — это конкретные ответы на конкретные техники цензуры. Без модели противника эти решения выглядят магией. С моделью — становятся очевидной инженерией.

Что узнаешь
Вспомни из прошлых уроков

Мы уже видели противника в действии: SNI открытым текстом в ClientHello (урок 1), сигнатура WireGuard «0x01 + 148 байт» (урок 4), узнаваемые порты и opcode классики (урок 3). Теперь соберём это в единую модель противника: что именно, на каком уровне и какой ценой умеет DPI — чтобы решения из следующих уроков (Reality, Hysteria) читались как инженерия, а не магия.

1. Что такое DPI и где он стоит

DPI (Deep Packet Inspection) — это не «один прибор», а класс оборудования, которое читает содержимое пакетов, а не только заголовки. Обычный маршрутизатор смотрит src/dst IP + порт и решает куда отправить. DPI смотрит payload — что именно лежит внутри TCP/UDP-стрима.

Где DPI стоит в сети
Ты домашний роутер Провайдер BRAS / CGNAT обычный routing ТСПУ / GFW / DPI «технические средства противодействия угрозам» Passive: SNI / JA3 Active probing ML / statistics видит каждый пакет Интернет backbone (магистраль) Весь твой трафик ОБЯЗАТЕЛЬНО проходит через эту коробку. Обхода физически нет.
DPI ставится в разрыв между провайдером и магистральным интернетом — bump-in-the-wire

В России это ТСПУ — закон 90-ФЗ (2019), стоит у каждого крупного провайдера. В Китае — Great Firewall (GFW), в Иране — комбинация DPIarch, в Туркменистане, Беларуси, КНДР — свои реализации (часто на основе китайских/российских наработок).

2. Уровень 1: Passive fingerprinting — что видно сразу

DPI получает копию пакета и смотрит первые байты. Если узнал шаблон — дальше можно блокировать или маркировать. Это самый дешёвый метод: гигабиты в секунду на ASIC.

SNI-инспекция

Главная техника 2024-2026. Как мы видели в уроке 02, в TLS 1.3 ClientHello имя сайта (SNI) передаётся в открытом виде. DPI:

  1. Видит TCP-handshake (SYN, SYN-ACK, ACK)
  2. Ждёт ClientHello (первый пакет с данными от клиента)
  3. Парсит SNI extension
  4. Сверяет с blacklist
  5. Если совпало — отправляет TCP RST обеим сторонам. Соединение рвётся.
Атака

TCP RST injection

Самый частый механизм цензуры. DPI не блокирует пакет физически — он шлёт обеим сторонам подделанные RST-пакеты с правильными sequence numbers. Стороны думают «другая сторона разорвала соединение» и закрывают сокет. Изящно и не требует in-line блокировки — DPI может работать в режиме mirror/tap, что даёт огромную пропускную способность.

JA3/JA4 fingerprinting

JA3 (Salesforce, 2017) — hash от полей ClientHello: TLS-версия, список cipher-suites, extensions, supported groups, EC point formats. Идея: разные клиенты (Chrome, Firefox, curl, OpenVPN, Trojan, V2Ray) выдают разные комбинации — это уникальный отпечаток.

JA3-string: 771,4866-4867-4865-49196-...,0-23-65281-10-11-...,29-23-24,0 ↑ ↑ ↑ ↑ TLS ver cipher-suites extensions supported curves JA3 hash: b32309a26951912be7dba376398abc3b ← это и есть «отпечаток» Примеры реальных fingerprint: Chrome 120 Windows : cd08e31494f9531f560d64c695473da9 Firefox 121 Linux : 6734f37431670b3ab4292b8f60f29984 curl/8.1.0 : fa6ebccda5e7ca8c1f9b9c4e0d7d4d65 Trojan-Go default : d4e5b18d6b607ef5dafd8a82d937e23a ← легко в blacklist

JA4 (FoxIO, 2023) — улучшение: добавляет ALPN, signature algorithms, делает fingerprint человекочитаемым (t13d1516h2_8daaf6152771_b0da82dd1658) и устойчивым к перестановке полей.

Атака

JA3-blacklist

У DPI есть база JA3-хэшей известных VPN/proxy-клиентов. Trojan, V2Ray, sing-box, голый OpenVPN Go-client, wireguard-go HTTP-обёртки — все имеют узнаваемые fingerprint. Соответствие = блок.

Контрмера: uTLS (см. урок 06) — библиотека, которая в Xray/sing-box заставляет клиент шифровать TLS handshake идентично реальному Chrome/Firefox/Safari. JA3 совпадает с настоящим браузером — детект ломается.

ALPN — ещё один indicator

ALPN (Application-Layer Protocol Negotiation) — extension в ClientHello, где клиент сообщает: «я хочу говорить по HTTP/2 или HTTP/1.1». Список протоколов:

Если клиент шлёт ALPN ["h2", "http/1.1"] — это браузер. Если ["xtls"] или нет ALPN вовсе — это уже подозрительно. Современные anti-detect протоколы (XTLS-Vision, Reality) всегда подставляют ALPN как у настоящего браузера.

TLS-in-TLS detection — главная боль Trojan

Самая хитрая техника. Что такое TLS-in-TLS:

  1. Клиент устанавливает TLS-канал с VPN-сервером (внешний TLS — выглядит как HTTPS)
  2. Внутри этого канала пользователь идёт на https://wikipedia.org
  3. То есть внутри зашифрованного канала идёт ещё один TLS-handshake
Атака

Как GFW детектит TLS-in-TLS

Обычный HTTPS-канал к веб-серверу выглядит так: handshake → запрос (300-2000 байт) → ответ (десятки KB) → следующий запрос. Тайминги и размеры специфические.

VPN-канал с TLS внутри: handshake → внутренний handshake (3-4 пакета по ~200 байт за миллисекунду) → потом обычный трафик. Этот «всплеск маленьких пакетов сразу после handshake» — и есть отпечаток TLS-in-TLS. GFW научился это видеть в 2022 — массовые блокировки Trojan в Китае.

Подробно опубликовано в работе GFW Report «How the Great Firewall of China Detects and Blocks Fully Encrypted Traffic» (USENIX Security 2023).

Контрмера

XTLS-Vision и Reality

XTLS-Vision делает «splice»: после внешнего handshake передача переключается на сырой TCP без дополнительного шифрования (зачем шифровать дважды — внутренний TLS уже шифрует). «Всплеск handshake» при этом маскируется паддингом.

Reality идёт ещё дальше: вообще не использует свой TLS-handshake. Клиент ПРОВОДИТ настоящий handshake с настоящим сайтом (например, apple.com), и только в середине handshake происходит «угон». TLS-in-TLS просто отсутствует — нечего детектить. Подробно — урок 07.

3. Уровень 2: Active probing

DPI может не только пассивно слушать, но и сам подключаться к подозрительным IP, чтобы проверить «а это правда веб-сервер или это VPN»?

Как работает GFW

  1. Клиент в Китае подключился к IP 1.2.3.4:443
  2. GFW отметил: «новый адрес, посмотрим внимательнее»
  3. Через несколько секунд GFW сам подключается к 1.2.3.4:443 с разных своих узлов
  4. Шлёт «непонятные» байты — случайные данные, неполный handshake, известные паттерны Shadowsocks/V2Ray
  5. Смотрит реакцию: если сервер ответил «как должен веб-сервер на мусор» (closes connection или 400) — ок. Если ответил «как VPN-сервер» (echo, нестандартное поведение) — IP в blacklist на 24 часа.
Активная атака

Shadowsocks была убита active probing

Оригинальный Shadowsocks (до AEAD) имел уязвимость: при получении «неправильных» байт сервер молча принимал/отвечал нулями. GFW отправлял известные тестовые наборы (PoCs опубликованы в Geneva). По характеру ответа Shadowsocks-сервер опознавался за 5-10 проб. После 2019 Китай массово блокировал любой SS-сервер за 24 часа после первого использования.

Контрмера

Как современные протоколы защищаются

Trojan/Reality: если входящий пакет не имеет правильного «пароля» в первых байтах, сервер маскируется под обычный nginx и отдаёт реальный HTTPS-сайт (это называется «fallback»). Probe видит «обычный сайт» — не подозрительно.

Shadowsocks-AEAD-2022: ввели обязательную проверку timestamp + криптографически сильный pre-shared key. Probe с неправильным ключом получает рандомный мусор обратно (как должен любой HTTPS-сервер). Опознать сервер активным зондом стало невозможно.

4. Уровень 3: Statistical and ML detection

Самая дорогая, но самая опасная техника. DPI собирает статистику по соединению и скармливает модели машинного обучения.

Что смотрят:

2024-2026 тренд

«Fully encrypted traffic detection»

GFW Report 2023: у GFW есть классификатор, который маркирует любой «неклассифицируемый» зашифрованный поток. Просто «не похоже ни на одно из 10 000 известных приложений» = подозрительно = на повторную проверку или блок. Это убивает «бесформенные» обфускации типа obfs4.

Решение: протокол должен выглядеть как что-то знакомое, а не как «случайный шум». Поэтому новые протоколы (Reality, Trojan, ShadowTLS) маскируются под HTTPS к настоящим сайтам.

5. Кто против тебя: ТСПУ vs GFW vs Иран

ТСПУ (РФ)GFW (Китай)Иран
Что умеет SNI block, IP block, WG signature, OpenVPN signature, ML-классификатор (с 2024) Всё перечисленное + active probing + TLS-in-TLS detection + fully encrypted detection SNI, IP, ALPN, иногда active probing. Слабее GFW, но активнее блокирует крупные сервисы (Telegram, Twitter)
Active probing Редко, начали в 2024 Постоянно, агрессивно Иногда
ML/статистика Развивается с 2024 (нацпроекты) В продакшне с 2023 Базово
Что работает Reality, Hysteria 2, AmneziaWG, ShadowTLS Reality + uTLS (mimicking Chrome), Hysteria 2 (порт-хоппинг), TUIC Любой современный stealth-протокол (Reality, ShadowTLS, Hysteria, Cloak)
Период блокировок Часто разовые, после крупных событий Перед партсъездами и юбилеями — «полное затемнение» Перманентно, периодически «full shutdown» (BGP отключают)
Особенность Закон требует SORM-логирования — но это другая система Активная блокировка целых ASN зарубежных хостингов Whitelist подход в моменты «затемнения» (только госсайты)
Под капотом

Почему ТСПУ медленнее GFW в разработке

GFW существует с 1998, имеет команды R&D и тысячи академических работ по реверс-инжинирингу VPN-протоколов. У них есть собственные публикации на USENIX, S&P, NDSS — главных конференциях по security. ТСПУ запущен официально в 2019, разработка китайскими вендорами (так и есть, с Huawei/ZTE), активно догоняет, но отстаёт на 2-3 года. Это окно — то, что сейчас даёт жить Reality и AmneziaWG в РФ.

6. Сводная «модель противника»

Чтобы протокол выжил в 2026, он должен пройти ВСЕ три уровня:

  1. Passive: ClientHello как у настоящего браузера (uTLS), нормальный SNI, нормальный ALPN, JA3 в whitelist, ничего «магического» в первых байтах.
  2. Active probing: сервер на подозрении должен прикидываться настоящим веб-сайтом — fallback на nginx/Apache, отдавать настоящий контент по непровоцированным запросам.
  3. Statistical: распределение пакетов и тайминги похожи на реальный HTTPS-трафик (browsing pattern), не на «равномерный поток».

Сегодня этим всем требованиям соответствует ровно один протокол — VLESS + Reality + Vision. Hysteria 2 заходит с другой стороны (UDP/QUIC, маскируется под HTTP/3-видеостриминг).

Аналогия

Три уровня досмотра в аэропорту

DPI работает как служба безопасности с тремя эшелонами. Passive fingerprinting — взгляд на паспорт и билет на входе: не открывая чемодан, по документам (SNI, JA3-отпечаток TLS, ALPN) сразу видно, «свой» пассажир или странный. Active probing — когда что-то смутило, охрана сама подходит и задаёт вопросы: подключается к твоему серверу и смотрит, ведёт ли он себя как настоящий сайт. Statistical/ML — камеры наблюдения за поведением: не важно, что в документах, — важно, что человек ходит кругами не как обычный пассажир (равномерный поток пакетов вместо рваного ритма веб-сёрфинга). Чтобы пройти, протокол обязан быть «обычным пассажиром» на всех трёх эшелонах сразу — на этом и построены Reality и Hysteria.

7. Мини-лаба: попробуй прямо сейчас

Посмотри на себя глазами passive-DPI — какой у твоего браузера/клиента TLS-отпечаток:

# 1. Твой JA3/JA4 fingerprint — та самая «подпись ClientHello»
# Открой в браузере: https://tls.browserleaks.com/tls
# Запомни JA3N/JA4 — так тебя видит DPI на первом эшелоне.

# 2. Отпечаток curl — сравни, он ДРУГОЙ, чем у браузера (вот и детект «не браузер»)
curl https://tls.browserleaks.com/json | grep -i ja3

# 3. Увидь SNI, который читает passive-DPI, прямо в байтах ClientHello
openssl s_client -connect example.com:443 -servername example.com -msg 2>/dev/null \
  | grep -A2 ClientHello

# 4. Промоделируй active probing: постучись на подозрительный сервер как DPI —
#    настоящий сайт ответит осмысленным HTTP, «голый» прокси — оборвёт или ответит странно
curl -skI https://example.com | head -5
Ожидаемый результат

В пункте 1 браузер покажет JA3/JA4 — компактный хеш параметров твоего ClientHello. В пункте 2 curl выдаст ДРУГОЙ отпечаток: DPI по такому расхождению отличает «не-браузер» от браузера — и именно поэтому продвинутые клиенты используют uTLS (имитируют ClientHello реального Chrome). Пункт 3 снова покажет открытый SNI. Пункт 4 — суть active probing: сервер-маскировка ОБЯЗАН на случайный запрос отвечать как настоящий сайт (в Reality за это отвечает fallback на чужой домен), иначе выдаст себя.

8. Задачи самопроверки — реши, потом раскрой ответ

Задача 1. Клиент шлёт трафик на порт 443 с валидным TLS, но его всё равно блокируют в течение часа после запуска. Пассивно ничего «магического» не видно. Каким эшелоном его, скорее всего, взяли?

Active probing: пассивно трафик чист, но DPI занёс IP:порт в очередь на проверку и сам подключился к серверу. «Голый» прокси на непровоцированный запрос ответил не как настоящий сайт (оборвал соединение, вернул нестандартный ответ, потребовал «пароль») — и этим выдал себя. Защита — fallback: сервер обязан на любой посторонний запрос вести себя как обычный веб-сайт. Именно это делает Reality, проксируя пробы на реальный чужой домен.

Задача 2. Протокол идеально имитирует ClientHello браузера (uTLS) и корректно отвечает на пробы, но детект всё равно случается на длинных сессиях. Какой эшелон и почему байтовая маскировка тут бессильна?

Statistical/ML: DPI смотрит не на содержимое, а на форму потока — распределение размеров пакетов, тайминги, соотношение вверх/вниз. Настоящий веб-сёрфинг рваный (запрос — пауза — всплеск), а туннель с равномерной нагрузкой (видеозвонок, большая закачка внутри) даёт нехарактерный «ровный» профиль. Байты можно подделать, статистику поведения — гораздо труднее; поэтому решения имитируют реальные паттерны (Hysteria маскируется под HTTP/3-видео) или добавляют padding.

Задача 3. Trojan «притворяется HTTPS-сайтом», но GFW научился его детектить. Как называется признак и в чём его суть?

TLS-in-TLS: внутри уже установленного TLS-туннеля Trojan гонит ещё один TLS (к целевому сайту), и вложенное рукопожатие даёт характерный паттерн размеров/таймингов записей, отличимый от одинарного HTTPS. Пассивно шифр не читается, но «форма» вложенности видна статистически. Reality уходит от этого, отдавая наружу подлинный TLS реального чужого сайта и не заворачивая второй handshake так же наивно.

Задача 4. Чем принципиально отличаются подходы ТСПУ (РФ) и GFW (Китай), и почему решение, работающее в одной стране, может не работать в другой?

Грубо: GFW исторически силён в active probing и годами копил инфраструктуру целевых проверок и «белых списков»; ТСПУ больше опирается на массовый passive-детект по сигнатурам и полит-управляемые всплески блокировок, плюс агрессивно режет то, что не опознал (включая иногда легитимный трафик). Поэтому AmneziaWG (ломает байтовую сигнатуру) хорошо заходит против ТСПУ, но против probing-ориентированного GFW важнее корректный fallback и поведение сервера. Модель противника — локальна.

Задача 5. Сформулируй три требования, которым обязан удовлетворять протокол-2026, чтобы пройти все эшелоны DPI — по одному на уровень.

(1) Passive: ClientHello неотличим от настоящего браузера (uTLS), валидные SNI/ALPN/JA3, ноль «магических» байт в начале. (2) Active probing: сервер на любой посторонний запрос отвечает как настоящий веб-сайт (fallback/маскировка под реальный домен). (3) Statistical: распределение размеров и таймингов пакетов похоже на реальный веб-трафик, а не на равномерный поток. Сегодня всем трём одновременно удовлетворяет VLESS+Reality+Vision; Hysteria 2 — с другой стороны (QUIC под видео-HTTP/3).

9. Словарик урока

DPI · deep packet inspectionоборудование, читающее содержимое пакетов, а не только заголовки
пассивный отпечаток · passive fingerprintingдетект без вмешательства: SNI, JA3/JA4, ALPN, магические байты
JA3 / JA4хеш параметров ClientHello; выдаёт «не-браузерные» клиенты
uTLSбиблиотека, точно имитирующая ClientHello реального браузера
ALPNсогласование протокола (h2/h3) в TLS; ещё один признак для детекта
активное зондирование · active probingDPI сам подключается к подозрительному серверу и проверяет поведение
fallback · маскировочный откатответ сервера на постороннюю пробу как настоящего веб-сайта
TLS-in-TLSвложенное TLS-рукопожатие внутри туннеля; статистически детектируемо
статистический / ML-детектанализ размеров и таймингов пакетов вместо содержимого
ТСПУ / GFWгоскомплексы DPI РФ и Китая с разными акцентами (сигнатуры против probing)

10. Что дальше

Теперь у нас есть модель противника. В следующих уроках разбираем конкретные протоколы: