Bonjour / mDNSディスカバリー
OpenClawは、アクティブなGateway(WebSocketエンドポイント)を検出するためにBonjour(mDNS / DNS‑SD)を使用します。 マルチキャストのlocal.ブラウジングは、LAN内限定の利便機能です。ネットワークをまたぐディスカバリーでは、同じビーコンを設定済みの広域DNS-SDドメイン経由でも公開できます。ディスカバリーは依然としてベストエフォートであり、SSHやTailnetベースの接続の代替にはなりません。
Tailscale経由の広域Bonjour(ユニキャストDNS-SD)
ノードとgatewayが異なるネットワーク上にある場合、マルチキャストmDNSはその境界を越えません。同じディスカバリーUXを維持したまま、Tailscale経由のユニキャストDNS‑SD(「広域Bonjour」)に切り替えることができます。 大まかな手順:- gatewayホスト上でDNSサーバーを実行する(Tailnet経由で到達可能)。
- 専用ゾーン配下に
_openclaw-gw._tcpのDNS‑SDレコードを公開する (例:openclaw.internal.)。 - 選択したドメインがそのDNSサーバー経由で解決されるように、Tailscale split DNSを設定する (iOSを含むクライアント向け)。
openclaw.internal.は単なる例です。
iOS/Androidノードは、local.と設定済みの広域ドメインの両方をブラウズします。
Gateway設定(推奨)
初回DNSサーバー設定(gatewayホスト)
- gatewayのTailscaleインターフェース上でのみポート53をlistenする
- 選択したドメイン(例:
openclaw.internal.)を~/.openclaw/dns/<domain>.dbから提供する
Tailscale DNS設定
Tailscale管理コンソールで:- gatewayのtailnet IP(UDP/TCP 53)を指すネームサーバーを追加します。
- ディスカバリードメインがそのネームサーバーを使用するようにsplit DNSを追加します。
_openclaw-gw._tcpをブラウズできます。
Gatewayリスナーのセキュリティ(推奨)
GatewayのWSポート(デフォルト18789)は、デフォルトではloopbackにbindします。LAN/tailnetアクセスでは、明示的にbindし、認証を有効にしたままにしてください。
tailnet専用構成では:
~/.openclaw/openclaw.jsonでgateway.bind: "tailnet"を設定します。- Gatewayを再起動します(またはmacOSメニューバーアプリを再起動します)。
公開するもの
_openclaw-gw._tcpを公開するのはGatewayのみです。
サービス種別
_openclaw-gw._tcp— gateway転送ビーコン(macOS/iOS/Androidノードで使用)。
TXTキー(秘密ではないヒント)
Gatewayは、UIフローを便利にするために、小さな非秘密ヒントを公開します:role=gatewaydisplayName=<friendly name>lanHost=<hostname>.localgatewayPort=<port>(Gateway WS + HTTP)gatewayTls=1(TLS有効時のみ)gatewayTlsSha256=<sha256>(TLS有効かつフィンガープリント利用可能時のみ)canvasPort=<port>(canvas host有効時のみ。現在はgatewayPortと同じ)transport=gatewaytailnetDns=<magicdns>(Tailnet利用可能時の任意ヒント)sshPort=<port>(mDNS完全モードのみ。広域DNS-SDでは省略される場合あり)cliPath=<path>(mDNS完全モードのみ。広域DNS-SDでもリモートインストールヒントとして書き込まれます)
- Bonjour/mDNSのTXTレコードは認証されません。クライアントはTXTを信頼できるルーティング情報として扱ってはいけません。
- クライアントは、解決済みのサービスエンドポイント(SRV + A/AAAA)を使用してルーティングする必要があります。
lanHost、tailnetDns、gatewayPort、gatewayTlsSha256はヒントとしてのみ扱ってください。 - SSH自動ターゲット指定も同様に、TXTのみのヒントではなく、解決済みのサービスホストを使う必要があります。
- TLSピン留めでは、広告された
gatewayTlsSha256によって、以前に保存されたピンが上書きされることがあってはなりません。 - iOS/Androidノードは、ディスカバリーベースの直接接続をTLS専用として扱い、初回フィンガープリントを信頼する前に明示的なユーザー確認を要求する必要があります。
macOSでのデバッグ
便利な組み込みツール:-
インスタンスをブラウズする:
-
1つのインスタンスを解決する(
<instance>を置き換え):
Gatewayログでのデバッグ
Gatewayはローテーションログファイルを書き込みます(起動時にgateway log file: ...として表示されます)。特に次のようなbonjour:行を確認してください:
bonjour: advertise failed ...bonjour: ... name conflict resolved/hostname conflict resolvedbonjour: watchdog detected non-announced service ...
iOSノードでのデバッグ
iOSノードは、_openclaw-gw._tcpを検出するためにNWBrowserを使用します。
ログを取得するには:
- 設定 → Gateway → 詳細 → Discovery Debug Logs
- 設定 → Gateway → 詳細 → Discovery Logs → 再現 → Copy
一般的な障害モード
- Bonjourはネットワークをまたげない: TailnetまたはSSHを使用してください。
- マルチキャストがブロックされている: 一部のWi‑FiネットワークではmDNSが無効化されています。
- スリープ / インターフェースの変動: macOSが一時的にmDNS結果を落とすことがあります。再試行してください。
- ブラウズは動作するが解決に失敗する: マシン名はシンプルに保ってください(絵文字や句読点を避ける)。その後、Gatewayを再起動してください。サービスインスタンス名はホスト名から導出されるため、複雑すぎる名前は一部のリゾルバーを混乱させる可能性があります。
エスケープされたインスタンス名(\032)
Bonjour/DNS‑SDは、サービスインスタンス名中のバイトを10進の\DDDシーケンスとしてエスケープすることがよくあります(例: スペースは\032になります)。
- これはプロトコルレベルでは正常です。
- UIでは表示用にデコードする必要があります(iOSは
BonjourEscapes.decodeを使用します)。
無効化 / 設定
OPENCLAW_DISABLE_BONJOUR=1は公開を無効にします(legacy:OPENCLAW_DISABLE_BONJOUR)。~/.openclaw/openclaw.json内のgateway.bindはGatewayのbindモードを制御します。OPENCLAW_SSH_PORTは、sshPortが公開されるときのSSHポートを上書きします(legacy:OPENCLAW_SSH_PORT)。OPENCLAW_TAILNET_DNSは、TXTにMagicDNSヒントを公開します(legacy:OPENCLAW_TAILNET_DNS)。OPENCLAW_CLI_PATHは、公開されるCLIパスを上書きします(legacy:OPENCLAW_CLI_PATH)。
関連ドキュメント
- ディスカバリーポリシーと転送選択: ディスカバリー
- ノードのペアリングと承認: Gatewayペアリング