Gateway
Descoberta Bonjour
O OpenClaw pode usar o Bonjour (mDNS/DNS-SD) para descobrir um gateway ativo (endpoint WebSocket). A busca multicast local. é uma conveniência exclusiva da LAN: o Plugin bonjour incluído é responsável pela publicidade na LAN, iniciando automaticamente em hosts macOS e sendo opcional no Linux, Windows e em implantações de gateway em contêineres. O mesmo beacon também pode ser publicado por meio de um domínio DNS-SD de longa distância configurado para descoberta entre redes. A descoberta funciona em regime de melhor esforço e não substitui a conectividade baseada em SSH ou Tailnet.
Bonjour de longa distância (DNS-SD unicast) pelo Tailscale
Se o Node e o gateway estiverem em redes diferentes, o mDNS multicast não poderá atravessar o limite entre elas. Mantenha a mesma experiência de descoberta alternando para DNS-SD unicast ("Bonjour de longa distância") pelo Tailscale:
- Execute um servidor DNS no host do gateway, acessível pela Tailnet.
- Publique registros DNS-SD para
_openclaw-gw._tcpem uma zona dedicada (exemplo:openclaw.internal.). - Configure o DNS dividido do Tailscale para que o domínio escolhido seja resolvido por esse servidor DNS para os clientes, incluindo o iOS.
O openclaw.internal. acima é apenas um exemplo — o OpenClaw aceita qualquer domínio de descoberta. Os Nodes iOS/Android buscam tanto em local. quanto no domínio de longa distância configurado.
Configuração do Gateway
{ gateway: { bind: "tailnet" }, // somente Tailnet (recomendado) discovery: { wideArea: { enabled: true, domain: "openclaw.internal" } },}discovery.wideArea.domain também aceita a variável de ambiente OPENCLAW_WIDE_AREA_DOMAIN como alternativa quando não está definido.
Configuração única do servidor DNS (host do gateway, somente macOS)
openclaw dns setup --applyEsse comando é exclusivo do macOS e requer o Homebrew e uma conexão ativa com o Tailscale. Ele instala o CoreDNS (brew install coredns) e o configura para:
- escutar na porta 53 somente nas interfaces Tailscale do gateway
- servir o domínio escolhido (exemplo:
openclaw.internal.) a partir de~/.openclaw/dns/<domain>.db
Primeiro, execute sem --apply para visualizar o plano (domínio, caminho do arquivo de zona, IP da Tailnet detectado e configuração recomendada) sem instalar nada.
Valide em uma máquina conectada à Tailnet:
dns-sd -B _openclaw-gw._tcp openclaw.internal.dig @<TAILNET_IPV4> -p 53 _openclaw-gw._tcp.openclaw.internal PTR +shortConfigurações de DNS do Tailscale
No console de administração do Tailscale:
- Adicione um servidor de nomes que aponte para o IP da Tailnet do gateway (UDP/TCP 53).
- Adicione o DNS dividido para que seu domínio de descoberta use esse servidor de nomes.
Depois que os clientes aceitarem o DNS da Tailnet, os Nodes iOS e a descoberta pela CLI poderão buscar _openclaw-gw._tcp no domínio de descoberta sem multicast.
Segurança do listener do Gateway
Por padrão, a porta WS do gateway (18789) é vinculada à interface de loopback. Para acesso por LAN/Tailnet, configure explicitamente o vínculo e mantenha a autenticação ativada. Para configurações exclusivas da Tailnet, defina gateway.bind: "tailnet" em ~/.openclaw/openclaw.json e reinicie o gateway (ou o aplicativo da barra de menus do macOS).
O que é anunciado
Somente o gateway anuncia _openclaw-gw._tcp. A publicidade multicast na LAN vem do Plugin bonjour incluído quando ele está ativado; a publicação de DNS-SD de longa distância continua sob responsabilidade do gateway.
Tipos de serviço
_openclaw-gw._tcp- beacon de transporte do gateway, usado pelos Nodes macOS/iOS/Android.
Chaves TXT (dicas não confidenciais)
| Chave | Quando está presente |
|---|---|
role=gateway |
Sempre. |
displayName=<friendly name> |
Sempre. |
lanHost=<hostname>.local |
Sempre. |
gatewayPort=<port> |
Sempre (WS + HTTP do gateway). |
transport=gateway |
Sempre. |
gatewayTls=1 |
Somente quando o TLS está ativado. |
gatewayTlsSha256=<sha256> |
Somente quando o TLS está ativado e uma impressão digital está disponível. |
gatewayDirectReachable=1 |
Somente quando o gateway está diretamente acessível (não apenas por um caminho de retransmissão/proxy). |
canvasPort=<port> |
Somente quando o host de canvas está ativado; atualmente, é igual a gatewayPort. |
tailnetDns=<magicdns> |
Somente no modo completo do mDNS; dica opcional quando a Tailnet está disponível. |
sshPort=<port> |
Somente no modo completo; omitida nos modos mínimo e desativado. |
cliPath=<path> |
Somente no modo completo; omitida nos modos mínimo e desativado. |
Observações de segurança:
- Os registros TXT do Bonjour/mDNS não são autenticados. Os clientes não devem tratar os dados TXT como roteamento autoritativo.
- Os clientes devem fazer o roteamento usando o endpoint de serviço resolvido (SRV + A/AAAA). Trate
lanHost,tailnetDns,gatewayPortegatewayTlsSha256apenas como dicas. - O direcionamento automático por SSH também deve usar o host de serviço resolvido, não dicas somente de TXT.
- A fixação de TLS nunca deve permitir que um
gatewayTlsSha256anunciado substitua uma fixação armazenada anteriormente. - Os Nodes iOS/Android devem tratar conexões diretas baseadas em descoberta como exclusivas de TLS e exigir confirmação explícita do usuário antes de confiar em uma impressão digital pela primeira vez.
Depuração no macOS
Ferramentas integradas:
# Buscar instânciasdns-sd -B _openclaw-gw._tcp local. # Resolver uma instância (substitua <instance>)dns-sd -L "<instance>" _openclaw-gw._tcp local.Se a busca funcionar, mas a resolução falhar, geralmente o problema está em uma política da LAN ou no resolvedor mDNS.
Depuração nos logs do Gateway
O gateway grava um arquivo de log rotativo (exibido na inicialização como gateway log file: ...). Procure linhas com bonjour:, especialmente:
bonjour: advertise failed ...bonjour: suppressing ciao netmask assertion ...bonjour: ... name conflict resolved/hostname conflict resolved
O OpenClaw inicia cada serviço Bonjour uma vez e deixa a sondagem, as novas tentativas, a resolução de conflitos de nome e a republicação após mudanças de interface a cargo do respondente mDNS. Isso evita tentativas de publicação sobrepostas durante alterações normais da rede. Mensagens internas repetidas de autossondagem são suprimidas para impedir que inundem o log do gateway.
Quando vários gateways OpenClaw anunciam a partir do mesmo host, o Bonjour pode acrescentar sufixos como (2) ou (3) para manter os nomes das instâncias de serviço exclusivos. Esses sufixos são parte normal da resolução de conflitos e não indicam supervisão OCM duplicada.
O Bonjour usa o nome de host do sistema para o host .local anunciado quando ele é um rótulo DNS válido. Se o nome de host do sistema contiver espaços, sublinhados ou outro caractere inválido para rótulos DNS, o OpenClaw usará openclaw.local como alternativa. Defina OPENCLAW_MDNS_HOSTNAME=<name> antes de iniciar o gateway quando precisar de um rótulo de host explícito.
Depuração no Node iOS
O Node iOS usa NWBrowser para descobrir _openclaw-gw._tcp.
Para capturar logs: Settings -> Gateway -> Advanced -> Discovery Debug Logs e, em seguida, Settings -> Gateway -> Advanced -> Discovery Logs -> reproduza o problema -> Copy. O log inclui transições de estado do navegador e alterações no conjunto de resultados.
Quando ativar o Bonjour
O Bonjour inicia automaticamente quando o gateway é iniciado com uma configuração vazia em hosts macOS, pois o aplicativo local e os Nodes iOS/Android próximos normalmente dependem da descoberta na mesma LAN.
Ative-o explicitamente quando a descoberta automática na mesma LAN for útil no Linux, Windows ou em outro host que não seja macOS:
openclaw plugins enable bonjourQuando ativado, o Bonjour usa discovery.mdns.mode para decidir quantos metadados TXT publicar; o mesmo modo controla dicas TXT opcionais nos registros DNS-SD de longa distância. Modos:
| Modo | Comportamento |
|---|---|
minimal (padrão) |
Somente as chaves TXT principais; omite sshPort, cliPath, tailnetDns. |
full |
Adiciona sshPort, cliPath, tailnetDns — use quando os clientes precisarem dessas dicas. |
off |
Suprime o multicast da LAN sem alterar a ativação do Plugin; o DNS-SD de longa distância ainda pode publicar o beacon mínimo quando discovery.wideArea.enabled for verdadeiro. |
Quando desativar o Bonjour
Mantenha o Bonjour desativado quando a publicidade multicast na LAN for desnecessária, indisponível ou prejudicial — casos comuns incluem servidores que não sejam macOS, redes bridge do Docker, WSL ou uma política de rede que descarte multicast mDNS. O gateway continua acessível pela URL publicada, por SSH, Tailnet ou DNS-SD de longa distância; somente a descoberta automática na LAN fica indisponível.
Use a substituição por variável de ambiente para problemas específicos da implantação (é segura para imagens do Docker, arquivos de serviço, scripts de inicialização e depuração pontual — ela desaparece quando o ambiente deixa de existir):
OPENCLAW_DISABLE_BONJOUR=1Use a configuração do Plugin quando quiser desativar intencionalmente o Plugin de descoberta na LAN incluído nessa configuração do OpenClaw:
openclaw plugins disable bonjourArmadilhas do Docker
O Plugin Bonjour incluído desativa automaticamente a publicidade multicast na LAN em contêineres detectados quando OPENCLAW_DISABLE_BONJOUR não está definido. Em geral, as redes bridge do Docker não encaminham multicast mDNS (224.0.0.251:5353) entre o contêiner e a LAN, portanto anunciar a partir do contêiner raramente faz a descoberta funcionar.
Armadilhas:
- O Bonjour inicia automaticamente em hosts macOS e é opcional nos demais. Mantê-lo desativado não interrompe o gateway — apenas ignora a publicidade multicast na LAN.
- Desativar o Bonjour não altera
gateway.bind; o Docker continua usandoOPENCLAW_GATEWAY_BIND=lanpor padrão para que a porta publicada do host funcione. - Desativar o Bonjour não desativa o DNS-SD de longa distância. Use a descoberta de longa distância ou a Tailnet quando o gateway e o Node não estiverem na mesma LAN.
- Reutilizar o mesmo
OPENCLAW_CONFIG_DIRfora do Docker não mantém a política de desativação automática do contêiner. - Defina
OPENCLAW_DISABLE_BONJOUR=0somente para redes do host, macvlan ou outra rede na qual se saiba que o multicast mDNS passa; defina-o como1para forçar a desativação.
Solução de problemas com o Bonjour desativado
Se um Node deixar de descobrir automaticamente o gateway após a configuração do Docker:
-
Confirme se o gateway está em modo automático, forçadamente ativado ou forçadamente desativado:
bash docker compose config | grep OPENCLAW_DISABLE_BONJOUR -
Confirme se o próprio gateway está acessível pela porta publicada:
bash curl -fsS http://127.0.0.1:18789/healthz -
Use um destino direto quando o Bonjour estiver desativado:
- UI de controle ou ferramentas locais:
http://127.0.0.1:18789 - Clientes da LAN:
http://<gateway-host>:18789 - Clientes entre redes: MagicDNS da Tailnet, IP da Tailnet, túnel SSH ou DNS-SD de longa distância
- UI de controle ou ferramentas locais:
-
Se o Plugin Bonjour tiver sido ativado intencionalmente no Docker e a publicidade tiver sido forçada com
OPENCLAW_DISABLE_BONJOUR=0, teste o multicast a partir do host:bash dns-sd -B _openclaw-gw._tcp local.Se a busca não retornar resultados ou se os logs do Gateway mostrarem falhas repetidas de sondagem do ciao, restaure
OPENCLAW_DISABLE_BONJOUR=1e use uma rota direta ou pela Tailnet.
Modos de falha comuns
- O Bonjour não atravessa redes: use Tailnet ou SSH.
- Multicast bloqueado: algumas redes Wi-Fi desativam o mDNS.
- Anunciante travado em sondagem/anúncio: hosts com multicast bloqueado, bridges de contêineres, WSL ou mudanças frequentes de interface podem deixar o respondente em um estado não anunciado. O Gateway permanece disponível por rotas diretas, SSH, Tailnet ou DNS-SD de longa distância; desative o Bonjour da LAN com
discovery.mdns.mode: "off"ouOPENCLAW_DISABLE_BONJOUR=1quando o multicast não estiver disponível. - Rede bridge do Docker: o Bonjour é desativado automaticamente nos contêineres detectados. Defina
OPENCLAW_DISABLE_BONJOUR=0apenas para host, macvlan ou outra rede compatível com mDNS. - Suspensão/mudanças frequentes de interface: o macOS pode interromper temporariamente os resultados de mDNS; tente novamente.
- A busca funciona, mas a resolução falha: mantenha os nomes das máquinas simples (evite emojis ou pontuação) e reinicie o Gateway. O nome da instância de serviço é derivado do nome do host, portanto nomes excessivamente complexos podem confundir alguns resolvedores.
Nomes de instâncias com escape (\032)
O Bonjour/DNS-SD frequentemente aplica escape aos bytes nos nomes das instâncias de serviço como sequências decimais \DDD (espaços se tornam \032). Isso é normal no nível do protocolo; as interfaces devem decodificá-las para exibição (o iOS usa BonjourEscapes.decode).
Ativação / desativação / configuração
| Configuração | Efeito |
|---|---|
openclaw plugins enable bonjour |
Ativa o Plugin integrado de descoberta de LAN nos hosts em que ele não é ativado por padrão. |
openclaw plugins disable bonjour |
Desativa a publicidade multicast da LAN ao desativar o Plugin integrado. |
OPENCLAW_DISABLE_BONJOUR=1 (ou true/yes/on) |
Desativa a publicidade multicast da LAN sem alterar a configuração do Plugin. |
OPENCLAW_DISABLE_BONJOUR=0 (ou false/no/off) |
Força a ativação da publicidade multicast da LAN, inclusive dentro dos contêineres detectados. |
discovery.mdns.mode |
off | minimal (padrão) | full — consulte os modos acima. |
gateway.bind |
Controla o modo de vinculação do Gateway em ~/.openclaw/openclaw.json. |
OPENCLAW_SSH_PORT |
Substitui a porta SSH quando sshPort é anunciado (modo completo). |
OPENCLAW_TAILNET_DNS |
Publica uma indicação do MagicDNS no TXT quando o modo completo de mDNS está ativado. |
OPENCLAW_CLI_PATH |
Substitui o caminho da CLI anunciado (modo completo). |
Por padrão, os hosts macOS iniciam automaticamente o Plugin integrado de descoberta de LAN. Quando o Plugin Bonjour está ativado e OPENCLAW_DISABLE_BONJOUR não está definido, o Bonjour anuncia em hosts normais e é desativado automaticamente dentro dos contêineres detectados (Docker, máquinas Fly.io e ambientes de execução de contêineres comuns).
Documentação relacionada
- Política de descoberta e seleção de transporte: Descoberta
- Pareamento de Node + aprovações: Pareamento do Gateway