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

MCP-сервер

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

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

Настраивается в Настройки -> API -> MCP-сервер.

Поля

20260817215201

ПолеОписание
Включить MCP-серверПубликует точку доступа на /api/mcp. По умолчанию выключено.
Разрешить изменение настроекПозволяет ИИ не только читать настройки, но и менять их. По умолчанию выключено. См. Изменение настроек.
MCP-токенКлюч, который предъявляют ИИ-приложения. Кнопка Создать генерирует его.
АдресАдрес, который вставляется в ИИ-приложение.
Обслуживается веб-сервером

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

Токен

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

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

Лучше задать токен, чем полагаться на вход в веб-интерфейс

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

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

Токен передаётся в заголовке каждого запроса. Без HTTPS его может прочитать и повторно использовать любой на пути следования. Настройте 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Версия, движок захвата, бэкенд файрвола, сколько сетов есть и включено, аптайм«Работает ли b4 и какой движок захвата активен?»
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Хвост лога ошибок и системных сообщений b4«Подними уровень лога до debug и покажи последние 50 строк.»
b4_metricsСчётчики пакетного движка«Какова текущая частота соединений и расход памяти?»
b4_diagnosticsОС, ядро, интерфейсы, бэкенд файрвола и установленные b4 группы правил«Правила файрвола b4 действительно установлены?»
b4_list_writable_pathsКакие настройки можно менять, с типами и допустимыми значениями«Что ты можешь изменить в сете video?»
b4_set_config_valueМеняет одну настройку и применяет её на лету«Переключи сет video на стратегию extsplit.»
b4_revert_last_changeВосстанавливает конфигурацию, какой она была до последнего изменения«Стало хуже, верни как было.»

Вместе с инструментами публикуется готовый промпт diagnose_domain. Приложения, поддерживающие промпты, показывают его отдельно. Он принимает домен и по порядку проводит модель через проверку статуса, покрытия, конфигурации и файрвола.

Два разных вопроса про домен

b4_check_domain отвечает, настроен ли домен в каком-нибудь сете. b4_recent_connections отвечает, дошёл ли трафик до b4 и какой сет совпал. Домен может быть настроен, но трафика по нему не будет - именно это отличает ошибку в целях от ошибки в маршрутизации.

Ещё b4 публикует по ресурсу на каждую документированную настройку с описанием того, что она делает. Несколько настроек b4 означают не то, что подсказывает их название, поэтому ответы модели, прочитавшей эти ресурсы, надёжнее ответов, выведенных из одних имён полей.

Что вырезается

Вывод инструментов может быть передан сторонней модели, поэтому учётные данные из ответов удаляются: пароль и имя пользователя веб-интерфейса, учётные данные SOCKS5, секреты MTProto, токен ipinfo, сам MCP-токен, а также имя пользователя и пароль прокси, который прописан в сете как вышестоящий.

Диагностика опознаёт сеть

В b4_diagnostics учётных данных нет, но он сообщает имя хоста, все адреса интерфейсов и действующий набор правил файрвола. Этого достаточно, чтобы опознать сеть, из которой он пришёл.

Изменение настроек

Пока Разрешить изменение настроек выключено, ИИ не может изменить в b4 ничего. Когда включено, доступными для записи становятся две области:

  • все настройки внутри сета: цели, фрагментация, faking, TCP и UDP, DNS, эскалация, маршрутизация
  • подсистемы MTProto и SOCKS5
  • настройки логирования, чтобы ИИ мог поднять уровень лога, воспроизвести проблему и прочитать результат

b4_list_writable_paths сообщает точные пути с их типами, текущими и допустимыми значениями, чтобы модели не приходилось угадывать путь.

Отклоняется независимо от этой настройки:

Что отклоняетсяПочему
Все учётные данныеВеб-интерфейс, SOCKS5, MTProto, вышестоящий прокси сета
Настройки веб-сервераПеренос или блокировка интерфейса убирает способ отменить изменение
Сами настройки MCPИИ не может расширить собственные права
Движок захвата пакетов и TUNПереключение под работающей сетью может отрезать машину
Бэкенд файрволаНеверное значение оставляет машину вообще без правил
Метки пакетов, таблицы маршрутизацииНа них держится собственный трафик b4
Идентификатор сетаНа него ссылаются цели эскалации
Каталог логов и расположение файлов геоданныхЭто расположение на диске, а не содержимое: неверный каталог логов тихо прекращает запись в файл, а неверный путь к геоданным разом опустошает все категории geosite
Отклонить путь - не то же самое, что закрыть доступ

Отклоняется только расположение, но никогда не содержимое. b4_logs_tail читает лог при любом значении каталога, а system.logging.level доступен для записи, так что модель может поднять уровень, воспроизвести проблему и прочитать лог, не имея возможности перенести файл туда, где она его не найдёт.

Граница проходит по обратимости, а не по чувствительности

Неверное значение внутри сета ломает часть сайтов - это видно и это обратимо. Неверный порт веб-сервера или движок захвата может оставить машину недоступной без пути назад. Всё из второй группы остаётся отклонённым, как бы полезно оно ни выглядело.

Области для записи заданы в бинарнике целыми поддеревьями, а исключения внутри них помечены прямо на полях, поэтому настройка, добавленная в b4 позже, недоступна для записи, пока её не разрешат отдельно.

Изменение проходит через тот же путь проверки и применения, что и веб-интерфейс. Недопустимый результат отклоняется, и ничего не сохраняется. Принятое изменение вступает в силу сразу, включая правила файрвола, если включение сета меняет набор перехватываемых портов. Инструмент сообщает прежнее и новое значение.

Списочные настройки заменяются целиком, а не дополняются

Запись доменов сета заменяет весь список. Модели следует прочитать текущее значение и вернуть его полностью; прежнее значение сообщается, чтобы изменение можно было отменить.

Отмена изменения

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