B4 — сетевой мультитул по обходу блокировок
- суббота, 4 июля 2026 г. в 00:00:11
С момента написания первой статьи о B4 прошло полгода. Казалось бы, не очень много времени, но софтина получила ну очень большое количество фич, о которых хочется рассказать подробно. Не буду скрывать: хабраэффект сделал своё дело, и благодаря большому интересу после первой статьи очень многие не разочаровались в отсутствии какого-то функционала, а активно помогали - коммуникацией, запросами, тестированием, - благодаря чему все эти фичи в B4 и появились.
В итоге на сегодняшний день B4 - это не инструмент для обхода блокировок (коим базово и задумывался изначально), а полноценный сетевой мультитул с гибкой и продвинутой маршрутизацией таргетированного трафика.
B4 - это linux/netfilter-инструмент для работы с живым трафиком, преимущественно нацеленный на сетевые устройства типа роутеров. Да, сегодня существует множество классных и проверенных тулзов (например, zapret и byedpi), но мне хотелось заложить в принцип работы функции, которых в них нет, но которые существенно упрощают работу с сетевым трафиком. Мир сетевого трафика в linux, и его мини-мир обхода блокировок в частности, довольно сложен и местами неочевиден.
Основные задачи, которые я хотел решить с помощью B4:
Максимально возможное применение изменений без перезапуска сервиса.
Мультифункциональность. Не одним DPI живём: если что-то не обходится, это можно соединить с другими сервисами - скажем, пустить конкретный трафик в VPN не отходя от кассы.
Визуализация и популяризация подобных инструментов. Да, UI - это главное.
Сеты - сердце B4. Сеты - это не маленькие злобные египетские боги ярости (хотя некоторые пользователи точно скажут, что порой их настройка выбешивает). Сет - это сгруппированный большой набор параметров, направленный на определенные сетевые ресурсы (сайты, сервисы - you name it).

Если вкратце, сет состоит из:
цели - на какой трафик он должен примениться;
стратегий манипуляции с трафиком для обхода блокировок;
дальнейшей маршрутизации и манипуляций с DNS;
эскалации - каскадного перенаправления в другой сет.
В B4 сеты зависимы друг от друга, и их порядок очень важен. Менять его можно на лету, простым перетаскиванием оных.
Первое, что встречает нас при создании сета, - это, конечно, таргетирование. Буквально для начала нужно определить, ради чего мы его создаём, а уже потом думать, что со всем этим делать.

У нас есть возможность:
указывать как конкретные домены и поддомены, так и целые группы (благодаря проекту v2ray);
аналогично указывать отдельные IP и целые подсети;
таргетировать сет по конкретным устройствам в нашей сети;
управлять версиями TLS;
управлять версиями IPv4/IPv6 (в случае если ipv6 доступен);
управлять кэшированием DNS/IP.
Короче говоря, B4 может таргетировать один и тот же сервис по-разному для разных устройств. Из практики: один сет для YouTube может иметь одни параметры обхода для компьютера, а другой сет, для того же YouTube, - другие для смарт-тв.
В B4 была сильно переработана манипуляция с DNS-трафиком и его перенаправление. Главное - появилась возможность перенаправлять конкретные DNS-запросы в нужный нам DoH. Провайдер при этом не видит, что именно вы резолвите, и не может подсунуть подмененный ответ.
Понятно, что это актуально только для обычного DNS-трафика по UDP: уже существующий DoH-трафик B4, очевидно, недоступен, поэтому стоит проверить, не включён ли DoH в браузере или на роутере - иначе он пройдёт мимо B4.

Вот показательный пример сета, наглядно демонстрирующий перенаправление:
{"b4_version":"1.72.0","name":"browserleaks","targets":{"sni_domains":["browserleaks.org","browserleaks.com","browserleaks.net"],"ip":["213.180.204.0/24"],"geosite_categories":["digitalocean"],"geoip_categories":["digitalocean"]},"enabled":true,"dns":{"enabled":true,"doh_url":"https://xbox-dns.ru/dns-query"},"routing":{"enabled":true}}
Заходим на https://browserleaks.com/dns и проверяем результат.
Изначально сеты только фрагментировали трафик и создавали фейки. С усложнением методик DPI стало понятно, что в определённых случаях куда проще просто перенаправить трафик дальше по течению, а там уже «соответствующие органы разберутся».
Тут важно понять принципиальную разницу. Обход DPI - это когда пакет идёт напрямую к сайту, но выглядит для провайдера иначе. Маршрутизация - это когда пакет уходит совсем другим, подпольным, путём. Механизм выбора трафика остаётся тем же самым - те же сеты, те же таргеты, - а вот исход может быть любым из перечисленных ниже.

