B4 - инструмент обхода разноуровневых DPI на Go с удобной веб-мордой. Работает на уровне ядра Linux через NFQUEUE - перехватывает сетевые пакеты и применяет к ним техники обхода.
Написан с нуля на Go - хех, это не очередной форк/обертка zapret или других существующих решений. Zapret - мощный CLI-инструмент с тонкой ручной настройкой. B4 - другой подход: веб-интерфейс, полная интеграция v2ray geodat-файлов и автоматический подбор стратегий и применение изменений на лету без перезапуска.
Мне хотелось сделать инструмент, который можно поставить на роутер или любой другой Linux-девайс, открыть в браузере и получить работающий результат - без возни с десятками аргументов командной строки.

B4 устанавливается одной командой, настраивается через веб-интерфейс и умеет автоматически подбирать рабочую стратегию обхода для конкретной сети. Поддерживает geodata-базы (v2ray/xray) - вместо ручного добавления сотен доменов/ip/asn можно подключить условные категории youtube или facebook и получить актуальный список, который обновляется вместе с базой.
Изменения применяются на лету - без перезапуска сервиса и разрыва текущих соединений.
Работает на Linux-системах, серверах и роутерах (OpenWRT, Keenetic, Entware).
Техническая спецификация
Ядро: Go, перехват пакетов через netfilter queue (NFQUEUE), отправка через raw sockets
Geodata: интеграция с geosite/geoip базами (v2ray/xray) - таргетирование по категориям доменов и IP-диапазонам, есть поддержка своего b4geoip-файла (обновляется раз в сутки)
Firewall: автоматическая настройка iptables/nftables - правила создаются и восстанавливаются автоматически (возможность переопределить)
Обработка: многопоточная - от 1 до 16 воркеров, каждый со своей очередью
Протоколы: TCP, UDP, QUIC, IPv4/IPv6
Веб-интерфейс: React 19, TypeScript, встроен в бинарник - один файл ~13 МБ (amd64), без внешних зависимостей
Установка: одна команда или через Docker
Установка
wget -qO- https://raw.githubusercontent.com/DanielLavrushin/b4/main/install.sh | sh
На некоторых роутерах home-директория может быть tmpfs (RAM), который очищается при перезагрузке. Для таких случаев лучше скачать скрипт на постоянное хранилище:
Asus Merlin:
/jffs/scripts/Keenetic/Entware:
/opt/
После установки веб-интерфейс доступен по адресу http://<ip-устройства>:7000
Поддерживаемые архитектуры: x86_64, ARM (arm64, armv7, armv6, armv5), MIPS (mipsle, mips softfloat), RISC-V.
Интерфейс

Интерфейс разбит на несколько разделов:
Dashboard - общая картина: активные соединения, статистика пакетов, активность устройств, топ доменов, непокрытые домены, аптайм и нагрузка.
Sets - наборы правил обхода: какие домены/IP обходить и какой стратегией. Вообще это основной рабочий раздел.
Discovery - автоматический подбор рабочей стратегии для конкретного домена.
Connections - живой поток соединений в реальном времени: куда идут пакеты, по какому протоколу, попадают ли под правила. Можно прямо отсюда добавить домен в сет.
Logs - лог-стрим с фильтрацией.
Settings - настройки ядра, geodata, discovery, API-интеграции, захват TLS ClientHello payload.
Основная работа происходит в разделе Sets. Каждый сет - это связка "что обходить" + "как обходить". Домены и IP можно добавлять вручную или подключать категории из geodata-баз (v2ray/xray).
Все изменения применяются мгновенно - сохранил и работает, без перезапуска. Двинул ползунок - применилось.
Первичная настройка
После установки открываем http://ip-устройства:7000 и переходим в Settings.
Settings → Geodat Settings → Download Files
Можно скачать только geosite, только geoip или оба сразу. После загрузки файлы подхватываются автоматически - кеш категорий пересоздаётся, перезапуск не нужен.
Рекомендую:
- для geosite: RUNET Freedom - наиболее полный и актуальный список для рунета. (для слабых роутеров сильно рекомендуется выбирать Loyalsoldier).
для geoip: b4geoip

