MCP-сервер
Внешнее ИИ-приложение читает состояние b4 по протоколу Model Context Protocol и отвечает на вопросы о нём: какой сет соответствует домену, дошёл ли трафик до b4, что написано в логе. Протокол понимают Claude Desktop, LM Studio, Cursor и Jan.
Модель работает внутри этого приложения. b4 не обращается ни к какому ИИ-провайдеру и не требует API-ключа.
Настраивается в Настройки, Интеграции, MCP-сервер.
Поля

| Поле | Описание |
|---|---|
| Включить MCP-сервер | Переключатель в заголовке карточки. Публикует точку доступа на /api/mcp. По умолчанию выключено. Остальная часть карточки видна, только пока он включён. |
| Токен доступа | Ключ, который предъявляют ИИ-приложения. Значение скрыто, кнопки рядом с полем показывают и копируют его. Сгенерировать подставляет новый токен; когда токен уже задан, кнопка называется Пересоздать и заменяет его. Токен можно также ввести или вставить вручную. См. Токен. |
| Разрешить изменение настроек | Позволяет ИИ не только читать настройки, но и менять их. По умолчанию выключено. См. Изменение настроек. |
| Разрешить активные проверки | Позволяет ИИ загрузить домен с роутера и посмотреть, открывается ли он, а также запустить Дискавери для подбора рабочей стратегии обхода. Частные и локальные адреса отклоняются. По умолчанию выключено; это отдельное разрешение, не связанное с Разрешить изменение настроек. |
| Настройка клиента | Запись сервера с именем b4, с URL точки доступа и заголовком Authorization, для вставки в ИИ-приложение. URL состоит из адреса, по которому открыт веб-интерфейс, и /api/mcp. Длинный токен показывается сокращённым; кнопка Копировать кладёт запись в буфер обмена с полным токеном. Пока поле токена пусто, на его месте стоит <токен>, а под записью выводится уведомление о запасной авторизации, описанной в разделе Токен. |
Точка доступа использует порт, TLS-сертификат и адрес привязки веб-сервера. Если веб-сервер выключен (порт 0), она недоступна, и b4 пишет предупреждение при запуске. При включённом у веб-сервера переключателе Доступ из интернета точка доступа открыта из интернета вместе с интерфейсом.
Токен
Кнопка Сгенерировать выдаёт токен из 64 символов. До сохранения конфигурации он не записывается.
Пока токен задан, только он и принимается на /api/mcp. Доступа больше ни к чему он не даёт: ни один другой маршрут API не принимает его как учётные данные.
Если поле пустое, точка доступа переходит на авторизацию веб-интерфейса. Токен входа истекает через сутки и сбрасывается при каждом перезапуске, поэтому настроенное на него ИИ-приложение теряет доступ в течение суток или при ближайшем перезапуске. MCP-токен после перезапуска b4 продолжает работать.
Токен передаётся в заголовке каждого запроса. Без HTTPS его может прочитать и повторно использовать любой на пути следования, поэтому он защищён, только пока порт доступен лишь внутри доверенной сети.
Если поле токена пусто, а имя пользователя и пароль в разделе Настройки, Система, Веб-сервер не заданы, любой, кто дотянется до порта, прочитает статус, конфигурацию и диагностику b4.
Подключение приложения
Нужны два значения: URL точки доступа и заголовок Authorization: Bearer <токен>.
VS Code читает .vscode/mcp.json в рабочей папке или пользовательский mcp.json:
{
"inputs": [
{
"id": "b4-token",
"type": "promptString",
"description": "b4 MCP token",
"password": true
}
],
"servers": {
"b4-asuswrt": {
"type": "http",
"url": "https://192.168.1.1:7000/api/mcp",
"headers": {
"Authorization": "Bearer ${input:b4-token}"
}
}
}
}
LM Studio использует тот же файл с другим ключом верхнего уровня и без type:
{
"mcpServers": {
"b4-asuswrt": {
"url": "https://192.168.1.1:7000/api/mcp",
"headers": {
"Authorization": "Bearer <токен>"
}
},
"b4-local": {
"url": "http://localhost:7000/api/mcp",
"headers": {
"Authorization": "Bearer <токен>"
}
}
}
}
Каждая запись появляется в панели Integrations как mcp/<имя> с переключателем рядом. Записей может быть несколько сразу, например роутер и локальный экземпляр, и включаются они независимо.
Блок inputs в VS Code заставляет редактор спросить токен, а не держать его в файле. Приложения без такого механизма хранят токен в файле открытым текстом, и коммит такого файла оставляет токен в истории репозитория.
Обслуживается только POST. GET и DELETE возвращают 405 - для этого транспорта это штатное поведение, а не ошибка.
Инструменты
| Инструмент | Что отвечает | Пример запроса |
|---|---|---|
b4_status | Версия, движок захвата, бэкенд файрвола, сколько сетов есть и включено, состояние моста «Telegram через WebSocket», время работы и число соединений после последнего сброса счётчиков | «Работает ли b4 и какой движок захвата активен?» |
b4_get_topic | Что делает настройка, в чём измеряется, каково её реальное значение по умолчанию и что означает ноль или пустое значение | «Что на самом деле делает переключатель strict в DNS сета?» |
b4_geo_lookup | Какие категории geosite и geoip существуют, что лежит в одной из них и какие покрывают домен или адрес | «Какая категория geosite покрывает rutracker.org?» |
b4_edit_set_targets | Добавляет и убирает домены, адреса, гео-категории, ASN и устройства-источники в одном сете | «Добавь rutracker.org в сет video.» |
b4_test_domain_now | Загружает домен через b4 и ещё раз в обход b4 и говорит, какой из двух вариантов работает | «Открывается ли rutracker.org прямо сейчас?» |
b4_watchdog | Последний вердикт по каждому отслеживаемому сету и домену, а также add/remove/enable/disable/check; с set - собственный мониторинг одного сета и его адреса | «Какие из отслеживаемых сайтов не работают?» / «Поставь сет video на мониторинг.» |
b4_manage_set | Создаёт, копирует, перемещает, включает, удаляет и сбрасывает сет | «Создай сет для rutracker.org и помести его последним.» |
b4_find_bypass_strategy | Запускает Дискавери для домена и превращает победившую стратегию в сет; с set - запускает его для существующего сета и записывает в него результат, покрывший все адреса | «Найди что-нибудь, с чем откроется rutracker.org.» / «Найди стратегию для сета video.» |
b4_check_domain | Какие сеты нацелены на домен, как совпало, включён ли такой сет | «Покрыт ли rutracker.org каким-нибудь сетом?» |
b4_list_sets | Все сеты в порядке приоритета с числом доменов и основной стратегией | «Перечисли сеты и сколько доменов в каждом.» |
b4_get_set | Один сет целиком | «Покажи полную конфигурацию сета video.» |
b4_get_config | Конфигурация целиком или один её раздел | «Покажи раздел DNS из конфигурации.» |
b4_recent_connections | Соединения, обработанные b4, с указанием совпавшего сета | «Доходил ли до b4 трафик на youtube.com?» |
b4_logs_tail | Хвост errors.log, а с file=update - хвост update.log | «Записал ли b4 что-нибудь в лог ошибок?» / «Обновление всё сломало - что сказал установщик?» |
b4_metrics | Соединения за последнюю полную минуту, в сетах и вне сетов, соединения после последнего сброса счётчиков, отброшенные RST, заблокированные DNS-запросы и соединения, загрузка CPU и память b4. Соединения считаются так же, как на дашборде | «Сколько соединений совпало с моими сетами за последнюю минуту и сколько памяти занимает b4?» |
b4_diagnostics | ОС, ядро, интерфейсы, бэкенд файрвола и установленные b4 группы правил | «Правила файрвола b4 действительно установлены?» |
b4_list_writable_paths | Какие настройки можно менять, с типами и допустимыми значениями | «Что ты можешь изменить в сете video?» |
b4_set_config_value | Меняет одну настройку и применяет её на лету | «Переключи сет video на стратегию extsplit.» |
b4_revert_last_change | Восстанавливает конфигурацию, какой она была до последнего изменения | «Стало хуже, верни как было.» |
Вместе с инструментами публикуется готовый промпт diagnose_domain. Приложения, поддерживающие промпты, показывают его отдельно. Он принимает домен и по порядку проводит модель через проверку статуса, покрытия, конфигурации и файрвола.
Что публикуется, зависит от разрешений
Список инструментов строится из двух переключателей разрешений и пересобирается при каждом их изменении, без перезапуска. Когда оба выключены, ИИ получает только читающие инструменты; те, что меняют настройки или запускают подбор, не публикуются вовсе, поэтому модель не может попытаться сделать то, на что ей не давали прав, а их описания не тратят контекст.
| Разрешено | Публикуется инструментов |
|---|---|
| Ничего (по умолчанию) | 13 |
| Разрешить изменение настроек | 17 |
| Разрешить активные проверки | 15 |
| Оба | 19 |
b4_watchdog - единственный инструмент, который публикуется на любом уровне: чтение его вердиктов не выпускает трафик и ничего не меняет. Его действия разрешаются по отдельности. Без set действия add, remove и check работают со старым списком доменов, а enable и disable включают и выключают общий переключатель мониторинга, который действует и на отслеживаемые сеты, и на список. status доступен всегда и перечисляет также отслеживаемые сеты, remove и disable требуют Разрешить изменение настроек, add и enable дополнительно требуют Разрешить активные проверки, потому что каждое из них заставляет роутер загрузить сайт, а check требует только Разрешить активные проверки.
С set - идентификатором или точным названием сета - он работает с собственным мониторингом этого сета и его адресами Дискавери, которые передаются в url:
Действие с set | Что делает | Что требует |
|---|---|---|
status | Статус мониторинга сета, причина и результаты по адресам | Ничего |
enable | Включает мониторинг сета и назначает проверку; отклоняется, если сет нельзя отслеживать | Разрешить изменение настроек и Разрешить активные проверки |
disable | Выключает мониторинг сета | Разрешить изменение настроек |
add | Добавляет url в адреса Дискавери сета | Разрешить изменение настроек и Разрешить активные проверки |
remove | Удаляет url из них | Разрешить изменение настроек |
check | Назначает проверку всех адресов отслеживаемого сета и сбрасывает паузу | Разрешить активные проверки; прекращение поиска сбрасывается, только если включено и Разрешить изменение настроек |
b4_find_bypass_strategy принимает необязательный set в том же виде. action=start с set запускает Дискавери для этого сета: на переданных доменах или, если их нет, на адресах Дискавери сета, не больше пяти, с первой проверкой текущей стратегии сета и остановкой поиска на первой стратегии, подтверждённой на всех адресах. action=status затем сообщает вердикт сета, а action=apply с set записывает результат в этот сет - только стратегию, не трогая его домены, и только при вердикте covered. То же правило действует для action=apply без set, если запуск, на который он указывает по идентификатору или как последний, был запуском для сета. Сет, который action=apply создаёт для произвольных доменов, сохраняет адреса, на которых они найдены, как свои адреса Дискавери. Сет с включённой маршрутизацией отклоняется. Для запуска нужно Разрешить активные проверки, для применения - Разрешить изменение настроек.
Сервер также сообщает ИИ, какое из двух разрешений у него есть, чтобы он говорил «вот что я бы изменил», а не предлагал изменить. В этом сообщении названа настройка, которую нужно включить, - так модель может ответить на вопрос «почему не можешь?».
Что b4 записывает про MCP
Каждый вызов инструмента пишет в лог b4 одну строку, видную в разделе Логи веб-интерфейса: инструмент, адрес вызывающего и время выполнения. Отклонённый вызов пишется на уровне предупреждения, поэтому модель, потянувшаяся к тому, на что ей не давали прав, заметна на фоне обычной работы.
Запрос, отклонённый на самой точке доступа, тоже попадает в лог: сервер выключен, токен неверен или отсутствует, origin страницы браузера не разрешён. Сам токен не пишется никогда - ни предъявленный, ни настроенный. Повторные отказы сворачиваются в одну строку раз в 30 секунд со счётчиком, поэтому клиент, подбирающий токен, не вытеснит из лога всё остальное.
Эти строки идут в тот поток логов, который показывает интерфейс, и в консоль. В errors.log они не попадают: там лежат только ошибки.
Изменение через MCP и его отмена появляются также в Последних изменениях на дашборде как ИИ-агент изменил настройку, с путём настройки и без её значения.
Основа для ответов
У некоторых настроек b4 имя читается не так, как они работают, а ноль в них обычно означает «использовать фиксированное значение», а не «выключено». b4 несёт с собой описание каждой такой настройки, и модели предписано прочитать его прежде, чем объяснять или менять что-либо.
Одни и те же описания публикуются дважды. Инструмент b4_get_topic принимает topic для точного ключа, path для настройки, которую называет путь b4_set_config_value, или query для поиска. В пути вида sets[video].tcp.win.mode сет игнорируется. Вызов инструмента без аргументов перечисляет все документированные ключи. Ресурсы b4://topics/<ключ> содержат тот же самый текст.
Большинство приложений не показывает модели ресурсы: LM Studio и мосты, совместимые с OpenAI, перечисляют их для пользователя, а не для ассистента. Инструмент делает тот же текст доступным модели.
Запрос о настройке, у которой описания пока нет, возвращает пометку об этом и список документированных настроек рядом. Пометка велит модели сказать, что она не уверена, а не выводить единицу измерения, значение по умолчанию или смысл настройки из её имени.
b4_check_domain отвечает, настроен ли домен в каком-нибудь сете. b4_recent_connections отвечает, дошёл ли трафик до b4 и какой сет совпал. Домен может быть настроен, но трафика по нему не будет - именно это отличает ошибку в целях от ошибки в маршрутизации.
Что вырезается
Вывод инструментов может быть передан сторонней модели, поэтому b4 удаляет из него эти значения или заменяет их на [redacted]:
- имя пользователя и пароль веб-интерфейса;
- сам MCP-токен;
- имя пользователя и пароль SOCKS5;
- имена и значения секретов MTProto;
- токен IPinfo;
- ссылку на сохранённый API-ключ AI-помощника;
- имя пользователя и пароль вышестоящего прокси сета;
- путь к TLS-ключу веб-сервера.
Файл, который отдаёт кнопка Скачать безопасную копию в разделе Настройки, Система, Бэкап, скрывает больше, чем ответы MCP: ещё имена хостов роутера и relay и учётные данные внутри URL.
В b4_diagnostics учётных данных нет, но он сообщает имя хоста, все адреса интерфейсов и действующий набор правил файрвола. Этого достаточно, чтобы опознать сеть, из которой он пришёл.
Изменение настроек
Пока Разрешить изменение настроек выключено, ИИ не может изменить в b4 ничего. Когда включено, доступными для записи становятся:
- все настройки внутри сета: цели, фрагментация, faking, TCP и UDP, DNS, эскалация, маршрутизация
- подсистемы MTProto и SOCKS5, в том числе переключатель «Telegram через WebSocket»
system.mtproto.bridge.enabled - настройки логирования, чтобы ИИ мог поднять уровень лога, воспроизвести проблему и прочитать результат
b4_list_writable_paths сообщает точные пути с их типами, текущими и допустимыми значениями, чтобы модели не приходилось угадывать путь.
Отклоняется независимо от этой настройки:
| Что отклоняется | Почему |
|---|---|
| Все учётные данные | Веб-интерфейс, SOCKS5, MTProto, вышестоящий прокси сета |
| Настройки веб-сервера | Перенос или блокировка интерфейса убирает способ отменить изменение |
| Сами настройки MCP | ИИ не может расширить собственные права |
| Движок захвата пакетов и TUN | Переключение под работающей сетью может отрезать машину |
| Бэкенд файрвола | Неверное значение оставляет машину вообще без правил |
| Все переключатели Доступ из интернета и любая запись, которая открыла бы порт, пока один из них включён, например включение MTProto-прокси или смена его порта или адреса привязки | Открытый порт сразу доступен всему интернету, а отмена изменения не отменяет того, что успело до него дойти |
| Метки пакетов, таблицы маршрутизации | На них держится собственный трафик b4 |
| Идентификатор сета | На него ссылаются цели эскалации |
| Адреса Дискавери сета и переключатель его мониторинга | И то, и другое заставляет роутер запрашивать сайты по расписанию; b4_watchdog с set меняет их по своим разрешениям |
| Каталог логов и расположение файлов геоданных | Это расположение на диске, а не содержимое: неверный каталог логов тихо прекращает запись в файл, а неверный путь к геоданным разом опустошает все категории geosite |
Отклоняется только расположение, но никогда не содержимое. b4_logs_tail читает оба файла логов при любом значении каталога и не может перенести их туда, где сам их не найдёт. system.logging.level не меняет того, что попадает в errors.log, куда при любом уровне пишутся только ошибки. Повышение уровня добавляет подробностей в консоль и в живой просмотр логов веб-интерфейса, который MCP не читает.
Неверное значение внутри сета ломает часть сайтов - это видно и это обратимо. Неверный порт веб-сервера или движок захвата может оставить машину недоступной без пути назад. Всё из второй группы остаётся отклонённым.
Области для записи заданы в бинарнике целыми поддеревьями, а исключения внутри них помечены прямо на полях, поэтому настройка, добавленная в b4 позже, недоступна для записи, пока её не разрешат отдельно.
Изменение проходит через тот же путь проверки и применения, что и веб-интерфейс. Недопустимый результат отклоняется, и ничего не сохраняется. Принятое изменение вступает в силу сразу, включая правила файрвола, если включение сета меняет набор перехватываемых портов. Инструмент сообщает прежнее и новое значение.
Запись доменов сета заменяет весь список. Модели следует прочитать текущее значение и вернуть его полностью; прежнее значение сообщается, чтобы изменение можно было отменить.
b4_edit_set_targets, наоборот, добавляет и убирает отдельные записи, а kind называет список: sni_domains, ip, geosite_categories, geoip_categories, asns или source_devices. Запись asns задаётся как AS15169 или 15169 и хранится как голый номер; зарезервированные номера отклоняются. ASN, чьи префиксы b4 ещё не загрузил, добавляется всё равно и сразу загружается, а ответ называет его: пока загрузка не пройдёт, сет не совпадает ни с одним из его адресов. Префиксы и их обновление описаны в разделе ASN.
Отмена изменения
b4_revert_last_change восстанавливает конфигурацию в том виде, в каком она была до последнего изменения, и применяет её на лету. Повторный вызов уходит дальше назад, по одному изменению за раз.
История хранится в памяти и охватывает только изменения, сделанные через MCP с момента последнего запуска b4. Правки из веб-интерфейса в неё не входят, а перезапуск её очищает.
Откат отклоняется, а изменение остаётся в списке, в двух случаях:
- конфигурация изменилась после отменяемого изменения - восстановлением мониторинга, в веб-интерфейсе или другим инструментом: возврат старой копии перезаписал бы и это более новое изменение;
- откат включил бы мониторинг сета или общий мониторинг либо вернул бы домены мониторинга или адреса Дискавери сета с включённым мониторингом, пока Разрешить активные проверки выключено: мониторинг начал бы запрашивать эти сайты по расписанию. Адреса Дискавери сета с выключенным мониторингом возвращаются и без этого разрешения, потому что их никто не запрашивает.
У модели прежнее значение есть в ответе инструмента, поэтому в том же разговоре достаточно фразы «стало хуже, верни как было».
Origin браузера
Запросы с заголовком Origin принимаются, только если это собственный адрес b4, записанный как IP-адрес или localhost. Так посещённая веб-страница не сможет добраться до b4 через браузер. ИИ-приложения заголовок Origin не отправляют, и на них это не влияет.
Сверять origin с адресом, на который отправлен запрос, бесполезно. При DNS-ребиндинге именем владеет атакующий: страница, загруженная с evil.example, продолжает работать, пока он отвечает на это имя адресом b4, поэтому браузер отправляет Origin: http://evil.example вместе с Host: evil.example, и они совпадают. Чего атакующий сделать не может - это отдать страницу с origin того адреса, которым он не владеет; поэтому автоматически принимаются только литеральные адреса.
Обращение к b4 из браузера по имени хоста поэтому требует внести это имя в allowed_origins - поля в веб-интерфейсе у него нет, он правится в файле конфигурации. Одиночная * принимает любой origin и отключает проверку.