B4 — сетевой мультитул по обходу блокировок

от автора

Предисловие

С момента написания первой статьи о 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.

пример настройки DoH перенаправления

пример настройки DoH перенаправления

Вот показательный пример сета, наглядно демонстрирующий перенаправление:

{"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, чтобы не мучать систему).

пример mtproto в общих настройках

пример mtproto в общих настройках

Поверх транспортов есть ещё несколько помощников на случай, когда даже 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 сервера

    настройки сокс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.

включать трассировку желательно с уровнем логирования debug для большей детализацией

включать трассировку желательно с уровнем логирования debug для большей детализацией

Маленький лайфхак напоследок. Когда тестируете подобные тулзы (не только 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, обход анализа и блокировок — это область, где кто-то знает чуть больше, кто-то чуть меньше, и легко почувствовать себя дураком, открыв незнакомую настройку. Вот с этим я и хочу бороться больше всего: моя главная цель — не столько «сделать ещё одну тулзу», сколько популяризировать всю эту кухню и показать, что она не так страшна, как кажется, пока есть возможность.

Спасибо, что дочитали.
Пишите в комментариях — как и в прошлый раз, из ваших сообщений вполне может вырасти третья статья. А так же у нас есть небольшая телеграм группа, можно так же туда задавать вопросы и, тем более, писать запросы.

it's alive

it’s alive

ссылка на оригинал статьи https://habr.com/ru/articles/1055056/