API-токены
Settings → API → IPINFO.IO
Опционально - токен для обогащения IP-адресов информацией об ASN (ниже будет описано, зачем это нужно). Позволяет добавлять целые подсети провайдера одной кнопкой. Бесплатный тариф - 10k запросов/неделя.

Таким образом можно таргетировать визуально все пакеты

IP Протоколы
Settings → Core → Feature Flags
По умолчанию включён только IPv4. Если нужен IPv6 - можно отдельно включить в настройках (по умолчанию отключен).
Фильтрация устройств
Если B4 стоит на роутере, не всегда нужно обрабатывать весь трафик. Можно выбрать конкретные устройства в сети.
Settings → Core → Device Filtering
На роутере можно ограничить работу B4 конкретными устройствами. Два режима:
Whitelist - обход DPI только для выбранных устройств
Blacklist - обход для всех, кроме выбранных

Устройства подтягиваются из DHCP-leases роутера автоматически.
Discovery
Главная фича для тех, кто не хочет разбираться в параметрах фрагментации и фейковых пакетов.
Discovery автоматически перебирает стратегии обхода и находит рабочую для вашей сети. Запускается из интерфейса сета или с главной страницы.

Как работает
Устанавливает TLS-соединение с тестовой целью.
Последовательно применяет динамические пресеты (ну... честно пытается).
-
Сравнивает время ответа с эталонным (незаблокированный домен из настроек).

если повезет
Примеры сетов
Каждый сет можно экспортировать в JSON и импортировать на другом устройстве. Открываем сет, секция Import/Export - вставляем JSON.

