Gateway
Обнаружение Bonjour
OpenClaw может использовать Bonjour (mDNS/DNS-SD) для обнаружения активного Gateway (конечной точки WebSocket). Обнаружение через многоадресную рассылку local. — это удобная возможность только для LAN: встроенный плагин bonjour отвечает за объявление в LAN, автоматически запускаясь на узлах macOS и включаясь вручную в развёртываниях Gateway на Linux, Windows и в контейнерах. Тот же маяк также можно публиковать через настроенный домен глобального DNS-SD для обнаружения между сетями. Обнаружение выполняется по мере возможности и не заменяет подключение через SSH или Tailnet.
Глобальный Bonjour (одноадресный DNS-SD) через Tailscale
Если Node и Gateway находятся в разных сетях, многоадресный mDNS не может пересечь границу между ними. Сохраните тот же механизм обнаружения, переключившись на одноадресный DNS-SD («глобальный Bonjour») через Tailscale:
- Запустите DNS-сервер на узле Gateway, доступный через Tailnet.
- Опубликуйте записи DNS-SD для
_openclaw-gw._tcpв выделенной зоне (пример:openclaw.internal.). - Настройте раздельный DNS Tailscale, чтобы выбранный домен разрешался для клиентов, включая iOS, через этот DNS-сервер.
Приведённый выше openclaw.internal. — лишь пример: OpenClaw поддерживает любой домен обнаружения. Узлы iOS/Android просматривают как local., так и настроенный глобальный домен.
Конфигурация Gateway
{ gateway: { bind: "tailnet" }, // только tailnet (рекомендуется) discovery: { wideArea: { enabled: true, domain: "openclaw.internal" } },}discovery.wideArea.domain также принимает резервную переменную среды OPENCLAW_WIDE_AREA_DOMAIN, если значение не задано.
Однократная настройка DNS-сервера (узел Gateway, только macOS)
openclaw dns setup --applyЭта команда работает только в macOS и требует Homebrew и активного подключения Tailscale. Она устанавливает CoreDNS (brew install coredns) и настраивает его следующим образом:
- прослушивать порт 53 только на интерфейсах Tailscale узла Gateway
- обслуживать выбранный домен (пример:
openclaw.internal.) из~/.openclaw/dns/<domain>.db
Сначала запустите команду без --apply, чтобы просмотреть план (домен, путь к файлу зоны, обнаруженный IP-адрес Tailnet, рекомендуемую конфигурацию), ничего не устанавливая.
Проверьте с компьютера, подключённого к Tailnet:
dns-sd -B _openclaw-gw._tcp openclaw.internal.dig @<TAILNET_IPV4> -p 53 _openclaw-gw._tcp.openclaw.internal PTR +shortНастройки DNS Tailscale
В консоли администрирования Tailscale:
- Добавьте сервер имён, указывающий на IP-адрес Tailnet узла Gateway (UDP/TCP 53).
- Добавьте раздельный DNS, чтобы домен обнаружения использовал этот сервер имён.
После того как клиенты примут DNS Tailnet, узлы iOS и механизм обнаружения CLI смогут просматривать _openclaw-gw._tcp в вашем домене обнаружения без многоадресной рассылки.
Безопасность прослушивателя Gateway
Порт WS Gateway (по умолчанию 18789) по умолчанию привязывается к интерфейсу обратной петли. Для доступа через LAN/Tailnet явно задайте привязку и оставьте аутентификацию включённой. Для конфигураций только с Tailnet задайте gateway.bind: "tailnet" в ~/.openclaw/openclaw.json и перезапустите Gateway (или приложение строки меню macOS).
Что публикует объявления
Только Gateway публикует _openclaw-gw._tcp. Многоадресные объявления в LAN при включении поступают от встроенного плагина bonjour; публикация глобального DNS-SD остаётся в ведении Gateway.
Типы служб
_openclaw-gw._tcp— маяк транспорта Gateway, используемый узлами macOS/iOS/Android.
Ключи TXT (несекретные подсказки)
| Ключ | Когда присутствует |
|---|---|
role=gateway |
Всегда. |
displayName=<friendly name> |
Всегда. |
lanHost=<hostname>.local |
Всегда. |
gatewayPort=<port> |
Всегда (WS и HTTP Gateway). |
transport=gateway |
Всегда. |
gatewayTls=1 |
Только при включённом TLS. |
gatewayTlsSha256=<sha256> |
Только при включённом TLS и наличии отпечатка. |
gatewayDirectReachable=1 |
Только когда Gateway доступен напрямую (а не только через ретранслятор/прокси). |
canvasPort=<port> |
Только когда включён узел canvas; сейчас совпадает с gatewayPort. |
tailnetDns=<magicdns> |
Только полный режим mDNS; необязательная подсказка при наличии Tailnet. |
sshPort=<port> |
Только полный режим; отсутствует в минимальном и выключенном режимах. |
cliPath=<path> |
Только полный режим; отсутствует в минимальном и выключенном режимах. |
Примечания по безопасности:
- TXT-записи Bonjour/mDNS не аутентифицированы. Клиенты не должны считать TXT авторитетным источником маршрутизации.
- Клиенты должны выполнять маршрутизацию с помощью разрешённой конечной точки службы (SRV + A/AAAA). Считайте
lanHost,tailnetDns,gatewayPortиgatewayTlsSha256только подсказками. - Автоматический выбор цели SSH также должен использовать разрешённый узел службы, а не только подсказки TXT.
- При закреплении TLS объявленный
gatewayTlsSha256ни при каких условиях не должен переопределять ранее сохранённое закрепление. - Узлы iOS/Android должны рассматривать прямые подключения на основе обнаружения как доступные только через TLS и требовать явного подтверждения пользователя перед доверием отпечатку, полученному впервые.
Отладка в macOS
Встроенные инструменты:
# Просмотр экземпляровdns-sd -B _openclaw-gw._tcp local. # Разрешение одного экземпляра (замените <instance>)dns-sd -L "<instance>" _openclaw-gw._tcp local.Если просмотр работает, а разрешение — нет, обычно проблема связана с политикой LAN или преобразователем mDNS.
Отладка в журналах Gateway
Gateway записывает циклический файл журнала (при запуске его путь выводится как gateway log file: ...). Ищите строки bonjour:, особенно:
bonjour: advertise failed ...bonjour: suppressing ciao cancellation ...bonjour: ... name conflict resolved/hostname conflict resolvedbonjour: watchdog detected non-announced service ...bonjour: disabling advertiser after ... failed restarts ...
Сторожевой таймер считает активные состояния probing, announcing и недавние переименования из-за конфликтов незавершёнными. Если служба так и не достигает состояния announced, OpenClaw пересоздаёт компонент объявления, а после повторных сбоев отключает Bonjour для этого процесса Gateway вместо бесконечной повторной публикации объявлений.
Bonjour использует системное имя узла для объявляемого узла .local, если оно является допустимой DNS-меткой. Если системное имя узла содержит пробелы, символы подчёркивания или другие недопустимые для DNS-метки символы, OpenClaw использует резервное значение openclaw.local. Если требуется явная метка узла, задайте OPENCLAW_MDNS_HOSTNAME=<name> перед запуском Gateway.
Отладка на узле iOS
Узел iOS использует NWBrowser для обнаружения _openclaw-gw._tcp.
Чтобы собрать журналы: Settings -> Gateway -> Advanced -> Discovery Debug Logs, затем Settings -> Gateway -> Advanced -> Discovery Logs -> воспроизведите проблему -> Copy. Журнал содержит переходы состояний браузера и изменения набора результатов.
Когда следует включать Bonjour
Bonjour автоматически запускается при запуске Gateway с пустой конфигурацией на узлах macOS, поскольку локальное приложение и находящиеся рядом узлы iOS/Android часто используют обнаружение в одной LAN.
Включите его явно, если автоматическое обнаружение в одной LAN полезно на Linux, Windows или другом узле без macOS:
openclaw plugins enable bonjourКогда Bonjour включён, он использует discovery.mdns.mode, чтобы определить объём публикуемых метаданных TXT; тот же режим управляет необязательными подсказками TXT в записях глобального DNS-SD. Режимы:
| Режим | Поведение |
|---|---|
minimal (по умолчанию) |
Только основные ключи TXT; исключает sshPort, cliPath, tailnetDns. |
full |
Добавляет sshPort, cliPath, tailnetDns — используйте, когда клиентам нужны эти подсказки. |
off |
Подавляет многоадресную рассылку в LAN, не меняя состояние плагина; глобальный DNS-SD по-прежнему может публиковать минимальный маяк, когда discovery.wideArea.enabled равно true. |
Когда следует отключать Bonjour
Оставляйте Bonjour отключённым, если многоадресные объявления в LAN не нужны, недоступны или вредны — типичные случаи: серверы без macOS, сеть Docker типа bridge, WSL или сетевая политика, блокирующая многоадресную рассылку mDNS. Gateway остаётся доступен через опубликованный URL, SSH, Tailnet или глобальный DNS-SD; ненадёжным становится только автоматическое обнаружение в LAN.
Используйте переопределение через переменную среды для проблем конкретного развёртывания (безопасно для образов Docker, файлов служб, сценариев запуска и разовой отладки — оно исчезает вместе с окружением):
OPENCLAW_DISABLE_BONJOUR=1Используйте конфигурацию плагина, если намеренно хотите отключить встроенный плагин обнаружения в LAN для этой конфигурации OpenClaw:
openclaw plugins disable bonjourОсобенности Docker
Встроенный плагин Bonjour автоматически отключает многоадресные объявления в LAN в обнаруженных контейнерах, если OPENCLAW_DISABLE_BONJOUR не задано. Сети Docker типа bridge обычно не пересылают многоадресный трафик mDNS (224.0.0.251:5353) между контейнером и LAN, поэтому объявления из контейнера редко обеспечивают обнаружение.
Особенности:
- Bonjour автоматически запускается на узлах macOS, а в остальных системах включается вручную. Если оставить его отключённым, Gateway продолжит работать — будут пропущены только многоадресные объявления в LAN.
- Отключение Bonjour не изменяет
gateway.bind; Docker по-прежнему по умолчанию используетOPENCLAW_GATEWAY_BIND=lan, поэтому опубликованный порт узла работает. - Отключение Bonjour не отключает глобальный DNS-SD. Используйте глобальное обнаружение или Tailnet, когда Gateway и Node находятся не в одной LAN.
- Повторное использование того же
OPENCLAW_CONFIG_DIRвне Docker не сохраняет политику автоматического отключения контейнера. - Задавайте
OPENCLAW_DISABLE_BONJOUR=0только для сети узла, macvlan или другой сети, в которой многоадресный трафик mDNS гарантированно проходит; задайте значение1, чтобы принудительно отключить его.
Устранение неполадок отключённого Bonjour
Если после настройки Docker Node перестал автоматически обнаруживать Gateway:
-
Проверьте, в каком режиме работает Gateway: автоматическом, принудительно включённом или принудительно отключённом:
bash docker compose config | grep OPENCLAW_DISABLE_BONJOUR -
Убедитесь, что сам Gateway доступен через опубликованный порт:
bash curl -fsS http://127.0.0.1:18789/healthz -
Когда Bonjour отключён, используйте прямой адрес:
- Control UI или локальные инструменты:
http://127.0.0.1:18789 - Клиенты LAN:
http://<gateway-host>:18789 - Клиенты в других сетях: MagicDNS Tailnet, IP-адрес Tailnet, туннель SSH или глобальный DNS-SD
- Control UI или локальные инструменты:
-
Если вы намеренно включили плагин Bonjour в Docker и принудительно включили объявления с помощью
OPENCLAW_DISABLE_BONJOUR=0, проверьте многоадресную рассылку с узла:bash dns-sd -B _openclaw-gw._tcp local.Если результаты просмотра пусты или в журналах Gateway отображаются повторные отмены сторожевого таймера ciao, восстановите
OPENCLAW_DISABLE_BONJOUR=1и используйте прямой маршрут или маршрут Tailnet.
Распространённые режимы отказа
- Bonjour не работает между сетями: используйте Tailnet или SSH.
- Многоадресная рассылка заблокирована: в некоторых сетях Wi-Fi отключён mDNS.
- Средство объявления зависло на проверке или анонсировании: на хостах с заблокированной многоадресной рассылкой, мостами контейнеров, WSL или частыми изменениями интерфейсов средство объявления ciao может остаться в состоянии без опубликованного объявления. OpenClaw выполняет несколько повторных попыток, а затем отключает Bonjour для текущего процесса Gateway, вместо того чтобы бесконечно перезапускать средство объявления.
- Сеть мостового типа в Docker: Bonjour автоматически отключается в обнаруженных контейнерах. Устанавливайте
OPENCLAW_DISABLE_BONJOUR=0только для сети хоста, macvlan или другой сети с поддержкой mDNS. - Переход в спящий режим или изменения интерфейсов: macOS может временно перестать возвращать результаты mDNS; повторите попытку.
- Просмотр работает, но разрешение имён завершается ошибкой: используйте простые имена компьютеров (без эмодзи и знаков препинания), затем перезапустите Gateway. Имя экземпляра службы формируется из имени хоста, поэтому чрезмерно сложные имена могут сбивать с толку некоторые средства разрешения имён.
Экранированные имена экземпляров (\032)
Bonjour/DNS-SD часто экранирует байты в именах экземпляров служб в виде десятичных последовательностей \DDD (пробелы преобразуются в \032). На уровне протокола это нормально; пользовательские интерфейсы должны декодировать их для отображения (iOS использует BonjourEscapes.decode).
Включение, отключение и настройка
| Параметр | Результат |
|---|---|
openclaw plugins enable bonjour |
Включает встроенный плагин обнаружения в локальной сети на хостах, где он не включён по умолчанию. |
openclaw plugins disable bonjour |
Отключает многоадресное объявление в локальной сети путём отключения встроенного плагина. |
OPENCLAW_DISABLE_BONJOUR=1 (или true/yes/on) |
Отключает многоадресное объявление в локальной сети без изменения конфигурации плагина. |
OPENCLAW_DISABLE_BONJOUR=0 (или false/no/off) |
Принудительно включает многоадресное объявление в локальной сети, в том числе внутри обнаруженных контейнеров. |
discovery.mdns.mode |
off | minimal (по умолчанию) | full — см. описанные выше режимы. |
gateway.bind |
Управляет режимом привязки Gateway в ~/.openclaw/openclaw.json. |
OPENCLAW_SSH_PORT |
Переопределяет порт SSH, когда объявляется sshPort (полный режим). |
OPENCLAW_TAILNET_DNS |
Публикует подсказку MagicDNS в TXT, когда включён полный режим mDNS. |
OPENCLAW_CLI_PATH |
Переопределяет объявляемый путь CLI (полный режим). |
На хостах macOS встроенный плагин обнаружения в локальной сети по умолчанию запускается автоматически. Когда плагин Bonjour включён, а OPENCLAW_DISABLE_BONJOUR не задан, Bonjour публикует объявления на обычных хостах и автоматически отключается внутри обнаруженных контейнеров (Docker, машины Fly.io и распространённые среды выполнения контейнеров).
Связанные документы
- Политика обнаружения и выбор транспорта: Обнаружение
- Сопряжение Node и подтверждения: Сопряжение Gateway