Gateway
Descoberta do Bonjour
O OpenClaw pode usar o Bonjour (mDNS/DNS-SD) para descobrir um Gateway ativo (endpoint WebSocket). A busca multicast em local. é uma conveniência restrita à LAN: o Plugin bonjour incluído é responsável pelo anúncio na LAN, iniciando automaticamente em hosts macOS e sendo opcional no Linux, Windows e em implantações de Gateway em contêineres. O mesmo sinalizador 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 na medida do possível 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 mudando 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 split DNS 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 estiver definido.
Configuração única do servidor DNS (host do Gateway, somente macOS)
openclaw dns setup --applyEste comando está disponível somente no macOS e exige 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 do Tailscale do Gateway
- atender ao domínio escolhido (exemplo:
openclaw.internal.) usando~/.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 split DNS 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 seu domínio de descoberta sem multicast.
Segurança do listener do Gateway
Por padrão, a porta WS do Gateway (18789) é vinculada ao local loopback. Para acesso pela LAN/Tailnet, configure o vínculo explicitamente e mantenha a autenticação habilitada. Para configurações restritas à Tailnet, defina gateway.bind: "tailnet" em ~/.openclaw/openclaw.json e reinicie o Gateway (ou o aplicativo da barra de menus do macOS).
O que faz anúncios
Somente o Gateway anuncia _openclaw-gw._tcp. O anúncio multicast na LAN é feito pelo Plugin bonjour incluído quando está habilitado; a publicação DNS-SD de longa distância continua sob responsabilidade do Gateway.
Tipos de serviço
_openclaw-gw._tcp- sinalizador de transporte do Gateway, usado por Nodes macOS/iOS/Android.
Chaves TXT (dicas não secretas)
| 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á habilitado. |
gatewayTlsSha256=<sha256> |
Somente quando o TLS está habilitado e há uma impressão digital 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 do canvas está habilitado; atualmente é igual a gatewayPort. |
tailnetDns=<magicdns> |
Somente no modo mDNS completo; 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 o TXT como fonte autoritativa de roteamento.
- Os clientes devem fazer o roteamento usando o endpoint de serviço resolvido (SRV + A/AAAA). Trate
lanHost,tailnetDns,gatewayPortegatewayTlsSha256apenas como dicas. - A seleção automática do destino SSH também deve usar o host de serviço resolvido, e não dicas provenientes apenas do 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 restritas a 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 há um problema na 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 cancellation ...bonjour: ... name conflict resolved/hostname conflict resolvedbonjour: watchdog detected non-announced service ...bonjour: disabling advertiser after ... failed restarts ...
O watchdog trata estados ativos de probing, announcing e renomeações recentes por conflito como estados em andamento. Se o serviço nunca atingir announced, o OpenClaw recriará o anunciante e, após falhas repetidas, desabilitará o Bonjour para esse processo do Gateway, em vez de continuar anunciando indefinidamente.
O Bonjour usa o nome de host do sistema como 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 habilitar o Bonjour
O Bonjour inicia automaticamente quando o Gateway é iniciado sem configuração em hosts macOS, pois o aplicativo local e os Nodes iOS/Android próximos normalmente dependem da descoberta na mesma LAN.
Habilite-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 habilitado, o Bonjour usa discovery.mdns.mode para decidir quantos metadados TXT publicar; o mesmo modo controla as 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 e tailnetDns. |
full |
Adiciona sshPort, cliPath e tailnetDns — use quando os clientes precisarem dessas dicas. |
off |
Suprime o multicast na LAN sem alterar a habilitação do Plugin; o DNS-SD de longa distância ainda pode publicar o sinalizador mínimo quando discovery.wideArea.enabled for true. |
Quando desabilitar o Bonjour
Mantenha o Bonjour desabilitado quando o anúncio multicast na LAN for desnecessário, indisponível ou prejudicial — casos comuns incluem servidores que não usam macOS, redes bridge do Docker, WSL ou uma política de rede que bloqueia multicast mDNS. O Gateway continuará acessível por sua URL publicada, SSH, Tailnet ou DNS-SD de longa distância; apenas a descoberta automática na LAN ficará indisponível ou não será confiável.
Use a substituição por variável de ambiente para problemas específicos da implantação (segura para imagens 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 para essa configuração do OpenClaw:
openclaw plugins disable bonjourArmadilhas do Docker
O Plugin Bonjour incluído desabilita automaticamente o anúncio multicast na LAN em contêineres detectados quando OPENCLAW_DISABLE_BONJOUR não está definido. As redes bridge do Docker geralmente 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 sistemas. Mantê-lo desabilitado não interrompe o Gateway — apenas ignora o anúncio multicast na LAN.
- Desabilitar o Bonjour não altera
gateway.bind; o Docker ainda usaOPENCLAW_GATEWAY_BIND=lanpor padrão para que a porta publicada do host funcione. - Desabilitar o Bonjour não desabilita 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 desabilitação automática do contêiner. - Defina
OPENCLAW_DISABLE_BONJOUR=0somente para rede do host, macvlan ou outra rede na qual o multicast mDNS comprovadamente passe; defina como1para forçar a desabilitação.
Solução de problemas do Bonjour desabilitado
Se um Node não descobrir mais o Gateway automaticamente após a configuração do Docker:
-
Confirme se o Gateway está sendo executado no modo automático, forçadamente habilitado ou forçadamente desabilitado:
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 desabilitado:
- Interface 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
- Interface de controle ou ferramentas locais:
-
Se você habilitou deliberadamente o Plugin Bonjour no Docker e forçou o anúncio com
OPENCLAW_DISABLE_BONJOUR=0, teste o multicast no host:bash dns-sd -B _openclaw-gw._tcp local.Se a busca não retornar resultados ou se os logs do Gateway mostrarem cancelamentos repetidos do watchdog do ciao, restaure
OPENCLAW_DISABLE_BONJOUR=1e use uma rota direta ou pela Tailnet.
Modos comuns de falha
- O Bonjour não atravessa redes: use a Tailnet ou SSH.
- Multicast bloqueado: algumas redes Wi-Fi desabilitam o mDNS.
- Anunciante travado em sondagem/anúncio: hosts com multicast bloqueado, pontes de contêiner, WSL ou alterações frequentes de interface podem deixar o anunciante ciao em um estado não anunciado. O OpenClaw tenta novamente algumas vezes e, depois, desabilita o Bonjour para o processo atual do Gateway, em vez de reiniciar o anunciante indefinidamente.
- Rede em ponte do Docker: o Bonjour é desabilitado automaticamente em contêineres detectados. Defina
OPENCLAW_DISABLE_BONJOUR=0somente para redes de host, macvlan ou outra rede compatível com mDNS. - Suspensão/alterações frequentes de interface: o macOS pode interromper temporariamente os resultados de mDNS; tente novamente.
- A navegação 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 do serviço deriva do nome do host, portanto, nomes excessivamente complexos podem confundir alguns resolvedores.
Nomes de instância com escape (\032)
O Bonjour/DNS-SD frequentemente representa bytes em nomes de instâncias de serviço como sequências decimais \DDD com escape (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 na LAN em hosts nos quais ele não está ativado por padrão. |
openclaw plugins disable bonjour |
Desativa o anúncio multicast na LAN ao desabilitar o plugin integrado. |
OPENCLAW_DISABLE_BONJOUR=1 (ou true/yes/on) |
Desativa o anúncio multicast na LAN sem alterar a configuração do plugin. |
OPENCLAW_DISABLE_BONJOUR=0 (ou false/no/off) |
Força a ativação do anúncio multicast na LAN, inclusive dentro de 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 em TXT quando o modo completo de mDNS está ativado. |
OPENCLAW_CLI_PATH |
Substitui o caminho da CLI anunciado (modo completo). |
Por padrão, hosts macOS iniciam automaticamente o plugin integrado de descoberta na LAN. Quando o plugin Bonjour está ativado e OPENCLAW_DISABLE_BONJOUR não está definido, o Bonjour anuncia em hosts normais e é desabilitado automaticamente dentro de 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 e aprovações: Pareamento do Gateway