Ниже примеры рабочих конфигураций. Стратегии подбирались для российских провайдеров - на вашей сети результат может отличаться, используйте Discovery для автоматического подбора.
YouTube{"id":"f506c73d-9b25-4be0-b117-c9d70591befe","name":"youtube","tcp":{"conn_bytes_limit":19,"seg2delay":20,"seg2delay_max":60,"syn_fake":false,"syn_fake_len":0,"syn_ttl":7,"drop_sack":false,"incoming":{"mode":"off","min":14,"max":14,"fake_ttl":7,"fake_count":3,"strategy":"badsum"},"desync":{"mode":"off","ttl":7,"count":3,"post_desync":false},"win":{"mode":"off","values":[0,1460,8192,65535]},"duplicate":{"enabled":false,"count":3}},"udp":{"mode":"fake","fake_seq_length":6,"fake_len":64,"faking_strategy":"none","dport_filter":"","filter_quic":"parse","filter_stun":true,"conn_bytes_limit":8,"seg2delay":10,"seg2delay_max":40},"fragmentation":{"strategy":"combo","reverse_order":true,"tlsrec_pos":0,"middle_sni":true,"sni_position":1,"oob_position":0,"oob_char":120,"seq_overlap_pattern":[],"combo":{"first_byte_split":true,"extension_split":true,"shuffle_mode":"full","first_delay_ms":30,"jitter_max_us":1000,"decoy_enabled":false,"decoy_snis":["ya.ru","vk.com","mail.ru","dzen.ru"]},"disorder":{"shuffle_mode":"full","min_jitter_us":1000,"max_jitter_us":3000}},"faking":{"sni":true,"ttl":8,"strategy":"pastseq","seq_offset":10000,"sni_seq_length":1,"sni_type":3,"custom_payload":"","payload_file":"","tls_mod":[],"timestamp_decrease":600000,"sni_mutation":{"mode":"off","grease_count":3,"padding_size":2048,"fake_ext_count":5,"fake_snis":[]},"tcp_md5":true},"targets":{"sni_domains":[],"ip":[],"geosite_categories":["youtube"],"geoip_categories":[]},"enabled":true,"dns":{"enabled":false,"target_dns":"","fragment_query":false},"stats":{"manual_domains":0,"manual_ips":0,"geosite_domains":178,"geoip_ips":0,"total_domains":178,"total_ips":0,"geosite_category_breakdown":{"youtube":178}}}
Hyperion
сет зависим от payload: gosuslugi.ru (генерируется в разделе настроек -> Capture) (основан на сервисе Гиперион
{"id":"1731ef6f-ec56-43b6-bc72-daec1e484daf","name":"hyperion","tcp":{"conn_bytes_limit":19,"seg2delay":20,"seg2delay_max":90,"syn_fake":false,"syn_fake_len":0,"syn_ttl":7,"drop_sack":false,"incoming":{"mode":"off","min":14,"max":14,"fake_ttl":7,"fake_count":3,"strategy":"badsum"},"desync":{"mode":"off","ttl":7,"count":3,"post_desync":false},"win":{"mode":"off","values":[0,1460,8192,65535]},"duplicate":{"enabled":false,"count":3}},"udp":{"mode":"fake","fake_seq_length":6,"fake_len":64,"faking_strategy":"none","dport_filter":"","filter_quic":"disabled","filter_stun":true,"conn_bytes_limit":8,"seg2delay":0,"seg2delay_max":0},"fragmentation":{"strategy":"combo","reverse_order":true,"tlsrec_pos":0,"middle_sni":true,"sni_position":1,"oob_position":0,"oob_char":120,"seq_overlap_pattern":[],"combo":{"first_byte_split":true,"extension_split":true,"shuffle_mode":"full","first_delay_ms":30,"jitter_max_us":1500,"decoy_enabled":false,"decoy_snis":["ya.ru","vk.com","mail.ru","dzen.ru"]},"disorder":{"shuffle_mode":"full","min_jitter_us":1000,"max_jitter_us":3000}},"faking":{"sni":true,"ttl":8,"strategy":"pastseq","seq_offset":10000,"sni_seq_length":1,"sni_type":4,"custom_payload":"","payload_file":"captures/tls_gosuslugi_ru.bin","tls_mod":[],"timestamp_decrease":600000,"sni_mutation":{"mode":"off","grease_count":3,"padding_size":2048,"fake_ext_count":5,"fake_snis":[]},"tcp_md5":true},"targets":{"sni_domains":["kinopub.online","linuxserver.io","euronews.com","shikimori.one","proton.me"],"ip":[],"geosite_categories":["cloudflare","ru-blocked","meta","discord","kinopub","youtube","intel","twitter","protonmail","canva","dw","category-media-ru","linkedin","instagram","hdrezka","fastly","hetzner","oracle","cdn77","digitalocean","akamai"],"geoip_categories":["cloudflare","digitalocean","contabo","akamai","amazon","hetzner","ovh","telegram","twitter","cdn77","scaleway","oracle","fastly"]},"enabled":true,"dns":{"enabled":false,"target_dns":"","fragment_query":false},"stats":{"manual_domains":5,"manual_ips":0,"geosite_domains":76395,"geoip_ips":7137,"total_domains":76400,"total_ips":7137,"geosite_category_breakdown":{"akamai":81,"canva":6,"category-media-ru":131,"cdn77":2,"cloudflare":74,"digitalocean":4,"discord":28,"dw":2,"fastly":8,"hdrezka":11,"hetzner":15,"instagram":74,"intel":288,"kinopub":11,"linkedin":12,"meta":553,"oracle":18,"protonmail":9,"ru-blocked":74866,"twitter":24,"youtube":178},"geoip_category_breakdown":{"akamai":596,"amazon":3447,"cdn77":213,"cloudflare":900,"contabo":284,"digitalocean":173,"fastly":62,"hetzner":117,"oracle":737,"ovh":554,"scaleway":21,"telegram":12,"twitter":21}}}
Заключение
B4 - один бинарник, который ставится одной командой, настраивается из браузера и умеет сам подбирать рабочую стратегию. Работает на Linux - от VPS до роутера на MIPS.
Проект в активной разработке. Буду рад багрепортам, идеям и рекомендациям.
Есть Telegram-группа, где можно попросить помощи с настройкой, предложить фичу или просто дать обратную связь.




Важно понимать: рабочая стратегия обхода зависит от провайдера, региона и конкретного оборудования на сети. То, что работает у одного - может не работать у другого.
Дисклеймер
B4 не является VPN, прокси или туннелем. Принципиальное отличие:
VPN/прокси - трафик идёт через промежуточный сервер. Провайдер не видит конечный адрес, но видит подключение к VPN. Именно такие инструменты попадают под регуляцию - они позволяют скрывать назначение трафика и получать доступ к заблокированным ресурсам.
B4 - трафик идёт напрямую, без промежуточных серверов. Провайдер видит, куда вы подключаетесь. Инструмент не меняет маршрут и не открывает доступ к заблокированным ресурсам. Программа работает на уровне структуры TCP-пакетов, не позволяя оборудованию DPI корректно классифицировать трафик.
На момент публикации (февраль 2026) использование подобных инструментов в РФ не запрещено законодательно. Автор не несёт ответственности за использование в юрисдикциях, где это может быть ограничено.
Комментарии (195)

Incognito4pda
24.02.2026 23:23Здравствуйте. Скажите пожалуйста, на таком:
Linux RT-BE92U-CC10 4.19.294 #1 SMP PREEMPT Tue Nov 25 10:59
:27 EST 2025 aarch64 ASUSWRT-MerlinВаш замечательный проект заведётся?

Jholinar Автор
24.02.2026 23:23о да, конечно! как азусник азуснику (обнимемся :)). Не вижу никаких проблем в заводе.
Просто имейте ввиду, что это все требует тюнинга параметров для конкретного провайдера, это история про дпи, а не про ВПН. к сожалению. Одной базовой кнопкой "сделать краиво" тут не обойтись. Но пишите обязательно или здесь или в личку или в тг-группе, если будут проблемы или пожелания, мне это все интересно развивать.
Popadanec
24.02.2026 23:23А что по требованиям к железу? У меня с учётом nfqws-keenetic(с веб мордой, но без автоподбора стратегий), меньше половины из 128Мб потребляется. Нагрузка ЦП, на уровне шума.

