OPNsense MCP
OPNsense MCP
Удалённый сервер Model Context Protocol для MVC-API OPNsense с упором на безопасность. Он предоставляет удалённым агентам транспорт Streamable HTTP с сохранением состояния, использует собственную HTTP Basic-аутентификацию API при обращении к OPNsense и блокирует запрос в безопасном режиме (fail closed), когда не может однозначно определить, что команда OPNsense предназначена только для чтения.
Один экземпляр сервера соответствует одному межсетевому экрану OPNsense. URL межсетевого экрана и учётные данные API остаются в окружении сервера; агенты аутентифицируются в MCP с помощью отдельного bearer-токена и не могут перенаправлять запросы на произвольные сетевые цели. При управлении несколькими устройствами разворачивайте по одному изолированному экземпляру на каждый межсетевой экран.
Архитектура
Remote agent --HTTPS + MCP bearer token--> OPNsense MCP --HTTPS + API key/secret--> OPNsenseКонечная точка MCP использует актуальный транспорт Streamable HTTP по пути /mcp. Сеансы сохраняют состояние, поэтому одноразовые планы изменений остаются привязанными к MCP-сеансу агента. Число сеансов ограничено, они истекают после бездействия и проходят аутентификацию при каждом HTTP-запросе.
Встроенный HTTP-листенер предназначен для размещения за обратным TLS-прокси, контроллером входящего трафика, VPN или защищённой overlay-сетью. Не открывайте его порт с обычным HTTP напрямую в недоверенную сеть.
Модель API OPNsense
OPNsense направляет запросы API следующим образом:
/api/<module>/<controller>/<command>/<parameter...>Важные с точки зрения автоматизации особенности:
Ключи API используют проверку подлинности HTTP Basic: ключ — как имя пользователя, секрет — как пароль.
Доступ по-прежнему ограничивается привилегиями ACL OPNsense владельца ключа.
Запросы и большинство ответов имеют формат JSON. Скачиваемые файлы и потоки могут быть не JSON.
GETиPOSTне сопоставляются напрямую с безопасными и небезопасными операциями. Некоторые операции чтения используютPOST, а некоторые изменения —GET.Контроллеры изменяемых моделей обычно предоставляют операции
get,search,add,set,delиtoggle.Записи моделей-массивов используют UUID. Запрос
getбез UUID часто возвращает пустую запись, заполненную значениями по умолчанию.Успешное изменение модели обычно записывает отложенную (staged) конфигурацию. Для её активации нужен отдельный вызов
applyилиreconfigure.Записи моделей возвращают значения вида
{"result":"saved"}или{"result":"failed","validations":...}; HTTP 200 сам по себе не доказывает успех на уровне семантики.Блокировка конфигурации OPNsense, проверка моделей, контекст ревизий и проверки ACL выполняются на стороне сервера, и их не следует обходить.
Официальные справочники:
https://docs.opnsense.org/development/frontend/controller.html
https://docs.opnsense.org/development/frontend/models_fieldtypes.html
Модель безопасности
opnsense_request принимает только команды, отнесённые к операциям чтения. Команда, на которой работает классификация, зависит от самой команды, а не от её HTTP-метода.
Изменяющие операции выполняются двумя инструментами:
opnsense_plan_changeсообщает точный запрос и его риск, не обращаясь к OPNsense.opnsense_execute_changeтребует соответствующий одноразовый токен, истекающий через пять минут.
Классы риска разделяют отложенные записи, активацию, разрушительные операции с сервисами и прошивкой, а также катастрофические операции сброса/восстановления. Неизвестные команды считаются мутациями и переводят систему в безопасный режим отказа (fail closed).
Режим записи управляется вне агента:
disabledразрешает только чтение.planразрешает анализ мутаций, но никогда не создаёт токен выполнения.enabledразрешает выполнение при наличии подходящего токена.
Используйте выделенного пользователя OPNsense и предоставьте ему только те результатные привилегии, которые требуются вашим инструментам. В развертываниях только с чтением также добавьте OPNsense разрешение System: Deny config write (user-config-readonly).
Курируемые инструменты чтения
Защищённый универсальный клиент дополнен фиксированными инструментами чтения для типовых задач:
opnsense_get_firewall_logsчитает структурированные события пакетного фильтра.opnsense_get_logsчитает ограниченные страницы из основных журналов и журналов служб, включая системные журналы, configd, шлюзов, VPN, DNS, DHCP, IDS, маршрутизации и веб-интерфейса.opnsense_list_firewall_rulesчитает правила фильтрации, доступные API автоматизации.opnsense_list_nat_rulesчитает правила трансляции для адреса назначения, источника, схемы один-к-одному или NPT.opnsense_get_route_tableчитает либо текущую таблицу маршрутизации ядра, либо настроенные статические маршруты.
These tools напрямую обращаются к фиксированным конечным точкам запросов. Они не могут выбирают сопутствующие изменяющие действия, такие как очистка журналов, сброс сессий, изменение правил или применение конфигурации. Результаты по-прежнему ограничены привилегиями ACL пользователя API в OPNsense.
Настройка
npm install
npm run buildНастройте окружение по образцу .env.example. Файлы окружения не загружаются автоматически и игнорируются Git. Сгенерируйте отдельный MCP-токен командой openssl rand -hex 32; не повторно используйте учётные данные OPNsense API.
Предпочтение отдавайте публичному доверенному сертификату, либо задайте OPNSENSE_CA_FILE, указав сертификат частного удостоверяющего центра. Параметр OPNSENSE_TLS_VERIFY=false предназначен только для изолированной разработки.
Запустите удалённый сервер на loopback-адресе для локального TLS-прокси:
OPNSENSE_URL=https://firewall.example \
OPNSENSE_API_KEY=... \
OPNSENSE_API_SECRET=... \
MCP_AUTH_TOKEN=<random-token-at-least-32-characters> \
node dist/index.jsURL MCP — http://127.0.0.1:3000/mcp. Опубликуйте его как HTTPS через обратный прокси и передавайте токен так:
Authorization: Bearer <MCP_AUTH_TOKEN>Пример конфигурации удалённого клиента для клиентов с поддержкой URL и произвольных заголовков:
{
"mcpServers": {
"opnsense": {
"url": "https://mcp.example.com/mcp",
"headers": {
"Authorization": "Bearer ${MCP_AUTH_TOKEN}"
}
}
}
}Форматы конфигурации клиентов различаются. Храните токен в секретном хранилище клиента, а не в конфигурационном файле.
Docker Compose
compose.yaml привязывает порт 3000 к loopback-адресу хоста, что позволяет обратному п Proxy безопасно завершать TLS.
export OPNSENSE_URL=https://firewall.example
export OPNSENSE_API_KEY=...
export OPNSENSE_API_SECRET=...
export MCP_AUTH_TOKEN="$(openssl rand -hex 32)"
export MCP_ALLOWED_HOSTS=mcp.example.com
docker compose up -d --buildПри прямом подключении к localhost:3000 во время разработки включайте localhost в переменную MCP_ALLOWED_HOSTS. Неаутентифицированная конечная точка проверки состояния доступна по пути /health и не раскрывает сведения о целевом сервере или учётных данных.
Безопасность удалённого доступа
MCP_AUTH_TOKENобязателен для HTTP-транспорта и должен содержать минимум 32 символа.MCP_ALLOWED_HOSTSобязателен привязке к адресу за пределами loopback и предотвращает DNS-ребендинг через заголовок Host.Запросы с браузерным заголовком Origin отклоняются, если в
MCP_ALLOWED_ORIGINSнет точного значения источника.MCP_MAX_SESSIONS,MCP_SESSION_TTL_MSиMCP_RATE_LIMIT_PER_MINUTEограничивают потребление ресурсов удалёнными клиентами.Сохраняйте
OPNSENSE_TLS_VERIFY=true. Для внутреннего удостоверяющего центра используйтеOPNSENSE_CA_FILE, а не отключение проверки.Сохраняйте
OPNSENSE_WRITE_MODE=disabledдля развёртываний только для мониторинга.Ограничьте пользователя API OPNsense действующими привилегиями ACL и используйте
user-config-readonly, где это уместно.Размещайте конечную точку MCP за HTTPS, политикой межуточного экрана и, желательно, VPN или частной сетью.
MCP_ALLOW_UNAUTHENTICATED=true существует только для изолированной локальной разработки и не должен использоваться на удалённо доступном листенере.
Совместимость со Stdio
Local клиенты могут по-прежнему запускать сервер как подпроцесс:
OPNSENSE_URL=https://firewall.example \
OPNSENSE_API_KEY=... \
OPNSENSE_API_SECRET=... \
MCP_TRANSPORT=stdio \
node dist/index.jsКонфигурация
OPNSENSE_URL: фиксированный базовый URL межсетевого экрана.OPNSENSE_API_KEY: API-ключ для выделенного пользователя OPNsense.OPNSENSE_API_SECRET: API-секрет для этого ключа.OPNSENSE_WRITE_MODE:disabled,planилиenabled.OPNSENSE_CA_FILE: необязательный PEM-файл частного удостоверяющего центра.OPNSENSE_TLS_VERIFY: по умолчаниюtrue.MCP_TRANSPORT: по умолчаниюhttpилиstdio.MCP_HOST: адрес листенера, по умолчанию127.0.0.1.MCP_PORT: порт листенера, по умолчанию3000.MCP_PATH: путь конечной точки MCP, по умолчанию/mcp.MCP_AUTH_TOKEN: Bearer-токен для удалённого агента.MCP_ALLOWED_HOSTS: список имён хостов через запятую, допустимых в HTTP-заголовке Host.MCP_ALLOWED_ORIGINS: допустимые sources браузера через запятую; пустое значение отклоняет браузерные запросы.MCP_MAX_SESSIONS: максимум одновременных сеансов, по умолчанию100.MCP_SESSION_TTL_MS: время бездействия сеанса до завершения, по умолчанию один час.MCP_RATE_LIMIT_PER_MINUTE: лимит HTTP-запросов клиента в минуту, по умолчанию120.
Например, для чтения информации о состоянии системаили через один из инструментов используется:
{
"module": "core",
"controller": "system",
"command": "status"
}Текущие ограничения
OPNsense не опубликовывает полную спецификацию OpenAPI. Сгенерированный перечень определяет маршруты и вероятные методы, но обычно не содержит схемы тел запросов.
Конечные точки плагинов доступны только при установленных пакетах и разрешающих их ACL-правилах.
Семантическая проверка ответов ещё не привязана к конкретным конечным точкам.
Лексический классификатор риска сознательно консервативен. Курируемые инструменты в перспективе должны опираться на проверенный манифест endpoints с явными схемами запросов и ответов.
Плановые токены снижают риск случайного и несоответствующего выполнения, но MCP-хосты должны по-прежнему выносить утверждение разрушительных инструментов на решение человека.
Удалённая аутентификация сейчас использует единый статический Bearer-токен для всего развёртывания, а не отдельный сервер авторизации OAuth. Для агентов с разными идентификаторами используйте отдельные развёрт или аутентифицирующий обратный прокси.
Состояние сеансов хранится в памяти и не разделяется между репликами. Не требуется никакого внешнего задания: добавьте внешнее хранилище сеансов и привязку маршрутизации, прежде чем запускать более одного реплика; иначе запускайте одну.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Remote MCP for A2A caller identity, scope policy, verdict receipts, and audit history.
Remote MCP for Android CLI agent build gate, structured receipts, audit logs, and reviewer-ready evi
Remote MCP for Copilot CLI switch gate MCP, structured receipts, audit logs, and reviewer-ready evid
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Ethereal-Jay/opnsense-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server