Предисловие
С момента написания первой статьи о 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, — другие для смарт-тв.
вDOH/выDOH и мы играем в любимых
В 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-сервер и Я
В общих настройках можно включить 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 снаружи, и телеграм имеет шанс заработать. Такой сетап удобен, когда вы вышли из дома и нужно подключиться к условному прокси прямо через настройки в самой телеге.
И приятная мелочь из свежего: раз секретов может быть несколько именных, на главной видно статистику по каждому — сколько соединений, сессий и трафика идёт через «Маму», «Жену» и «Васю» по отдельности. Фактически вы становитесь маленьким прокси-провайдером для своих, но с контролем и наглядностью. Секреты можно на лету включать-отключать.
Telegram Bridge Mod
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"}}
NFQUEUE? Зашёл не в ту дверь
До этого момента я как бы подразумевал, что B4 ловит трафик прозрачно, через netfilter (и это то, под что он максимально заточен). На самом деле дверей на вход у него уже три, и дальше по конвейеру сетов трафик едет одинаково, кем бы он ни зашел.
-
NFQUEUE — наша база. B4 забирает пакеты прямо из ядра через netfilter-очередь, никто на устройствах ничего не настраивает, всё прозрачно. Это движок по умолчанию, и вся статья выше и ниже по большей степени про этот мод работы B4.
-
SOCKS5-сервер. Вот это свежая и, на мой взгляд, недооцененная штука: B4 умеет сам быть SOCKS5-сервером. Указывается порт, при желании логин-пароль — и любой клиент, который умеет ходить через SOCKS5 (браузер, телега, торрент-качалка, да хоть весь системный трафик), направляется прямо в B4. А дальше этот трафик матчится по тем же сетам и обрабатывается ровно так же, как если бы он зашёл через netfilter, — те же таргеты, тот же обход, та же маршрутизация. Поддерживается и UDP.
настройки сокс5 сервера -
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);
-
лог подбора теперь живёт на сервере;
Watchdog — мониторинг
Мониторинг мониторит. Он ничего не «разблокирует магией с нуля». Он держит уже работающий сетап живым. Можно задать список важных урлов, фоновый сервис следит за ними, и как только доступ деградировал — 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, обход анализа и блокировок — это область, где кто-то знает чуть больше, кто-то чуть меньше, и легко почувствовать себя дураком, открыв незнакомую настройку. Вот с этим я и хочу бороться больше всего: моя главная цель — не столько «сделать ещё одну тулзу», сколько популяризировать всю эту кухню и показать, что она не так страшна, как кажется, пока есть возможность.
Спасибо, что дочитали.
Пишите в комментариях — как и в прошлый раз, из ваших сообщений вполне может вырасти третья статья. А так же у нас есть небольшая телеграм группа, можно так же туда задавать вопросы и, тем более, писать запросы.
ссылка на оригинал статьи https://habr.com/ru/articles/1055056/