up40k
24.02.2026 23:23Ой, а скажите, в последних моделях асусов HW offloading все еще конфликтует с обработкой сетевых соединений в ядре? А то у меня на RT-AC88U (знаю, знаю, EOL и Мерлин уже два года не выпускал прошивки, как раз собираюсь обновляться по железу) - доходит до банального, либо hairpin NAT, либо NAT offloading и температура на 2-3 градуса ниже (77 вместо 80).
Поскольку я все равно уже созрел отказаться от асуса, то вопрос чисто праздный.
glebliutsko
24.02.2026 23:23У вас система какая на роутере? OpenWRT?
Проблема с offloading концептуальная (на сколько я понял), при включенном HW offloading пакеты через ядро (кроме первого) в принципе не проходят, а соответственно и захватывать и модифицировать нечего. Скорее всего такое будет на всех роутерах.
Можно настроить так, что бы первые N пакетов проходили через ядро и только потом соединение отправлялись в HW offloading. Для этого надо немного поправить правило nftables, но создается оно автоматически firewall4 и как повлиять на него я не нашел.
Но есть костыль. Сделать скрипт заменяющий правило и добавить hook в конфиг.
/scripts/rewrite-nft-rule.sh
#!/bin/sh trap "exit 1" TERM export TOP_PID=$$ die () { >&2 echo "$1" kill -s TERM $TOP_PID } offload_rule=$(nft -a list ruleset | grep -E '^\s+meta l4proto \{ tcp, udp \} flow add @ft' || die 'Rule offloading not found') rule_handle=$(echo $offload_rule | sed -n 's/.*handle[[:space:]]\+\([0-9]\+\).*/\1/p') echo "Delete default rule $offload_rule" nft delete rule inet fw4 forward handle $rule_handle || die "Can't delete default rule" nft insert rule inet fw4 forward "ct packets > 50 meta l4proto { tcp, udp } flow add @ft"/etc/config/firewall
config include option enabled '1' option type 'script' option path '/scripts/rewrite-nft-rule.sh' option fw4_compatible '1'Все что делает скрипт это заменяет правило `meta l4proto { tcp, udp } flow add @ft` на `ct packets > 50 meta l4proto { tcp, udp } flow add @ft`, т.е. теперь offloading применяется только для соединений после 50 пакетов. За эти 50 пакетов успевает примениться обман DPI, а дальше трафик все равно шифрованный.

