DPI Модель противника: как блокируют VPN
Прежде чем учить «как обойти», надо понять что именно детектит современный DPI. Reality, ShadowTLS, AmneziaWG — это конкретные ответы на конкретные техники цензуры. Без модели противника эти решения выглядят магией. С моделью — становятся очевидной инженерией.
- Что такое DPI и как он встроен в сеть провайдера
- Три уровня детекции: passive fingerprinting, active probing, statistical/ML
- SNI-инспекция, ALPN, JA3/JA4 fingerprinting — что это и как работает
- TLS-in-TLS detection — главная проблема Trojan и почему Reality его не имеет
- Архитектура ТСПУ (РФ), GFW (Китай), DPI Ирана — что отличает и что общего
- Что они умеют, чего не умеют, куда движутся к 2027
Мы уже видели противника в действии: 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-стрима.
В России это ТСПУ — закон 90-ФЗ (2019), стоит у каждого крупного провайдера. В Китае — Great Firewall (GFW), в Иране — комбинация DPIarch, в Туркменистане, Беларуси, КНДР — свои реализации (часто на основе китайских/российских наработок).
2. Уровень 1: Passive fingerprinting — что видно сразу
DPI получает копию пакета и смотрит первые байты. Если узнал шаблон — дальше можно блокировать или маркировать. Это самый дешёвый метод: гигабиты в секунду на ASIC.
SNI-инспекция
Главная техника 2024-2026. Как мы видели в уроке 02, в TLS 1.3 ClientHello имя сайта (SNI) передаётся в открытом виде. DPI:
- Видит TCP-handshake (SYN, SYN-ACK, ACK)
- Ждёт ClientHello (первый пакет с данными от клиента)
- Парсит SNI extension
- Сверяет с blacklist
- Если совпало — отправляет 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) выдают разные комбинации — это уникальный отпечаток.
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». Список протоколов:
h2— HTTP/2http/1.1— HTTP/1.1h3— HTTP/3 (QUIC)
Если клиент шлёт ALPN ["h2", "http/1.1"] — это браузер. Если ["xtls"]
или нет ALPN вовсе — это уже подозрительно. Современные anti-detect протоколы (XTLS-Vision,
Reality) всегда подставляют ALPN как у настоящего браузера.
TLS-in-TLS detection — главная боль Trojan
Самая хитрая техника. Что такое TLS-in-TLS:
- Клиент устанавливает TLS-канал с VPN-сервером (внешний TLS — выглядит как HTTPS)
- Внутри этого канала пользователь идёт на
https://wikipedia.org - То есть внутри зашифрованного канала идёт ещё один 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
- Клиент в Китае подключился к IP
1.2.3.4:443 - GFW отметил: «новый адрес, посмотрим внимательнее»
- Через несколько секунд GFW сам подключается к
1.2.3.4:443с разных своих узлов - Шлёт «непонятные» байты — случайные данные, неполный handshake, известные паттерны Shadowsocks/V2Ray
- Смотрит реакцию: если сервер ответил «как должен веб-сервер на мусор» (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 собирает статистику по соединению и скармливает модели машинного обучения.
Что смотрят:
- Распределение размеров пакетов. У браузера много мелких + редкие большие. У VPN — равномерные (MTU − overhead).
- Тайминги. HTTPS — пакеты идут «волнами» (запрос → ответ). VPN — непрерывный поток с обеих сторон одновременно (bidi flow).
- Энтропия первых N байт. Зашифрованный трафик имеет почти максимальную энтропию. Реальные HTTP/TLS-заголовки — нет.
- Соотношение upload/download. Веб-серфинг: 10:90. VPN с активным видеозвонком: 50:50. Подозрительно.
- Длительность сессии. Браузер закрывает соединение через секунды. VPN держит часами.
«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, он должен пройти ВСЕ три уровня:
- Passive: ClientHello как у настоящего браузера (uTLS), нормальный SNI, нормальный ALPN, JA3 в whitelist, ничего «магического» в первых байтах.
- Active probing: сервер на подозрении должен прикидываться настоящим веб-сайтом — fallback на nginx/Apache, отдавать настоящий контент по непровоцированным запросам.
- 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. Словарик урока
10. Что дальше
Теперь у нас есть модель противника. В следующих уроках разбираем конкретные протоколы:
- Урок 06: Xray-core и его протоколы (VMess, VLESS, Trojan, XTLS-Vision)
- Урок 07: Reality — пиковое решение 2024-2026
- Урок 08: Hysteria 2 и TUIC — UDP-альтернатива
- Урок 09: Shadowsocks-AEAD-2022, ShadowTLS, AmneziaWG