На данный момент в B4 существует маршрутизация:
В конкретный интерфейс - например, в tun, удобно созданный рядом крутящимся sing-box, WireGuard или xray.
В SOCKS5-сервер - причём поддерживается и UDP-трафик, что, между прочим, в подобных редиректах встречается не так уж часто.
Telegram-WebSocket bridge - мост для Telegram; о нём и о поддержке Telegram в целом - в отдельной главе чуть ниже.
Blackhole - аналог затычки в xray, удобно для блока всякой нечисти вроде рекламы; на блокировке мы, как и на телеге, отдельно остановимся ниже.
Отдельно отмечу то, из-за чего обычно и мучаются с ручными ip rule: маршрутизация в B4 самовосстанавливающаяся. Когда VPN или туннель переподключается и меняет адрес, когда рестартит tun2socks или меняется дефолтный маршрут - B4 сам подхватывает изменения и перестраивает маршруты, ничего трогать руками не нужно.
Ну да, в B4 была добавлена нативная поддержка Telegram. На данный момент существует два способа пустить трафик телеграмма через B4:
внутренний MTProto-сервер;
Tg-WS-bridge.
В общих настройках можно включить MTProto-сервер. Указываем порт, fakeSNI, создаём секрет (или несколько секретов - удобно, когда мы уверены в себе и готовы раздать родственникам и друзьям отдельные строки подключения, но всё же хотим это контролировать). Напротив каждого секрета есть кнопка показать QR-код, чтобы поделиться строкой подключения.
Пара слов о том, как это прячется от провайдера. Сервер работает через fake-TLS обфускацию: снаружи трафик к нему выглядит как обычный HTTPS к безобидному хосту, а не как «подозрительное подключение к прокси».
Это базовый сетап MTProto, и очень вряд ли он у вас заработает прямо из коробки (хотя чем чёрт не шутит). Чуть ниже располагаются настройки для взрослых.
B4 поддерживает работу телеграмма в разных транспортах:
Классический TCP - по сути убитый на сегодня в РФ.
Только WebSocket - большое спасибо проекту tg-ws-proxy за вдохновение.
Авто - B4 сам определит за вас, что и куда (но если и так понятно, что нужен websocket, лучше сразу выбрать ws, чтобы не мучать систему).

Поверх транспортов есть ещё несколько помощников на случай, когда даже websocket не пробивается напрямую:
DC Relay - перенаправляет трафик телеграмм-DC на внешний VPS через socat (почему бы и нет).
Cloudflare Worker и резервные Cloudflare-серверы - можно завести свой Worker как персональный релей. Базовый endpoint с конфигом прокси-серверов я вам любезно предоставляю через себя, либо можете указать свой альтернативный.
При наличии заведомо открытого порта можно подключиться к своему серверу с B4 снаружи, и телеграм имеет шанс заработать. Такой сетап удобен, когда вы вышли из дома и нужно подключиться к условному прокси прямо через настройки в самой телеге.
И приятная мелочь из свежего: раз секретов может быть несколько именных, на главной видно статистику по каждому - сколько соединений, сессий и трафика идёт через «Маму», «Жену» и «Васю» по отдельности. Фактически вы становитесь маленьким прокси-провайдером для своих, но с контролем и наглядностью. Секреты можно на лету включать-отключать.
B4 позволяет за счёт специального сета заставить телеграмм работать внутри домашней сети вообще без каких-либо подключений к прокси. Во-первых, вот этот сет:
{"b4_version":"1.64.0rc1","name":"telegram-ws","targets":{"geosite_categories":["telegram"],"geoip_categories":["telegram"]},"enabled":true,"routing":{"enabled":true,"mode":"mtproto-ws"}}

Что в этом сете:
таргетирован по geosite- и geoip-категории telegram;
маршрутизация выбрана «Telegram через WebSocket» (mtproto-ws).
Таким образом, весь трафик в локальной сети, связанный с телеграмом, будет заворачиваться во внутренний WebSocket-мост. Никаких настроек на самих устройствах больше не нужно - работает прозрачно, в том числе на телефонах.
Важный момент: обе фичи - и роутинг на уровне сета, и внутренний MTProto-сервер - могут работать одновременно и независимо друг от друга.

