Перейти к основному содержимому

MCP-сервер

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

Модель работает внутри этого приложения. b4 не обращается ни к какому ИИ-провайдеру и не требует API-ключа.

Настраивается в Настройки, Интеграции, MCP-сервер.

Поля​

Карточка MCP-сервера

ПолеОписание
Включить MCP-серверПереключатель в заголовке карточки. Публикует точку доступа на /api/mcp. По умолчанию выключено. Остальная часть карточки видна, только пока он включён.
Токен доступаКлюч, который предъявляют ИИ-приложения. Значение скрыто, кнопки рядом с полем показывают и копируют его. Сгенерировать подставляет новый токен; когда токен уже задан, кнопка называется Пересоздать и заменяет его. Токен можно также ввести или вставить вручную. См. Токен.
Разрешить изменение настроекПозволяет ИИ не только читать настройки, но и менять их. По умолчанию выключено. См. Изменение настроек.
Разрешить активные проверкиПозволяет ИИ загрузить домен с роутера и посмотреть, открывается ли он, а также запустить Дискавери для подбора рабочей стратегии обхода. Частные и локальные адреса отклоняются. По умолчанию выключено; это отдельное разрешение, не связанное с Разрешить изменение настроек.
Настройка клиентаЗапись сервера с именем b4, с URL точки доступа и заголовком Authorization, для вставки в ИИ-приложение. URL состоит из адреса, по которому открыт веб-интерфейс, и /api/mcp. Длинный токен показывается сокращённым; кнопка Копировать кладёт запись в буфер обмена с полным токеном. Пока поле токена пусто, на его месте стоит <токен>, а под записью выводится уведомление о запасной авторизации, описанной в разделе Токен.
Обслуживается веб-сервером

Точка доступа использует порт, TLS-сертификат и адрес привязки веб-сервера. Если веб-сервер выключен (порт 0), она недоступна, и b4 пишет предупреждение при запуске. При включённом у веб-сервера переключателе Доступ из интернета точка доступа открыта из интернета вместе с интерфейсом.

Токен​

Кнопка Сгенерировать выдаёт токен из 64 символов. До сохранения конфигурации он не записывается.

Пока токен задан, только он и принимается на /api/mcp. Доступа больше ни к чему он не даёт: ни один другой маршрут API не принимает его как учётные данные.

MCP-токен переживает перезапуск

Если поле пустое, точка доступа переходит на авторизацию веб-интерфейса. Токен входа истекает через сутки и сбрасывается при каждом перезапуске, поэтому настроенное на него ИИ-приложение теряет доступ в течение суток или при ближайшем перезапуске. MCP-токен после перезапуска b4 продолжает работать.

По обычному HTTP токен виден

Токен передаётся в заголовке каждого запроса. Без 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/<имя> с переключателем рядом. Записей может быть несколько сразу, например роутер и локальный экземпляр, и включаются они независимо.

VS Code может не хранить токен в файле

Блок 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 и отключает проверку.