gecit
- title
- gecit
- type
- toolbox
- summary
- Обход DPI на уровне системы через инъекцию фейковых TLS ClientHello из eBPF, без туннеля и удалённого сервера
- tags
- networking, censorship-circumvention, dpi, ebpf, tls, go
- language
- Go + C (eBPF)
- license
- GPL-3.0
- created
- 2026-05-06
- updated
- 2026-05-06
- lang
- ru
- translation_of
- gecit
- source_updated
- 2026-05-06
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Прозрачный обход DPI на системном уровне. Одна команда (sudo gecit run) - и в каждое исходящее TLS-соединение на машине подмешивается фейковый ClientHello прямо перед настоящим. В итоге middlebox'ы, проверяющие SNI, видят безобидное имя хоста и пропускают реальное соединение дальше. Никаких туннелей, удалённых серверов и настроек под каждое приложение. Утилита не скрывает IP-адрес, не шифрует весь трафик и не даёт анонимности - она лишь мешает DPI-системам читать SNI при рукопожатиях TLS.
Автор - Bora Tanrıkulu (bora-blog); подробности архитектуры описаны в заметке bypassing-dpi-with-ebpf.
Архитектура
Идея на всех платформах одинакова: фейковый ClientHello с SNI = www.google.com и TTL 8, плюс урезание MSS до 88 байт, чтобы фрагментировать настоящий ClientHello и разнести расширение SNI по разным сегментам. Различается лишь механизм перехвата в ядре.
- Linux: eBPF
sock_ops. Прикрепляет BPF-программу к cgroup.BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CBсрабатывает в тот момент, когда исходящее TCP-соединение завершает тройное рукопожатие: соединение установлено, но приложение ещё не успело отправить данные. Программа занижаетTCP_MAXSEGчерезbpf_setsockoptи передаёт seq/ack в goroutine на Go через perf event. Пользовательское пространство собирает фейковый ClientHello и отправляет его через сырой сокет (raw socket) сIP_HDRINCL. После рукопожатия трафик остаётся внутри ядра - передача основных объёмов данных идёт без накладных расходов. См. ebpf-sock-ops. - macOS: TUN + gVisor. На macOS нет eBPF. Network Extensions требуют одобренных Apple прав (entitlements), что для опенсорсного инструмента непрактично. gecit использует
sing-tunповерх пользовательского TCP/IP-стека gVisor. Соединения на порт 443 направляются в TUN, gVisor локально завершает рукопожатие, gecit открывает собственное соединение с реальным сервером, выстреливает фейковый пакет и затем пересылает настоящий ClientHello. Значения seq/ack извлекаются из SYN-ACK через pcap. Весь трафик пересекает границу ядро-пользователь - накладные расходы такие же, как у VPN. - Windows: TUN + Npcap. Та же архитектура с TUN+gVisor, что и на macOS. Две дополнительные сложности: сырые сокеты TCP заблокированы начиная с Vista (поэтому инъекция пакетов идёт через
pcap_sendpacketиз Npcap, а gecit приходится вручную собирать полные кадры Ethernet, доставая MAC-адрес шлюза из таблицы ARP); кроме того, большинство инструментов для обхода DPI на Windows используют WinDivert, чей сертификат подписи кода истёк в 2023 году и вызывает срабатывания Defender, поэтому gecit задействует WinTUN от WireGuard. Npcap нельзя распространять без OEM-лицензии, поэтому пользователям нужно ставить его сnpcap.comсамостоятельно.
Обработка DNS
gecit запускает локальный DoH-сервер на 127.0.0.1:53 и переключает на него системный резолвер. Запросы уходят с машины по HTTPS в Cloudflare, Google, NextDNS или любой другой настроенный upstream - никакого открытого DNS, который цензор мог бы отравить. Возникает проблема курицы и яйца: DoH-клиенту самому нужно отрезолвить имя хоста upstream'а до того, как он перехватит DNS. Поэтому gecit при запуске жёстко фиксирует IP-адреса всех upstream-хостов.
На macOS конфигурация DNS привязана к сетевым службам; gecit выбирает активную службу по маршруту по умолчанию (например, при USB-модеме DNS выставляется для службы USB-модема, а не Wi-Fi). На Linux с Flatpak изолированные приложения не видят изменений в /etc/resolv.conf, поэтому обход DNS внутри каждого Flatpak приходится настраивать вручную - но обход DPI там всё равно работает, так как eBPF выполняется глубже любых песочниц.
Использование
sudo gecit run
Вот и весь интерфейс. TTL, фейковый SNI, MSS, целевые порты и upstream для DoH настраиваются; значения по умолчанию: TTL=8, SNI=www.google.com, MSS=88, порты=443.
Советы по настройке из статьи: если обход не работает, с помощью traceroute подберите значение TTL так, чтобы пакет отбрасывался между middlebox'ом и целевым сервером. Если на macOS/Windows pcap не сможет перехватить SYN-ACK, фейк уйдёт с мусорными seq/ack, и DPI его не примет.
Место среди инструментов обхода
gecit обходит DPI, завязанный исключительно на проверку SNI. Инструмент не даёт зарубежного исходящего IP, поэтому не спасает от режимов белых списков по CIDR, вроде того, что tspu применяет на российских мобильных операторах - для этого по-прежнему нужен туннель. Это аналог zapret, GoodbyeDPI и ByeDPI, работающий на уровне ядра; в russia-vpn-bypass-state-2026-04 они рассматриваются как ортогональные дополнения к полноценному VPN. Реализация служит хорошей иллюстрацией того, чем eBPF принципиально отличается от архитектуры сетевых расширений в macOS и Windows; подробнее о механизмах перехвата см. в ebpf-sock-ops.
Связанные страницы
- tls-desync-fake-clienthello - метод
- ebpf-sock-ops - хук в ядре Linux
- bypassing-dpi-with-ebpf - статья об архитектуре
- bora-blog - автор
- little-snitch-linux - другой сетевой инструмент на eBPF, иная категория перехвата (мониторинг приложений вместо инъекции при рукопожатии)
Репозиторий
github.com/boratanrikulu/gecit, GPL-3.0. Linux, macOS, Windows.