Ну и, завершая экскурс в маршрутизацию сетов B4, стоит упомянуть возможность блокировать трафик. Как будто эта фича родилась абсолютно естественно: таргеты есть, роутинг есть - осталось дело за малым.

Важное уточнение, из-за которого блокировка в B4 - это не просто «ещё один чёрный список доменов». Она работает в три слоя сразу:
DNS sinkhole - на запрос заблокированного домена возвращается NXDOMAIN, домен как будто не существует.
Блокировка по SNI - B4 смотрит на имя хоста прямо в TLS/QUIC handshake. Это ловит даже тех клиентов, которые резолвятся через свой собственный DoH в обход вашего DNS (привет, умные телевизоры и приложения со вшитым резолвером).
Блокировка по адресу - по IP, CIDR и geoip-категориям прямо в firewall.
Работает это по всей сети сразу, включая сам роутер, и не требует никакого выходного интерфейса.
В опциях есть два поведения отбраковки трафика:
быстрый отказ (reject) - B4 генерирует RST-пакет, тем самым давая приложению моментально понять, что соединение сброшено;
молча отбросить (drop) - «умерла так умерла», более классический и нейтральный вариант, соединение умрёт по таймауту.

Самый очевидный сценарий - блокировка рекламы для всей сети разом. То, что на компьютере делает uBlock, тут работает на уровне сети для всех устройств, включая телефоны и телевизор, куда расширение не поставишь. А на дашборде под это есть отдельная панель Blackhole: сколько всего заблокировано, топ доменов и какие устройства в сети чаще всего ломятся в рекламу.
В качестве бонуса - вот готовый сет, отбраковывается кучу рекламы, а заодно набор сайтов, где эту блокировку можно проверить:
{"b4_version":"1.72.0","name":"adblock","fragmentation":{"strategy":"none"},"faking":{"sni":false},"targets":{"sni_domains":["ad.mail.ru","advertronic.io","vu.okcdn.ru","adkernel.com","adfox.ru","nr-data.net","rubiconproject.com","adition.com","mc.yandex.com","log.strm.yandex.ru","analytics.yahoo.com","criteo.com","taboola.com","ad4m.at","1rx.io","hbx.media.net","media.net","adform.net","analyticsengine.s3.amazonaws.com","analytics.s3.amazonaws.com","ad.doubleclick.net","analytics.google.com","api.bugsnag.com","app.bugsnag.com","browser.sentry-cdn.com","app.getsentry.com","ads-api.twitter.com","log.byteoversea.com","log.fc.yahoo.com","adtech.yahooinc.com","appmetrica.yandex.ru","metrika.yandex.ru","fingerprintjs.com","px.srvcs.tumblr.com","device-metrics-us.amazon.com","cdn.cookielaw.org","consent.cookiebot.com","sdk.privacy-center.org","cdn.privacy-mgmt.com","api.impact.com","cdn.dynamicyield.com","widget.intercom.io","bnc.lt","bingads.microsoft.com","ads.microsoft.com","snap.licdn.com","ct.pinterest.com","geolocation.onetrust.com","consent.trustarc.com","app.usercentrics.eu","advertising-api-eu.amazon.com","fls-na.amazon.com","advertising.yandex.ru","ironsource.mobi","is.com","pangleglobal.com","posthog.com","o0.ingest.sentry.io","lr-ingest.com","mineralt.io","pixel.quora.com","qevents.quora.com","ads.vk.com","advertising.apple.com","ads.huawei.com","ngfts.lge.com","xp.apple.com","cmp.osano.com","consentcdn.cookiebot.com","zenaps.com","clientstream.launchdarkly.com","match.adsrvr.org","smartyads.com","adcolony.com","mouseflow.com","edge.fullstory.com","stats.wp.com","adsrvr.org","c.bing.com","app-measurement.com","cdn.segment.com","quantcast.com","rudderstack.com","snowplowanalytics.com","adjust.com","singular.net","wzrkt.com","ads.pinterest.com","ads.x.com","ads-sg.tiktok.com","tracking.rus.miui.com","cookiebot.com","ads-api.tiktok.com","business-api.tiktok.com"],"ip":["5.255.255.77/32"],"geosite_categories":["category-ads-all"]},"enabled":true,"routing":{"enabled":true,"mode":"block"}}
До этого момента я как бы подразумевал, что B4 ловит трафик прозрачно, через netfilter (и это то, под что он максимально заточен). На самом деле дверей на вход у него уже три, и дальше по конвейеру сетов трафик едет одинаково, кем бы он ни зашел.

