Gateway
کشف Bonjour
OpenClaw میتواند از Bonjour (mDNS / DNS-SD) برای کشف یک Gateway فعال (نقطه پایانی WebSocket) استفاده کند.
مرور multicast local. یک امکان LAN-only است. Plugin همراه bonjour
مالک اعلان LAN است. روی میزبانهای macOS بهصورت خودکار شروع میشود و روی
Linux، Windows و استقرارهای Gateway کانتینری اختیاری است. برای کشف بین شبکهای، همان
beacon میتواند از طریق یک دامنه wide-area DNS-SD پیکربندیشده نیز منتشر شود. کشف
همچنان best-effort است و جایگزین اتصال مبتنی بر SSH یا Tailnet نمیشود.
Bonjour ناحیه گسترده (Unicast DNS-SD) روی Tailscale
اگر node و gateway روی شبکههای متفاوت باشند، multicast mDNS از مرز شبکه عبور نمیکند. میتوانید با تغییر به unicast DNS-SD ("Wide-Area Bonjour") روی Tailscale همان تجربه کشف را حفظ کنید.
گامهای کلی:
- یک DNS server روی میزبان gateway اجرا کنید (قابل دسترسی از طریق Tailnet).
- رکوردهای DNS-SD را برای
_openclaw-gw._tcpزیر یک zone اختصاصی منتشر کنید (مثال:openclaw.internal.). - split DNS در Tailscale را پیکربندی کنید تا دامنه انتخابی شما برای clientها (از جمله iOS) از طریق آن DNS server resolve شود.
OpenClaw از هر دامنه کشفی پشتیبانی میکند؛ openclaw.internal. فقط یک مثال است.
nodeهای iOS/Android هم local. و هم دامنه ناحیه گسترده پیکربندیشده شما را مرور میکنند.
پیکربندی Gateway (توصیهشده)
{
gateway: { bind: "tailnet" }, // tailnet-only (recommended)
discovery: { wideArea: { enabled: true } }, // enables wide-area DNS-SD publishing
}
راهاندازی یکباره DNS server (میزبان gateway)
openclaw dns setup --apply
این کار CoreDNS را نصب و آن را طوری پیکربندی میکند که:
- فقط روی پورت 53 و فقط روی interfaceهای Tailscale مربوط به gateway گوش دهد
- دامنه انتخابی شما (مثال:
openclaw.internal.) را از~/.openclaw/dns/<domain>.dbسرو کند
از یک ماشین متصل به tailnet اعتبارسنجی کنید:
dns-sd -B _openclaw-gw._tcp openclaw.internal.
dig @<TAILNET_IPV4> -p 53 _openclaw-gw._tcp.openclaw.internal PTR +short
تنظیمات DNS در Tailscale
در کنسول مدیریت Tailscale:
- یک nameserver اضافه کنید که به IP مربوط به tailnet gateway اشاره کند (UDP/TCP 53).
- split DNS اضافه کنید تا دامنه کشف شما از آن nameserver استفاده کند.
پس از اینکه clientها DNS مربوط به tailnet را پذیرفتند، nodeهای iOS و کشف CLI میتوانند
_openclaw-gw._tcp را در دامنه کشف شما بدون multicast مرور کنند.
امنیت listener Gateway (توصیهشده)
پورت WS مربوط به Gateway (پیشفرض 18789) بهطور پیشفرض به loopback bind میشود. برای دسترسی LAN/tailnet،
بهصورت صریح bind کنید و auth را فعال نگه دارید.
برای راهاندازیهای فقط tailnet:
- مقدار
gateway.bind: "tailnet"را در~/.openclaw/openclaw.jsonتنظیم کنید. - Gateway را restart کنید (یا اپ menubar در macOS را restart کنید).
چه چیزی اعلان میکند
فقط Gateway مقدار _openclaw-gw._tcp را اعلان میکند. اعلان LAN multicast
زمانی توسط Plugin همراه bonjour فراهم میشود که Plugin فعال باشد؛ انتشار wide-area
DNS-SD همچنان متعلق به Gateway است.
انواع service
_openclaw-gw._tcp- beacon انتقال gateway (استفادهشده توسط nodeهای macOS/iOS/Android).
کلیدهای TXT (راهنماهای غیرمحرمانه)
Gateway راهنماهای کوچک و غیرمحرمانهای را اعلان میکند تا flowهای UI راحت باشند:
role=gatewaydisplayName=<friendly name>lanHost=<hostname>.localgatewayPort=<port>(Gateway WS + HTTP)gatewayTls=1(فقط وقتی TLS فعال باشد)gatewayTlsSha256=<sha256>(فقط وقتی TLS فعال باشد و fingerprint در دسترس باشد)canvasPort=<port>(فقط وقتی میزبان canvas فعال باشد؛ در حال حاضر همانgatewayPortاست)transport=gatewaytailnetDns=<magicdns>(فقط حالت کامل mDNS، راهنمای اختیاری وقتی Tailnet در دسترس باشد)sshPort=<port>(فقط حالت کامل mDNS؛ wide-area DNS-SD ممکن است آن را حذف کند)cliPath=<path>(فقط حالت کامل mDNS؛ wide-area DNS-SD همچنان آن را بهعنوان راهنمای نصب remote مینویسد)
نکات امنیتی:
- رکوردهای TXT مربوط به Bonjour/mDNS احراز هویت نشدهاند. Clientها نباید TXT را routing معتبر تلقی کنند.
- Clientها باید با استفاده از endpoint سرویس resolveشده (SRV + A/AAAA) route کنند.
lanHost،tailnetDns،gatewayPortوgatewayTlsSha256را فقط بهعنوان راهنما تلقی کنید. - هدفگیری خودکار SSH نیز باید از میزبان سرویس resolveشده استفاده کند، نه راهنماهای فقط TXT.
- TLS pinning هرگز نباید اجازه دهد
gatewayTlsSha256اعلانشده یک pin ذخیرهشده قبلی را override کند. - nodeهای iOS/Android باید اتصالهای مستقیم مبتنی بر کشف را فقط TLS تلقی کنند و پیش از اعتماد به fingerprint برای اولین بار، تایید صریح کاربر را الزامی کنند.
Debugging در macOS
ابزارهای داخلی مفید:
-
مرور instanceها:
dns-sd -B _openclaw-gw._tcp local. -
resolve کردن یک instance (جایگزین کردن
<instance>):dns-sd -L "<instance>" _openclaw-gw._tcp local.
اگر مرور کار میکند اما resolve شکست میخورد، معمولاً با یک policy مربوط به LAN یا مشکل resolver در mDNS روبهرو هستید.
Debugging در لاگهای Gateway
Gateway یک فایل لاگ چرخشی مینویسد (در startup بهصورت
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 ...
Bonjour از hostname سیستم برای میزبان .local اعلانشده استفاده میکند، وقتی که
یک DNS label معتبر باشد. اگر hostname سیستم شامل فاصله، underscore، یا کاراکتر
نامعتبر دیگری برای DNS-label باشد، OpenClaw به openclaw.local برمیگردد. وقتی به یک
host label صریح نیاز دارید، پیش از شروع Gateway مقدار
OPENCLAW_MDNS_HOSTNAME=<name> را تنظیم کنید.
Debugging روی node iOS
node iOS از NWBrowser برای کشف _openclaw-gw._tcp استفاده میکند.
برای گرفتن لاگها:
- Settings → Gateway → Advanced → Discovery Debug Logs
- Settings → Gateway → Advanced → Discovery Logs → بازتولید → Copy
لاگ شامل گذارهای وضعیت browser و تغییرات result-set است.
چه زمانی Bonjour را فعال کنید
Bonjour برای startup Gateway با پیکربندی خالی روی میزبانهای macOS بهصورت خودکار شروع میشود، چون اپ محلی و nodeهای iOS/Android نزدیک معمولاً به کشف روی همان LAN متکی هستند.
وقتی کشف خودکار روی همان LAN در Linux، Windows، یا میزبان غیر macOS دیگری مفید است، Bonjour را صریحاً فعال کنید:
openclaw plugins enable bonjour
وقتی فعال باشد، Bonjour از discovery.mdns.mode استفاده میکند تا تصمیم بگیرد چه مقدار metadata
TXT منتشر کند. حالت پیشفرض minimal است؛ فقط وقتی clientهای محلی به راهنماهای
cliPath یا sshPort نیاز دارند از full استفاده کنید، و برای سرکوب LAN multicast بدون
تغییر فعالسازی Plugin از off استفاده کنید.
چه زمانی Bonjour را غیرفعال کنید
وقتی اعلان LAN multicast غیرضروری، در دسترس نبودنی، یا مضر است Bonjour را غیرفعال نگه دارید. موارد رایج شامل سرورهای غیر macOS، شبکه Docker bridge، WSL، یا policy شبکهای است که mDNS multicast را drop میکند. در این محیطها Gateway همچنان از طریق URL منتشرشده، SSH، Tailnet یا wide-area DNS-SD قابل دسترسی است، اما کشف خودکار LAN قابل اتکا نیست.
وقتی مشکل مربوط به scope استقرار است، override محیطی موجود را ترجیح دهید:
OPENCLAW_DISABLE_BONJOUR=1
این کار اعلان LAN multicast را بدون تغییر پیکربندی Plugin غیرفعال میکند. برای imageهای Docker، service fileها، scriptهای launch و debugging یکباره امن است، چون وقتی environment از بین برود، setting هم ناپدید میشود.
وقتی عمداً میخواهید Plugin کشف LAN همراه را برای آن پیکربندی OpenClaw خاموش کنید، از پیکربندی Plugin استفاده کنید:
openclaw plugins disable bonjour
نکات Docker
Plugin همراه Bonjour اعلان LAN multicast را در containerهای شناساییشده، وقتی
OPENCLAW_DISABLE_BONJOUR تنظیم نشده باشد، بهصورت خودکار غیرفعال میکند. شبکههای Docker bridge
معمولاً mDNS multicast (224.0.0.251:5353) را بین container
و LAN forward نمیکنند، بنابراین اعلان از داخل container بهندرت باعث کار کردن کشف میشود.
نکات مهم:
- Bonjour روی میزبانهای macOS بهصورت خودکار شروع میشود و در جاهای دیگر opt-in است. غیرفعال گذاشتن آن Gateway را متوقف نمیکند؛ فقط اعلان LAN multicast را رد میکند.
- غیرفعال کردن Bonjour مقدار
gateway.bindرا تغییر نمیدهد؛ Docker همچنان بهصورت پیشفرض ازOPENCLAW_GATEWAY_BIND=lanاستفاده میکند تا پورت منتشرشده میزبان بتواند کار کند. - غیرفعال کردن Bonjour، wide-area DNS-SD را غیرفعال نمیکند. وقتی Gateway و node روی یک LAN نیستند، از کشف wide-area یا Tailnet استفاده کنید.
- استفاده دوباره از همان
OPENCLAW_CONFIG_DIRخارج از Docker، policy auto-disable مربوط به container را پایدار نمیکند. - مقدار
OPENCLAW_DISABLE_BONJOUR=0را فقط برای host networking، macvlan، یا شبکه دیگری که مشخص است mDNS multicast از آن عبور میکند تنظیم کنید؛ برای force-disable آن را روی1بگذارید.
عیبیابی Bonjour غیرفعال
اگر یک node پس از راهاندازی Docker دیگر Gateway را بهصورت خودکار کشف نمیکند:
-
تأیید کنید Gateway در حالت auto، forced-on یا forced-off اجرا میشود:
docker compose config | grep OPENCLAW_DISABLE_BONJOUR -
تأیید کنید خود Gateway از طریق پورت منتشرشده قابل دسترسی است:
curl -fsS http://127.0.0.1:18789/healthz -
وقتی Bonjour غیرفعال است از target مستقیم استفاده کنید:
- Control UI یا ابزارهای محلی:
http://127.0.0.1:18789 - Clientهای LAN:
http://<gateway-host>:18789 - Clientهای بینشبکهای: Tailnet MagicDNS، IP مربوط به Tailnet، تونل SSH، یا wide-area DNS-SD
- Control UI یا ابزارهای محلی:
-
اگر عمداً Plugin مربوط به Bonjour را در Docker فعال کردهاید و اعلان را با
OPENCLAW_DISABLE_BONJOUR=0اجباری کردهاید، multicast را از میزبان test کنید:dns-sd -B _openclaw-gw._tcp local.اگر مرور خالی است یا لاگهای Gateway لغوهای مکرر watchdog مربوط به ciao را نشان میدهند، مقدار
OPENCLAW_DISABLE_BONJOUR=1را برگردانید و از یک route مستقیم یا Tailnet استفاده کنید.
حالتهای رایج شکست
- Bonjour از شبکهها عبور نمیکند: از Tailnet یا SSH استفاده کنید.
- Multicast مسدود شده است: برخی شبکههای Wi-Fi، mDNS را غیرفعال میکنند.
- Advertiser در probing/announcing گیر کرده است: میزبانهایی با multicast مسدودشده، bridgeهای container، WSL، یا churn در interface میتوانند advertiser مربوط به ciao را در یک وضعیت non-announced باقی بگذارند. OpenClaw چند بار retry میکند و سپس Bonjour را برای process فعلی Gateway غیرفعال میکند، بهجای اینکه advertiser را برای همیشه restart کند.
- Docker bridge networking: Bonjour در containerهای شناساییشده بهصورت خودکار غیرفعال میشود.
مقدار
OPENCLAW_DISABLE_BONJOUR=0را فقط برای host، macvlan، یا شبکه دیگری که قابلیت mDNS دارد تنظیم کنید. - Sleep / churn در interface: macOS ممکن است موقتاً resultهای mDNS را drop کند؛ retry کنید.
- مرور کار میکند اما resolve شکست میخورد: نام ماشینها را ساده نگه دارید (از emoji یا punctuation پرهیز کنید)، سپس Gateway را restart کنید. نام instance سرویس از نام host مشتق میشود، بنابراین نامهای بیش از حد پیچیده میتوانند برخی resolverها را سردرگم کنند.
نامهای instance escapeشده (\032)
Bonjour/DNS-SD اغلب byteها را در نامهای service instance بهصورت دنبالههای اعشاری \DDD
escape میکند (مثلاً فاصلهها به \032 تبدیل میشوند).
- این در سطح protocol عادی است.
- UIها باید برای نمایش decode کنند (iOS از
BonjourEscapes.decodeاستفاده میکند).
فعالسازی / غیرفعالسازی / پیکربندی
- میزبانهای macOS بهصورت پیشفرض Plugin کشف LAN همراه را خودکار شروع میکنند.
openclaw plugins enable bonjour، Plugin کشف LAN همراه را روی میزبانهایی که بهصورت پیشفرض فعال نیست فعال میکند.openclaw plugins disable bonjourبا غیرفعال کردن Plugin همراه، اعلان LAN multicast را غیرفعال میکند.OPENCLAW_DISABLE_BONJOUR=1اعلان LAN multicast را بدون تغییر config مربوط به Plugin غیرفعال میکند؛ مقدارهای truthy پذیرفتهشده1،true،yesوonهستند (legacy:OPENCLAW_DISABLE_BONJOUR).OPENCLAW_DISABLE_BONJOUR=0اعلان LAN multicast را روشن میکند، از جمله داخل containerهای شناساییشده؛ مقدارهای falsy پذیرفتهشده0،false،noوoffهستند.- وقتی Plugin مربوط به Bonjour فعال است و
OPENCLAW_DISABLE_BONJOURتنظیم نشده، Bonjour روی میزبانهای معمولی اعلان میکند و داخل containerهای شناساییشده خودکار غیرفعال میشود. gateway.bindدر~/.openclaw/openclaw.jsonحالت bind مربوط به Gateway را کنترل میکند.OPENCLAW_SSH_PORTوقتیsshPortاعلان میشود پورت SSH را override میکند (legacy:OPENCLAW_SSH_PORT).OPENCLAW_TAILNET_DNSوقتی حالت کامل mDNS فعال باشد یک راهنمای MagicDNS را در TXT منتشر میکند (legacy:OPENCLAW_TAILNET_DNS).OPENCLAW_CLI_PATHمسیر CLI اعلانشده را override میکند (legacy:OPENCLAW_CLI_PATH).
مستندات مرتبط
- policy کشف و انتخاب transport: کشف
- pairing مربوط به Node + تأییدها: pairing Gateway