Bonjour(mDNS)による発見
Bonjour/mDNS の発見とデバッグ(Gateway ビーコン、クライアント、よくある障害)
OpenClaw は Bonjour(mDNS / DNS-SD)を、稼働中の Gateway(WebSocket エンドポイント)を見つけるためのLAN 専用の便利機能として利用します。ベストエフォートであり、SSH や tailnet ベースの接続を置き換えるものではありません。
Tailscale 上の Wide-Area Bonjour(ユニキャスト DNS-SD)
ノードと Gateway が別ネットワークにある場合、マルチキャスト mDNS は境界を越えません。Tailscale 上で ユニキャスト DNS‑SD(“Wide-Area Bonjour”)に切り替えることで、同じ発見 UX を維持できます。
High-level steps:
- Gateway ホスト上で DNS サーバーを動かす(tailnet 経由で到達可能にする)。
- 専用ゾーン配下で
_openclaw-gw._tcpの DNS‑SD レコードを公開する(例:openclaw.internal.)。 - Tailscale の Split DNS を設定し、選んだドメインをその DNS サーバーで解決する(iOS を含む)。
OpenClaw は任意の discovery ドメインをサポートします。openclaw.internal. は例です。
iOS/Android ノードは local. と設定した wide-area ドメインをブラウズします。
Gateway config (recommended)
{
gateway: { bind: "tailnet" }, // tailnet-only (recommended)
discovery: { wideArea: { enabled: true } }, // enables wide-area DNS-SD publishing
}DNS サーバーの一回限りセットアップ(Gateway ホスト)
openclaw dns setup --apply
これは CoreDNS をインストールし、次のように設定します:
- Gateway の Tailscale インターフェースでのみ 53 番ポートを待ち受ける
~/.openclaw/dns/<domain>.dbから選んだドメインを提供する(例:openclaw.internal.)
tailnet 接続済みマシンから検証:
dns-sd -B _openclaw-gw._tcp openclaw.internal. dig @<TAILNET_IPV4> -p 53 _openclaw-gw._tcp.openclaw.internal PTR +short
Tailscale DNS settings
Tailscale 管理コンソールで:
- Gateway の tailnet IP(UDP/TCP 53)を指すネームサーバーを追加する。
- discovery ドメインがそのネームサーバーを使うように Split DNS を追加する。
クライアントが tailnet DNS を受け入れると、iOS ノードはマルチキャストなしで discovery ドメイン内の _openclaw-gw._tcp をブラウズできます。
Gateway リスナーのセキュリティ(推奨)
Gateway の WS ポート(デフォルト 18789)は既定で loopback にバインドされます。LAN/tailnet で使う場合は明示的にバインドし、認証を有効にしたままにしてください。
tailnet 専用構成の場合:
gateway.bind: "tailnet"に~/.openclaw/openclaw.jsonを設定する。- Gateway を再起動する(または macOS のメニューバーアプリを再起動する)。
アドバタイズ内容
アドバタイズされるのは _openclaw-gw._tcp(Gateway)のみです。
サービス種別
_openclaw-gw._tcp— Gateway のトランスポートビーコン(macOS/iOS/Android ノードで使用)。
TXT キー(非秘密ヒント)
UI フローを便利にするため、Gateway は小さな非秘密ヒントを公開します:
role=gateway- <code>displayName=<friendly name>'</code>
- <code>lanHost=<hostname>.local</code>
- <code>gatewayPort=<port>'</code>(Gateway WS + HTTP)
gatewayTls=1(TLS 有効時のみ)- <code>gatewayTlsSha256=<sha256>'</code>(TLS 有効かつ指紋が利用可能な場合のみ)
- <code>canvasPort=<port>'</code>(canvas host 有効時のみ。デフォルト <code>18793</code>)
- <code>sshPort=<port>'</code>(上書きがなければ 22)
transport=gateway- <code>cliPath=<path>'</code>(任意。実行可能な <code>openclaw</code> エントリポイントの絶対パス)
- <code>tailnetDns=<magicdns>'</code>(tailnet 利用時の任意ヒント)
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: ... name conflict resolved/hostname conflict resolvedbonjour: watchdog detected non-announced service ...
iOS ノードでのデバッグ
iOS ノードは NWBrowser を使って _openclaw-gw._tcp を発見します。
ログ取得:
- 設定 → Gateway → 詳細 → 発見デバッグログ
- 設定 → Gateway → 詳細 → 発見ログ → 再現 → コピー
ログにはブラウザの状態遷移と結果セットの変更が含まれます。
よくある障害パターン
- Bonjour はネットワークを越えない: tailnet か SSH を使う。
- マルチキャストがブロック: 一部の Wi‑Fi は mDNS を無効化しています。
- スリープ/インターフェース変動: macOS が一時的に mDNS 結果を落とすことがあります。再試行してください。
- ブラウズ OK だが解決失敗: ホスト名を単純に(絵文字/記号を避ける)して Gateway を再起動してください。サービスインスタンス名はホスト名由来で、複雑すぎると一部のリゾルバが混乱します。
エスケープされたインスタンス名(`\032`)
Bonjour/DNS-SD はサービスインスタンス名のバイトを十進の \DDD シーケンスとしてエスケープすることがあります(例:スペースは \032)。
- これはプロトコル上は正常です。
- 表示用に UI 側でデコードしてください(iOS は
BonjourEscapes.decodeを使用)。
Disabling / configuration
OPENCLAW_DISABLE_BONJOUR=1disables advertising.~/.openclaw/openclaw.jsonの~/.openclaw/openclaw.jsonが Gateway の bind モードを制御します。OPENCLAW_SSH_PORTで TXT に公開する SSH ポートを上書きします。OPENCLAW_TAILNET_DNSで TXT に MagicDNS ヒントを公開します。OPENCLAW_CLI_PATHで公開する CLI パスを上書きします。
関連ドキュメント
- 発見戦略とトランスポート選択:Discovery
- ノードのペアリングと承認:Gateway pairing