NFQUEUE - наша база. B4 забирает пакеты прямо из ядра через netfilter-очередь, никто на устройствах ничего не настраивает, всё прозрачно. Это движок по умолчанию, и вся статья выше и ниже по большей степени про этот мод работы B4.
SOCKS5-сервер. Вот это свежая и, на мой взгляд, недооцененная штука: B4 умеет сам быть SOCKS5-сервером. Указывается порт, при желании логин-пароль - и любой клиент, который умеет ходить через SOCKS5 (браузер, телега, торрент-качалка, да хоть весь системный трафик), направляется прямо в B4. А дальше этот трафик матчится по тем же сетам и обрабатывается ровно так же, как если бы он зашёл через netfilter, - те же таргеты, тот же обход, та же маршрутизация. Поддерживается и UDP.

TUN - альтернатива NFQUEUE для устройств с сильно урезанной поддержкой netfilter (тех самых, где B4 раньше просто не стартовал). Пока это экспериментальная опция, и часть фич с ней не работает (тот же дискавери), но сам трафик она уже обрабатывает (работает на ~60% от общих возможностей B4).
Зачем это надо, если есть прозрачный перехват? Затем, что прозрачный перехват требует прав на firewall и, по-хорошему, чтобы B4 стоял на шлюзе. А SOCKS5-сервером B4 можно поднять вообще где угодно - хоть на обычной рабочей машине без всякого netfilter, - и точечно заворачивать в него отдельные приложения.
И чтобы два раза не вставать: очевидно не стоит это путать с маршрутизацией во внешний SOCKS5 из главы про маршрутизацию. Там B4 выступает в качестве клиента, который отдаёт ваш трафик чужому прокси. Здесь B4 - сам себе такой сервер, который трафик принимает. Он умеет быть обоими сразу, если вам зачем-то так надо. Вашу маму и там и тут показывают.
А вот теперь про фичу, вокруг которой у людей больше всего завышенных ожиданий, - про авто подбор стратегий. Сам я им практически не пользуюсь, и сейчас объясню почему.
Программно «пробить» url и открыть сайт в живом браузере - это две очень разные вещи. Чтобы понять, как именно провайдер душит ресурс, в идеале нужно полноценное браузерное поведение со всеми потрохами, вплоть до headless-хромиума. А теперь представьте headless-хром на роутере за пять копеек - вот и я не могу (ах да, помимо того, что сам B4 нормально так жрет ресурсы в силу того, что написан на golang). Поэтому любой автодетект на таком железе видит лишь грубую тень происходящего и в нынешних реалиях DPI частенько может ошибаться.
Что это значит на практике: процентов 95 случаев быстрее и надёжнее закрыть руками. Указал сайт в сете, потыкал пару заведомо рабочих настроек (их обычно и так знаешь наперёд, или они описаны в инструкции или в группе телеги) - открылось. Никакого дискавери. Автоподбор по-настоящему полезен ровно в одной ситуации: когда ты вообще не знаешь, с чего начать, и нужна хоть какая-то отправная точка.
Дискавери - это про сайты и урлы, то есть про TCP/TLS.
Были примеры - человек пробивает discord.com, видит успешный сет, радостно бежит звонить - а звонки не идут. Потому что голос и видео в дискорде - это UDP, отдельная песня, которую проверка по урлу в принципе не щупает. Открылся сайт - не значит заработали звонки.
Как стартовая точка дискавери штука полезная, и за полгода он видоизменился. Берёт домен, прогоняет через набор пресетов, смотрит, как именно рвётся соединение (мгновенный RST, таймаут, TLS-ошибка), и предлагает то, что выстрелило.

Из интересного:
крутится в отдельном потоке и больше не мешает общему трафику B4 во время подбора;
умеет одновременно обрабатывать несколько сайтов разом и искать одну общую стратегию на группу, с применением в один клик;
подбирает под конкретную версию TLS и прото-версию IPv4/IPv6;
проверяет DNS на отравление (а если резолв отравлен - ищет тестовые сайты через DoH);
лог подбора теперь живёт на сервере;
Мониторинг мониторит. Он ничего не «разблокирует магией с нуля». Он держит уже работающий сетап живым. Можно задать список важных урлов, фоновый сервис следит за ними, и как только доступ деградировал - B4 пытается переподобрать стратегию и “сделать красиво” как может.

