EnglishРусский Map

Рассинхронизация TLS через поддельный ClientHello

title
Рассинхронизация TLS через поддельный ClientHello
type
concept
summary
Отправка фейкового ClientHello с низким TTL и разрешённым SNI перед настоящим, чтобы DPI записал ложный хост и пропустил трафик
tags
networking, censorship-circumvention, dpi, tls, desync
created
2026-05-06
updated
2026-07-29
lang
ru
source_updated
2026-07-29
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

Клиентский метод обхода DPI-коробок, проверяющих SNI, без использования туннеля. Вместо сокрытия адреса назначения метод сбивает DPI с толку относительно того, что коробка уже успела увидеть.

Механизм работы

В рамках одного и того же TCP-соединения последовательно отправляются два пакета ClientHello:

  1. Поддельный ClientHello с SNI = www.google.com (или любым другим именем из белого списка) и низким TTL - обычно 8.
  2. Настоящий ClientHello с реальным SNI и стандартным TTL.

Фейковый пакет доходит до промежуточного DPI, который фиксирует: "это соединение идёт к google.com" - и перестаёт отслеживать сессию. Значение TTL истекает до того, как пакет доберётся до реального сервера, поэтому сервер его так и не увидит. Настоящий ClientHello доходит до сервера в штатном режиме, но состояние для этого соединения внутри DPI уже отравлено: к моменту появления реального SNI фильтр уже решил пропустить весь поток.

Для успешной работы необходимы два условия:

  • DPI проверяет только первый TCP-сегмент, похожий на ClientHello. Если он продолжает отслеживать весь поток, реальный SNI всё равно будет перехвачен.
  • TTL можно подобрать так, чтобы пакет умер между коробкой фильтрации и сервером. ТСПУ и подобные системы обычно стоят у провайдера, так что TTL со значением 8 почти всегда исчерпывается где-то между ними и любым удалённым интернет-ресурсом. Инструментом подбора выступает traceroute.

Дополнение: ограничение MSS для фрагментации

Этот приём обычно сочетают с ограничением MSS (MSS clamping). Ядру указывается небольшой размер TCP_MAXSEG (в настройках gecit по умолчанию задано 88 байт), что заставляет настоящий ClientHello разбиваться на несколько TCP-сегментов. Простые DPI анализируют только первый сегмент, где расширение SNI оказывается обрезанным. В итоге даже тот DPI, который стал бы повторно разбирать поток, просто не находит поле SNI целиком. На эту же хитрость опираются zapret/GoodbyeDPI/ByeDPI, и она рассчитана на другой класс фильтров, нежели рассинхронизация, поэтому на практике часто нужны оба метода.

Номера sequence и ack должны быть настоящими

Фейковый пакет обязан отправляться с актуальными для живого соединения номерами snd_nxt и rcv_nxt. DPI-системы, отслеживающие пространство порядковых номеров (sequence space), отбрасывают подделки, не попадающие в текущее окно. В Linux интерфейс bpf_sock_ops отдаёт эти поля напрямую через колбэк BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB. На платформах без подобного механизма внутри ядра приходится перехватывать SYN-ACK из сетевого трафика через pcap, что подвержено состояниям гонки и сбоит заметно чаще.

Место метода в общей картине средств обхода

Это метод на стороне клиента: зарубежный выходной IP вы не получаете. IP-адрес назначения остаётся прежним, а списки блокировок по IP продолжают действовать. Соответственно, приём работает только против тех блокировок, где единственным признаком для цензора служит SNI. Против белых списков по CIDR, которые ТСПУ применяет на сетях российских мобильных операторов, одна лишь рассинхронизация с фейковым ClientHello бессильна: там требуется туннель до IP-адреса из белого списка.

При блокировках исключительно по SNI - характерных для корпоративных сетей, Wi-Fi в отелях, университетских фильтров и многих национальных систем фильтрации, работающих мягче ТСПУ, - связки рассинхронизации и ограничения MSS часто хватает самой по себе. Именно для этой ниши и разрабатывался инструмент gecit.

Реализации

  • gecit - через eBPF sock_ops на Linux, через TUN+gVisor на macOS/Windows; по умолчанию использует фейковый SNI www.google.com, TTL 8 и MSS 88.
  • zapret / GoodbyeDPI / ByeDPI - более старое семейство клиентских инструментов рассинхронизации, упомянутое в russia-vpn-bypass-state-2026-04 как дополнение к полноценному туннелю. Они работают через перехватчики NFQUEUE / WinDivert, а не eBPF, из-за чего ни у одного из них нет удобного и аккуратного решения внутри ядра Linux.

См. также

  • mtproxy-reanimation - зеркальный серверный вариант этого метода. В режиме zapret2 сервер делит настоящий ClientHello клиента на три сегмента и отправляет средний с заведомо битой контрольной суммой, так что полный ClientHello вообще не проходит через DPI: цель та же, но на противоположном конце соединения и без установки ПО на клиенте
  • domain-fronting - родственный подход, обманывающий DPI за счёт несоответствия внутреннего и внешнего хостов на уровне CDN вместо манипуляций с пакетами
  • tspu - система DPI, которую частично обходит этот метод (в частности, уровень проверки SNI)
  • whitelist-internet-blocking - уровень, который этим методом обойти нельзя (фейковые пакеты не меняют ваш выходной IP)
  • russia-vpn-bypass-state-2026-04 - место метода в общем ландшафте средств обхода цензуры в РФ