up40k
24.02.2026 23:23OpenWRT?
Вот в том и вопрос про асусы. Они используют Broadcom, который этот наш опенсорс в гробу видел. Как я понимаю (поправьте если не прав), у этих всяких чипов, заточенных на сети, есть разные типы offloading, не только NAT. И в той же OpenWRT можно на, например, Медиатеках, выбирать, какое именно ускорение включать, а какие вещи оставить ядру.
За костыли спасибо, прикольное. Для сабжа как раз подходит, для hairpin NAT как я понял все равно придется отключать HW разгрузку, там все пакеты с/на внутренний бридж надо маскарадить. Но вообще странно, вродебы такая простая и нужная вещь, а её не реализовали на уровне железа.
glebliutsko
24.02.2026 23:23Вот в том и вопрос про асусы
Судя по WIKI RT-AC88U вполне поддерживает openwrt
https://openwrt.org/toh/asus/rt-ac88uУ меня у самого Asus c OpenWRT, но на MediaTek.
А вообще, мне кажется, на всех роутерах на linux offloading должен делаться одинаково. В nftables создается flowtable и дальше правилом туда добавляются соединения, а там уже драйвер в ядре сам разбирается, как эту таблицу на сетевую карту отправить.
разные типы offloading
Да есть программный, есть аппаратный.
При программном пакеты все равно попадают в ядро, но пропускают большую часть сетевого стека и проверок (в том числе и правила netfilter) из-за чего нагрузка падает.
При аппаратном пакеты вообще в ядро не попадают.
В документации по ядру про это подробнее расписано, если интересно. https://docs.kernel.org/networking/nf_flowtable.html
Но вообще странно, вродебы такая простая и нужная вещь, а её не реализовали на уровне железа.
Да потому что эта функция нужна в РФ, да в Китае МБ. Никому больше не надо специально фрагментировать пакеты и творить прочую дичь с трафиком, лишь бы их DPI пропустил.

up40k
24.02.2026 23:23Оу, благодарю за линк. Последний раз поддержку в опенврт я смотрел лет 5 назад, а там как раз указано что поддерживается с версии 22.03.0. У меня устаревшие данные стало быть, как-то умудрились разработчики запилить поддержку BCM53xx.
И за линк на flowtable тоже) Интересно.> Да потому что эта функция нужна в РФ, да в Китае МБ.
Нене, я про hairpin NAT, это когда машины из локальной сети могут получить доступ к внутренним сервисам при обращении на внешний адрес роутера (при условии проброшенных портов, естественно). Если включать HW NAT offloading, то просто перестает работать вот это правило:
`-A POSTROUTING -s $lan_subnet -d $lan_subnet -o $lan_bridge_if -j MASQUERADE`
Сами пакеты проходят через проброшенные порты, но вот после рукопожатия (когда обработка потока уходит в железо) напрочь отключается SNAT и сервер начинает получать от роутера пакеты с адресом клиента в локальной сети, а не с адресом роутера.
Впрочем, возможно дело именно в MASQUERADE, который сам по себе довольно тяжелый и требует получать информацию о текущем адресе на интерфейсе, а таблицам в железке неоткуда угадывать этот адрес. Надо будет попробовать просто SNAT вместе с HW offloading.

eugenk
24.02.2026 23:23Здравствуйте. Скажите, под винду и под андроид трудно допилить ?

Jholinar Автор
24.02.2026 23:23угу, к сожалению да, это серверное linux-по:(, под вин точно нет, но под андроид как буд-то можно буде попробовать

eugenk
24.02.2026 23:23Нет, про винду я имел в виду если выделить какой-то HAL и в нём просто заменить линуксовые системные вызовы на виндовые. Наверняка они достаточно похожи. С другой стороны, наверняка эта часть (HAL) окажется не слишком велика по сравнению со всем остальным. Вобщем поковыряюсь в исходниках. Про андроид даже не знаю, наверняка потребуется root, без чего хотелось бы обойтись..

Jholinar Автор
24.02.2026 23:23просто весь проект основан на базе линуксового nfqueue, по этому фундаметально винда мимо тут идет:( ну и в целом задача интересна была сделать сетевое серверное приложение (базово для роутеров), а не для частных клиентов.
но! я могу что-то и не знать! проект опенсурсный, и если кто-то присоеденится к разработке, я буду более чем рад. Честно говоря это все те еще дебри всратые:).

eugenk
24.02.2026 23:23Полез сейчас гуглить "nfqueue аналог windows", выдало - Основным аналогом Linux-очереди пакетов NFQUEUE в Windows является драйвер WinDivert (Windows Packet Divert). Так что возможно не так уж всё безнадёжно. Попытаюсь :)))

