EnglishРусский Map

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.

Связанные страницы

Репозиторий

github.com/boratanrikulu/gecit, GPL-3.0. Linux, macOS, Windows.