Мониторинг по факту это дискавери на автопилоте. Можно сразу на авось загнать сайт в мониторинг, и B4 через какое-то время сам должен подобрать стратегию и создасть сет. Если же уже существует сет с указанным доменом, то мониторинг в случае деградации соединения будет пытаться поправить существующий сет.
Инструмент логирования в B4 и раньше был неплохой, но и он оброс полезностями.
Логирование контролируется уровнем логов в настройках.
Логи можно писать в файлы (B4 складывает их в свою директорию - errors.log, update.log), а можно включить галочку syslog и сливать всё в системный журнал (но вообще не стоит).
Отдельная удобная штука - трассировка прямо из веб-интерфейса. В разделе логов можно нажать на «начать трассировку», B4 переходит в режим слежки и собирает всё происходящее в единый файл, а по завершении отдает его вам на анализ. Идеально, чтобы приложить к issue.

Маленький лайфхак напоследок. Когда тестируете подобные тулзы (не только B4), браузер вас будет обманывать закешированными соединениями. Загляните (тут пример для хрома, у остальных есть похожие альтернативы) в chrome://net-internals/ разделы #sockets и #dns, потыкайте там кнопки сброса сокетов и DNS-кэша - иначе легко полчаса гадать, почему сайт «всё ещё не открывается», когда он на самом деле давно открывается, просто хром держит старый коннект.
Их есть у меня. Весь этот веб-интерфейс - на самом деле просто клиент поверх REST API. Всё, что вы делаете кнопками, точно так же делается обычными HTTP-запросами. А значит, B4 можно не только настраивать руками, но и встраивать во что угодно своё - скрипты, автоматизацию, мониторинг, свою собственную морду, если моя вам не по душе.
Наружу торчит вся кухня: конфиг и сеты, DNS, SOCKS5, watchdog, geosite/geoip, ASN-запросы - словом, всё то же, что и в UI. Авторизация по Bearer-токену, так что дёргать это можно и из соседнего сервиса. Отдельно есть WebSocket-стримы реального времени - логи, метрики, ход дискавери и живой список соединений сыплются прямо в сокет, если хотите строить что-то своё поверх.
И самое приятное для тех, кто любит покопаться: есть живой Swagger прямо в браузере. Можно подключить свою инстанцию B4, выбрать нужную версию API
Документация: https://daniellavrushin.github.io/b4/
Swagger API: https://daniellavrushin.github.io/b4/swagger

Первая статья, честно говоря, залетела сильнее, чем я ожидал, и дала проекту такой буст, какого я себе не представлял. Причем многие пришли не те, кто поворчал “а вот здесь не работает” и ушёл, а те, кто увидел потенциал и остался - что-то подкрутить, о чём-то спросить, что-то сломать и рассказать, как именно сломалось. Собственно, добрая половина того, о чём эта статья, выросла именно благодаря таким людям.
Я и сам развиваю B4 в первую очередь потому, что мне это интересно, я сам многого не знаю, и потому что открыт к новым запросам - когда приходит человек со своим сценарием, которого я не предусмотрел или не знал, это не головная боль, а повод сделать инструмент лучше и узнать что-то новое. За эти полгода случился какой-то совершенно неприличный рывок, и это заслуга не столько моя, сколько всех, кто заглянул и захотел подстроить B4 под себя.
Тема, что и говорить, непростая. Сетевой трафик в linux, сам по себе DPI, обход анализа и блокировок - это область, где кто-то знает чуть больше, кто-то чуть меньше, и легко почувствовать себя дураком, открыв незнакомую настройку. Вот с этим я и хочу бороться больше всего: моя главная цель - не столько «сделать ещё одну тулзу», сколько популяризировать всю эту кухню и показать, что она не так страшна, как кажется, пока есть возможность.
Спасибо, что дочитали.
Пишите в комментариях - как и в прошлый раз, из ваших сообщений вполне может вырасти третья статья. А так же у нас есть небольшая телеграм группа, можно так же туда задавать вопросы и, тем более, писать запросы.