Lord_of_Rings
24.02.2026 23:23Через WinDivert работает GoodbyeDPI, zapret и прочие. Если интересно, можете попробовать мое поделие, но оно работает как прокси, без дров

matheria123
24.02.2026 23:23Доброй ночи. А подробной инструкции как это дело поставить и настроить на Кинетик нет случайно?

Jholinar Автор
24.02.2026 23:23В группе много людей ставили на кинетики, без особых проблем. Ставится везде одинаково, чеез базовый скрипт установки. Кинетик это линух, а значит должно работать из коробки, дальше вопрос в ресурсах железки. Голанг бинагники на память более затратные, нежели сишные проекты типа запретов.
в любом случае у меня есть небольшие гайды на гитхабе, может помогут?

KW_xJERRYx
24.02.2026 23:23не столько наверное с кинетиком связано, но не подскажете есть возможность оффлайн установку как-то сделать? На кинетике вива через скрипт получаю ошибку Failed to fetch latest version. Пробовал через wget, пробовал с флешки на которой стоит Entware. Проблем с доступом к гитхабу нет, в общем сходу как-то непонятно почему я номер последней сборки получить не могу
UPD попробовал запустить ./install.sh v1.36.0 получил ошибку загрузки. Короче буду разбираться почему у меня с компа, на котором не установлено ни одного запрета и прочего к гитхабу доступ есть, а с роутера за которым этот комп находится доступа видимо нет

Jholinar Автор
24.02.2026 23:23да это косяк wget, нужно доставить `wget-ssl`.
А попробуйте снова установить, кстати? я подкрутил кое-что в скрипте, может получится теперь?
Launchlunch
24.02.2026 23:23У меня так же, на DSL Skipper с 46Мб ROM:
[INFO] Fetching latest release information... [WARNING] Direct download failed, trying proxy (proxy.lavrush.in)... [ERROR] Failed to fetch latest versionПричём до этого установка прошла, но фейлился запуск без уточнения причин, поэтому решил очистить внутреннее хранилище, заново установил Entware, пакеты wget-ssl, bash и начал сначала.
Рекомендуется больше памяти?

DYNAMIT-75
24.02.2026 23:23Человек не программист , но с пониманием дела , сможет залить в роутер данную стратегию ?

cupespresso
24.02.2026 23:23Если под винду, рабочим и простым вариантом будет поставить виртуалку с линуксом, сделать там два сетевых интерфейса и использовать виртуалку как шлюз в интернеты либо как проксик для браузера.

Asparagales
24.02.2026 23:23Еще бы неплохо добавить скрипт или другой инструмент для полного удаления программы и возврата всех настроек обратно, включая nftables и т.д.

Jholinar Автор
24.02.2026 23:23много чего добавить можно и нужно, но конкретно это все уже есть.
флаг `--remove` к скрипту удалит все установленное.
А насчет правил - они добавляются только при работе приложения. При выходе все очищается и возвращается в былой вид.

Jholinar Автор
А еще, что б "имеповаднобыло" выложил кумулятивный транскрипт (как результат больших 24 главы) тех самых ютублекций лекций по ТСПУ на github
https://github.com/DanielLavrushin/tspu-docs
если вдруг кому интересно теорию почитать. Она сильно устаревшая (по разным источникам лецкии делались в 2021 году), но фундаментально базовая.
Nemoumbra
Гениальные уши у LLM.
Принцип «ананасных мальчиков».Просто гениально.Jholinar Автор
Это очень смешно, и правда. Я упустил этот момент в вычитке. В лекции речь шла о борьбе нанайских мальчиков. Ютуб странскриптил это в `ананайских мальчиков`, и после это все превратилось в борьбу `ананасных мальчиков`.
FirsofMaxim
Локальный мем получается...
Lord_of_Rings
о_О Вот это спасибо! Давно хотел что-то такое почитать, будет очень интересно как разработчику обходов) Это вы делали или нет? Какую иишку использовали?
exeonid
Судя по скринам на YT лежит видеоверсия
Lord_of_Rings
Вообще-то в readme репозитория есть эта ссылка
exeonid
Действительно. Не заметил