- Операторы (вы или приложение macOS): прямое подключение по WebSocket через LAN/Tailnet — самый простой вариант, когда Gateway доступен; туннелирование SSH — универсальный резервный вариант.
- Узлы (iOS/Android и другие устройства): подключаются к WebSocket Gateway (через LAN/Tailnet или туннель SSH).
Основная идея
По умолчанию WebSocket Gateway привязывается к loopback на порту18789 (gateway.port). Для удалённого использования либо откройте к нему доступ через Tailscale Serve / доверенную привязку LAN-Tailnet, либо перенаправьте loopback-порт через SSH.
Варианты топологии
Для конфигураций с постоянно работающим Gateway и ноутбуком рекомендуется сохранять
gateway.bind: "loopback" и использовать Tailscale Serve для интерфейса управления либо доверенную привязку LAN/Tailnet с gateway.remote.transport: "direct". Туннель SSH — резервный вариант, работающий с любой машины.
Поток команд (что где выполняется)
Один Gateway управляет состоянием и каналами; узлы являются периферийными устройствами. Пример (сообщение Telegram направляется инструменту узла):- Сообщение Telegram поступает в Gateway.
- Gateway запускает агента, который решает, нужно ли вызывать инструмент узла.
- Gateway вызывает узел через WebSocket Gateway (
node.invokeRPC). - Узел возвращает результат; Gateway отвечает в Telegram.
Туннель SSH (CLI и инструменты)
openclaw health и openclaw status --deep обращаются к удалённому Gateway через ws://127.0.0.1:18789. openclaw gateway status, openclaw gateway health, openclaw gateway probe и openclaw gateway call также могут обращаться к перенаправленному URL через --url.
Замените
18789 настроенным значением gateway.port (или --port / OPENCLAW_GATEWAY_PORT).Удалённые настройки CLI по умолчанию
Сохраните удалённую цель, чтобы команды CLI использовали её по умолчанию:ws://127.0.0.1:18789 и сначала откройте туннель SSH. При использовании транспорта с туннелем SSH в приложении macOS обнаруженное имя хоста Gateway указывается в gateway.remote.sshTarget (user@host или user@host:port); gateway.remote.url остаётся URL локального туннеля. Если удалённый порт отличается от локального, задайте gateway.remote.remotePort.
По умолчанию проверка ключа хоста выполняется строго (gateway.remote.sshHostKeyPolicy: "strict"). Задайте значение "openssh", чтобы вместо этого использовать действующую конфигурацию OpenSSH; перед включением проверьте пользовательские и системные настройки SSH.
Для Gateway, уже доступного в доверенной LAN или Tailnet, используйте прямой режим:
Приоритет учётных данных
Определение учётных данных Gateway следует единому контракту для путей вызова, проверки и состояния, а также мониторинга подтверждений выполнения в Discord. Хост узла использует тот же контракт с одним исключением для локального режима (он игнорируетgateway.remote.*).
- Явные учётные данные (
--token,--passwordилиgatewayTokenинструмента) всегда имеют приоритет в путях вызова, принимающих явные данные аутентификации. - Безопасность переопределения URL:
- CLI
--urlникогда не использует неявные учётные данные из конфигурации или окружения. - Переменная окружения
OPENCLAW_GATEWAY_URLможет использовать только учётные данные из окружения (OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD).
- CLI
- Настройки локального режима по умолчанию:
- токен:
OPENCLAW_GATEWAY_TOKEN->gateway.auth.token->gateway.remote.token(удалённое резервное значение используется только тогда, когда локальный токен не задан) - пароль:
OPENCLAW_GATEWAY_PASSWORD->gateway.auth.password->gateway.remote.password(удалённое резервное значение используется только тогда, когда локальный пароль не задан)
- токен:
- Настройки удалённого режима по умолчанию:
- токен:
gateway.remote.token->OPENCLAW_GATEWAY_TOKEN->gateway.auth.token - пароль:
OPENCLAW_GATEWAY_PASSWORD->gateway.remote.password->gateway.auth.password
- токен:
- Исключение локального режима хоста узла:
gateway.remote.token/gateway.remote.passwordигнорируются. - Проверки токена при удалённой проверке/получении состояния по умолчанию выполняются строго: при работе с удалённым режимом они используют только
gateway.remote.token(без перехода к локальному токену). - Переопределения Gateway через окружение используют только
OPENCLAW_GATEWAY_*.
Удалённый доступ к интерфейсу чата
У WebChat нет отдельного HTTP-порта; интерфейс чата SwiftUI подключается непосредственно к WebSocket Gateway.- Перенаправьте
18789через SSH (см. выше), затем подключите клиенты кws://127.0.0.1:18789. - Для прямого режима LAN/Tailnet подключите клиенты к настроенному частному URL
ws://или защищённому URLwss://. - В macOS удалённый режим приложения автоматически управляет выбранным транспортом.
Удалённый режим приложения macOS
Приложение строки меню macOS управляет всей конфигурацией целиком: удалёнными проверками состояния, WebChat и перенаправлением голосовой активации. Инструкция: удалённый доступ в macOS.Правила безопасности (удалённый доступ/VPN)
Оставляйте Gateway привязанным только к loopback, если не уверены, что требуется другая привязка.- Loopback + SSH/Tailscale Serve — самый безопасный вариант по умолчанию (без публичного доступа).
- Незашифрованный
ws://разрешён для loopback, частных/LAN-адресов (RFC 1918), link-local, CGNAT, хостов.localи.ts.net. Публичные удалённые хосты должны использоватьwss://. - Привязки не к loopback (
lan/tailnet/customилиauto, когда loopback недоступен) должны использовать аутентификацию Gateway: токен, пароль или обратный прокси с поддержкой идентификации иgateway.auth.mode: "trusted-proxy". gateway.remote.token/.passwordявляются источниками учётных данных клиента; сами по себе они не настраивают аутентификацию сервера.- Локальные пути вызова могут использовать
gateway.remote.*как резервный вариант, только еслиgateway.auth.*не задан. - Если
gateway.auth.token/gateway.auth.passwordявно настроен через SecretRef и не разрешается, разрешение завершается отказом (без маскирующего удалённого резервного варианта). gateway.remote.tlsFingerprintзакрепляет удалённый сертификат TLS дляwss://, в том числе в прямом режиме macOS. Без сохранённого отпечатка macOS закрепляет сертификат только при первом использовании после успешной стандартной проверки системного доверия; для Gateway с самоподписанным сертификатом или сертификатом частного центра сертификации требуется явный отпечаток либо удалённое подключение через SSH.- Tailscale Serve может аутентифицировать трафик интерфейса управления/WebSocket с помощью заголовков идентификации, когда
gateway.auth.allowTailscale: true. Конечные точки HTTP API не используют эту аутентификацию по заголовкам и вместо этого следуют обычному режиму HTTP-аутентификации Gateway. Этот поток без токена предполагает, что хост Gateway является доверенным; задайте значениеfalse, чтобы везде использовать аутентификацию с общим секретом. - Аутентификация через доверенный прокси по умолчанию предполагает прокси с поддержкой идентификации, привязанный не к loopback. Для обратных прокси на том же хосте через loopback требуется явно задать
gateway.auth.trustedProxy.allowLoopback = true. - Рассматривайте управление из браузера как операторский доступ: только через tailnet и с осознанным сопряжением узлов.
macOS: постоянный туннель SSH через LaunchAgent
Для клиентов macOS проще всего организовать постоянное подключение с помощью записи конфигурации SSHLocalForward и LaunchAgent, который поддерживает туннель после перезагрузок и сбоев.
Шаг 1: добавьте конфигурацию SSH
Измените~/.ssh/config:
<REMOTE_IP> и <REMOTE_USER> своими значениями.
Шаг 2: скопируйте ключ SSH (однократно)
Шаг 3: настройте токен Gateway
gateway.remote.password. OPENCLAW_GATEWAY_TOKEN по-прежнему допустим как переопределение на уровне оболочки, но для постоянной настройки удалённого клиента следует использовать gateway.remote.token / gateway.remote.password.
Шаг 4: создайте LaunchAgent
Сохраните как~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist:
Шаг 5: загрузите LaunchAgent
Если у вас остался LaunchAgent
com.openclaw.ssh-tunnel от старой конфигурации, выгрузите и удалите его.