За фразой «OpenClaw SSH» прячутся две разные задачи, и путаница между ними — то место, где люди застревают. Первая — достучаться до самого OpenClaw: его дашборд работает на localhost, так что вы открываете его через SSH-туннель. Вторая — обратная: дать агенту OpenClaw выполнять команды на ваших собственных серверах. Этот пост про обе, и для второй показывает способ, который никогда не кладёт SSH-ключ туда, где агент может его прочитать.
Сразу одна оговорка: мы делаем Termalin — вариант без ключа из Части 2. OpenClaw — это self-hosted шлюз для агентов с открытым исходным кодом: он работает на машине, отдаёт веб-дашборд и ставит «навыки» (skills) из своего маркетплейса ClawHub. Другие подходы мы описываем так же честно, как хотели бы, чтобы описывали наш.
Две вещи, которые понимают под «OpenClaw SSH»
- Достучаться до OpenClaw по SSH. Дашборд привязан к localhost, так что вы пробрасываете его порт на свою машину. Это Часть 1.
- Дать OpenClaw дотянуться до ваших серверов. Вы хотите, чтобы агент выполнял команды на других машинах. Это Часть 2, и именно её стоит делать аккуратно.
Часть 1 — откройте дашборд OpenClaw через SSH-туннель
Шлюз OpenClaw привязывается к 127.0.0.1:18789 на той машине, где работает, — намеренно. Дашборд — это админская панель управления, а не публичный сайт. С ноутбука пробросьте этот порт поверх своего существующего входа по SSH:
ssh -N -o ServerAliveInterval=30 -L 18789:127.0.0.1:18789 user@vps
Затем откройте http://127.0.0.1:18789 в браузере. -N означает «без оболочки, только туннель»; ServerAliveInterval=30 не даёт соединению простаивать. Трафик идёт по SSH-сессии, которой вы уже доверяете, так что в интернет не выставляется ничего нового.
Не привязывайте шлюз к 0.0.0.0, чтобы обойтись без туннеля. Так вы выставляете панель управления агентом в публичный интернет, и тот, кто найдёт порт, получит агента. Документация самого OpenClaw говорит то же: используйте SSH-туннель, не выставляйте порт шлюза. Держите его на 127.0.0.1 и добирайтесь через SSH.
Когда туннель не подключается
«Connection refused», «check failed» или пустая страница обычно означают одно из:
- Шлюз не запущен или на другом порту. Проверьте на машине:
ss -tlnp | grep 18789. - Ваш локальный порт 18789 уже занят. Возьмите другой локальный порт:
-L 28789:127.0.0.1:18789, затем откройтеhttp://127.0.0.1:28789. - Вы получили оболочку вместо туннеля. Вы забыли
-N.
Больше случаев — в SSH: connection refused или timed out.
Держите туннель к дашборду поднятым
Простой туннель ssh -L обрывается, когда падает сеть. Для всегда поднятого туннеля используйте autossh или небольшую службу systemd — или менеджер туннелей, который переподключается за вас. Механика локальных и удалённых пробросов разобрана в проброс портов и туннели SSH (на английском).
Часть 2 — дайте OpenClaw выполнять команды на других серверах
Это та часть, которую хотят большинство: OpenClaw видит, что служба упала, и чинит её на самой машине. Обычный путь — дать агенту SSH-ключ: ключ в ~/.ssh на машине со шлюзом или SSH-навык из ClawHub. Это работает. И это же схема с наибольшим риском, так что стоит разобраться в ней, прежде чем за неё хвататься.
Рискованная часть: ключ на шлюзе
Маркетплейс навыков — это код, который написали не вы, работающий рядом с вашим ключом. В начале 2026 года исследование «ClawHavoc» от Koi Security проверило 2857 навыков ClawHub и отметило 341 как вредоносный. Несколько были сделаны, чтобы красть SSH-ключи и учётные данные; большинство ставили стилер AMOS через поддельные «зависимости», а некоторые выкачивали собственный файл .env агента.
Добавьте отказ, свойственный любому агенту, — промпт-инъекцию с веб-страницы или из письма, которое он читает, — и следствие очевидно. Один SSH-ключ на шлюзе — это полная оболочка на каждом хосте, который ему доверяет, достижимая всем, что способно направлять агента. Отозвать его — значит менять этот ключ на всех этих хостах.
Поэтому цель Части 2 — дать OpenClaw выполнять нужные вам команды без ключа, который он — или вредоносный навык — может стащить.
Путь без ключа: Connector, затем Termalin как удалённый MCP-сервер
Две части.
Сначала установите Connector от Termalin на каждый сервер, до которого OpenClaw должен дотягиваться. Это установка в одну строку и только на исходящих: он никогда не слушает порт, поэтому работает за NAT или CGNAT и ничего не требует открывать в файрволе. При подключении сервера его sshd настраивается доверять удостоверяющему центру SSH (CA) Termalin, и каждый вход затем использует краткосрочный сертификат, выпущенный для вашего аккаунта. На машине не лежит долгоживущий ключ, и ни один не передаётся агенту.
Затем добавьте Termalin в OpenClaw как удалённый MCP-сервер. MCP (на английском) — это то, как OpenClaw общается с инструментами, которые не поставляет сам. Облачный эндпоинт Termalin отдаёт ваши серверы, подключённые через Connector, как инструменты: hosts_list, ssh_exec, ssh_exec_many, чтение и запись по SFTP, server_metrics, alerts_list и другие.
OpenClaw читает конфиг в формате JSON5 из ~/.openclaw/openclaw.json и перечитывает его автоматически. Сначала одна тонкость: если опустить transport, текущий OpenClaw (2026.10.x) по умолчанию берёт SSE. Termalin говорит на Streamable HTTP, так что нужно задать "transport": "streamable-http", иначе соединение не установится.
Аутентифицироваться можно двумя способами.
API-ключ — хорош для шлюза, работающего на VPS. Создайте ключ в веб-кабинете Termalin, ограничьте его область серверами, которых этот агент должен касаться, и положите значение в окружение как TERMALIN_API_KEY. Затем добавьте сервер одной командой:
openclaw mcp set termalin '{"url":"https://termal.in/api/v1/mcp","transport":"streamable-http","headers":{"Authorization":"Bearer ${TERMALIN_API_KEY}"}}'
Или впишите то же самое в ~/.openclaw/openclaw.json:
{
"mcp": {
"servers": {
"termalin": {
"url": "https://termal.in/api/v1/mcp",
"transport": "streamable-http",
"headers": {
"Authorization": "Bearer ${TERMALIN_API_KEY}"
}
}
}
}
}
Используйте ссылку ${TERMALIN_API_KEY}, а не сам ключ. openclaw mcp doctor предупреждает, когда находит токен, вписанный прямо в headers, а значения заголовков в его логах скрыты.
OAuth — хорош, когда входит человек. Направьте сервер на https://termal.in/mcp, задайте auth в oauth и войдите:
openclaw mcp set termalin '{"url":"https://termal.in/mcp","transport":"streamable-http","auth":"oauth"}'
openclaw mcp login termalin
openclaw mcp doctor termalin --probe
openclaw mcp login печатает URL авторизации и ждёт колбэк на loopback (http://127.0.0.1:<port>/callback). OAuth в Termalin принимает такие loopback-редиректы, так что вы подтверждаете вход в браузере, и токен сохраняется — вставлять нечего. Если OpenClaw работает на headless-VPS, а браузер у вас на ноутбуке, завершите вручную через openclaw mcp login termalin --code <code>. Учтите: при заданном auth: "oauth" OpenClaw игнорирует любой статический заголовок Authorization для этого сервера, так что выберите один способ.
В любом случае openclaw mcp doctor termalin --probe подтверждает, что сервер достижим, и перечисляет его инструменты, после чего инструменты Termalin появляются у агента. (Сервер можно добавить и из Control UI: chat → + → Connectors → Add MCP server…, только для админа.)
Сначала решите, что ему можно, и логируйте всё
Постоянно работающий агент должен начинать с малого. В карточке «AI-приложения» в Termalin задайте этому подключению политику команд: только чтение, список разрешённых точных команд или полный доступ. Начните с только чтения — «как там мои серверы», диск, упавшие службы, последние строки лога — через server_metrics и alerts_list. Затем расширьте до узкого списка разрешённых, затем до записи, по одному шагу за раз. Логика жёстких списков разрешённых команд для каждого хоста (на английском) применима здесь напрямую.
Всё, что запускает агент, зафиксировано. Каждая команда попадает в запись сессий, в живую сетку наблюдения и в журнал аудита (на английском), помеченная как команда агента. Поскольку секрет — это учётные данные Termalin, а не SSH-ключ, размазанный по хостам, выключить агента — это один переключатель, а не ротация ключа на каждом сервере. Если один OpenClaw используют несколько человек, OpenClaw может дать каждому отправителю отдельную идентичность (oauth.identity: "per-requester"), так что журнал аудита остаётся раздельным по людям.
Когда MCP-сервер не подключается
- Подключается, но не показывает инструментов, или падает на рукопожатии. Вы опустили
transport, и OpenClaw откатился на SSE. Задайте"transport": "streamable-http". - 401 Unauthorized. API-ключ отсутствует или вне области, либо вы на OAuth-URL (
/mcp), не выполнивopenclaw mcp login. Эндпоинт для ключа —/api/v1/mcp; эндпоинт OAuth —/mcp. ${TERMALIN_API_KEY}приходит пустым. Переменная не задана в окружении, где работает OpenClaw. Экспортируйте её там, где стартует шлюз.- Ожидаемого сервера нет в
hosts_list. На нём ещё нет Connector, либо он вне области ключа.
Запустите openclaw mcp status --verbose и openclaw mcp doctor termalin --probe, чтобы увидеть, какой этап падает.
Честные альтернативы
Путь без ключа — не единственный. Ещё два разумны, смотря что вам нужно.
Дать агенту ключ напрямую. Положите SSH-ключ в ~/.ssh на машине со шлюзом или установите SSH-навык из ClawHub (ssh-executor, ssh-full, sshx и другие), который читает ключ, пароль или запись из хранилища. Это настраивается быстрее всего и ни от чего облачного не зависит. Расплата — ровно тот риск, что описан выше: ключ может прочитать всё, что запускает агент, его досягаемость — каждый хост, который ему доверяет, а отзыв означает ротацию ключей на всех них. Если делаете так, используйте выделенный малопривилегированный ключ, жёстко ограничьте его через command= в authorized_keys и никогда не переиспользуйте свой личный ключ.
Поднять отдельный SSH-MCP-сервер, который держит ключ. Небольшой self-hosted MCP-сервер с инструментом ssh_exec держит ключ в своём собственном конфиге, вне контекста модели. Это реальное улучшение — утёкшая переписка больше не содержит учётных данных. Но большинство таких серверов поставляются без политики команд, без живого обзора и без журнала аудита, так что любой вызов инструмента может запустить что угодно на любом настроенном хосте, а ваша запись о случившемся — это то, что сообщит агент. Мы ранжировали эту и любую другую схему по тому, во что обходится компрометация, в доступе ИИ-агента по SSH: по радиусу поражения (на английском).
Вопросы и ответы
Поддерживает ли OpenClaw MCP? Да. Текущий OpenClaw (2026.10.x) подключается к удалённым MCP-серверам по HTTP. Добавьте сервер через openclaw mcp set или openclaw mcp add, либо из Control UI (chat → + → Connectors → Add MCP server…, только для админа). Для серверов вроде Termalin задайте "transport": "streamable-http", потому что иначе по умолчанию берётся SSE.
Может ли OpenClaw заходить на мой сервер по SSH? Может, двумя способами. Напрямую — если вы дадите ему ключ через exec-инструмент или SSH-навык из ClawHub. Или без ключа — подключив его к MCP-серверу, который держит доступ за него: связка Connector + MCP выше, где ключ ни разу не попадает к агенту.
Безопасно ли давать OpenClaw свой SSH-ключ? Относитесь к этому как к высокому риску. Ключ на шлюзе может прочитать любой навык или внедрённая инструкция, которой следует агент, а ClawHub уже поставлял навыки, созданные красть именно это (Koi Security отметила 341 вредоносный навык в начале 2026 года). Если без этого никак, используйте одноразовый малопривилегированный ключ с ограничениями command= — никогда не свой личный.
Как исправить «openclaw ssh connection refused»? Для туннеля к дашборду проверьте, что шлюз запущен и привязан к 127.0.0.1:18789 (ss -tlnp | grep 18789 на машине), убедитесь, что локальный порт свободен, и оставляйте -N в команде ssh -L. Больше случаев — в SSH: connection refused или timed out.
Нужно ли открывать какие-либо порты? Нет. Туннель к дашборду использует ваше существующее SSH-соединение, а Connector от Termalin работает только на исходящих — он никогда не слушает порт, так что работает за NAT и CGNAT без единого открытого в файрволе порта.
Termalin — кроссплатформенный SSH-клиент с облачным MCP-сервером, хранителем ключей и политикой агента для каждого хоста. Облачный эндпоинт и доступ через Connector входят в Pro ($10/мес, или $8/мес при оплате за год) и Team, с пробным периодом Pro на 14 дней и без карты — см. MCP, Connector или SSH для ИИ-агентов.