Gateway
اكتشاف Bonjour
يمكن لـ OpenClaw استخدام Bonjour (mDNS/DNS-SD) لاكتشاف Gateway نشط (نقطة نهاية WebSocket). يُعد استعراض local. متعدد البث ميزة ملائمة مقتصرة على الشبكة المحلية (LAN): يتولى Plugin المضمّن bonjour الإعلان عبر الشبكة المحلية، ويبدأ تلقائيًا على مضيفي macOS، بينما يتطلب التفعيل الاختياري على Linux وWindows وعمليات نشر Gateway داخل الحاويات. ويمكن للإشارة نفسها أيضًا النشر عبر نطاق DNS-SD واسع النطاق مُهيأ للاكتشاف عبر الشبكات. يعمل الاكتشاف وفق أفضل جهد ولا يحل محل الاتصال المستند إلى SSH أو Tailnet.
Bonjour واسع النطاق (DNS-SD أحادي البث) عبر Tailscale
إذا كان Node وGateway على شبكتين مختلفتين، فلا يمكن لـ mDNS متعدد البث عبور الحد الفاصل. حافظ على تجربة الاكتشاف نفسها بالتبديل إلى DNS-SD أحادي البث («Bonjour واسع النطاق») عبر Tailscale:
- شغّل خادم DNS على مضيف Gateway بحيث يمكن الوصول إليه عبر Tailnet.
- انشر سجلات DNS-SD للخدمة
_openclaw-gw._tcpضمن نطاق مخصص (مثال:openclaw.internal.). - هيّئ DNS المنقسم في Tailscale بحيث يُحل نطاقك المختار عبر خادم DNS ذاك للعملاء، بما في ذلك iOS.
النطاق openclaw.internal. أعلاه مجرد مثال — يدعم OpenClaw أي نطاق اكتشاف. تستعرض عُقد iOS/Android كلًا من local. ونطاقك واسع النطاق المُهيأ.
إعداد Gateway
{ gateway: { bind: "tailnet" }, // مقتصر على Tailnet (موصى به) discovery: { wideArea: { enabled: true, domain: "openclaw.internal" } },}يقبل discovery.wideArea.domain أيضًا متغير البيئة OPENCLAW_WIDE_AREA_DOMAIN كخيار احتياطي عند عدم تعيينه.
إعداد خادم DNS لمرة واحدة (مضيف Gateway، على macOS فقط)
openclaw dns setup --applyهذا الأمر مخصص لـ macOS فقط ويتطلب Homebrew واتصال Tailscale قيد التشغيل. يثبّت CoreDNS (brew install coredns) ويهيئه من أجل:
- الاستماع على المنفذ 53 فقط عبر واجهات Tailscale الخاصة بـ Gateway
- خدمة نطاقك المختار (مثال:
openclaw.internal.) من~/.openclaw/dns/<domain>.db
شغّله أولًا من دون --apply لمعاينة الخطة (النطاق، ومسار ملف المنطقة، وعنوان IP المكتشف في Tailnet، والإعداد الموصى به) من دون تثبيت أي شيء.
تحقق من جهاز متصل بـ Tailnet:
dns-sd -B _openclaw-gw._tcp openclaw.internal.dig @<TAILNET_IPV4> -p 53 _openclaw-gw._tcp.openclaw.internal PTR +shortإعدادات DNS في Tailscale
في وحدة تحكم إدارة Tailscale:
- أضف خادم أسماء يشير إلى عنوان IP الخاص بـ Gateway في Tailnet (UDP/TCP 53).
- أضف DNS منقسمًا بحيث يستخدم نطاق الاكتشاف خادم الأسماء ذاك.
بمجرد قبول العملاء لـ DNS الخاص بـ Tailnet، يمكن لعُقد iOS واكتشاف CLI استعراض _openclaw-gw._tcp في نطاق الاكتشاف من دون بث متعدد.
أمان مستمع Gateway
يرتبط منفذ WS الخاص بـ Gateway (الافتراضي 18789) افتراضيًا بـ local loopback. للوصول عبر LAN/Tailnet، اضبط الربط صراحةً وأبقِ المصادقة مفعّلة. في الإعدادات المقتصرة على Tailnet، عيّن gateway.bind: "tailnet" في ~/.openclaw/openclaw.json وأعد تشغيل Gateway (أو تطبيق شريط القوائم في macOS).
ما الذي يُعلن عنه
لا يعلن عن _openclaw-gw._tcp سوى Gateway. يأتي الإعلان متعدد البث عبر الشبكة المحلية من Plugin المضمّن bonjour عند تمكينه، بينما يظل نشر DNS-SD واسع النطاق ضمن مسؤولية Gateway.
أنواع الخدمات
_openclaw-gw._tcp- إشارة نقل Gateway، تستخدمها عُقد macOS/iOS/Android.
مفاتيح TXT (تلميحات غير سرية)
| المفتاح | وقت وجوده |
|---|---|
role=gateway |
دائمًا. |
displayName=<friendly name> |
دائمًا. |
lanHost=<hostname>.local |
دائمًا. |
gatewayPort=<port> |
دائمًا (WS وHTTP الخاصان بـ Gateway). |
transport=gateway |
دائمًا. |
gatewayTls=1 |
فقط عند تمكين TLS. |
gatewayTlsSha256=<sha256> |
فقط عند تمكين TLS وتوفر بصمة. |
gatewayDirectReachable=1 |
فقط عندما يمكن الوصول مباشرةً إلى Gateway (وليس عبر مسار ترحيل/وكيل فقط). |
canvasPort=<port> |
فقط عند تمكين مضيف اللوحة؛ وهو حاليًا مماثل لـ gatewayPort. |
tailnetDns=<magicdns> |
في الوضع الكامل لـ mDNS فقط؛ تلميح اختياري عند توفر Tailnet. |
sshPort=<port> |
في الوضع الكامل فقط؛ يُحذف في الوضعين الأدنى والمتوقف. |
cliPath=<path> |
في الوضع الكامل فقط؛ يُحذف في الوضعين الأدنى والمتوقف. |
ملاحظات أمنية:
- سجلات TXT في Bonjour/mDNS غير مصادَق عليها. يجب ألا يتعامل العملاء مع TXT بوصفه مرجعًا موثوقًا للتوجيه.
- ينبغي للعملاء إجراء التوجيه باستخدام نقطة نهاية الخدمة التي جرى حلها (SRV + A/AAAA). تعامل مع
lanHostوtailnetDnsوgatewayPortوgatewayTlsSha256باعتبارها تلميحات فقط. - ينبغي كذلك أن يستخدم الاستهداف التلقائي عبر SSH مضيف الخدمة الذي جرى حله، لا التلميحات الموجودة في TXT وحدها.
- يجب ألا يسمح تثبيت TLS مطلقًا لقيمة
gatewayTlsSha256مُعلنة بتجاوز بصمة مثبّتة مخزنة مسبقًا. - ينبغي لعُقد iOS/Android التعامل مع الاتصالات المباشرة المستندة إلى الاكتشاف على أنها مقتصرة على TLS، وطلب تأكيد صريح من المستخدم قبل الوثوق ببصمة لأول مرة.
تصحيح الأخطاء على macOS
الأدوات المضمّنة:
# استعراض النسخdns-sd -B _openclaw-gw._tcp local. # حل نسخة واحدة (استبدل <instance>)dns-sd -L "<instance>" _openclaw-gw._tcp local.إذا نجح الاستعراض وفشل الحل، فعادةً ما تكون المشكلة في سياسة الشبكة المحلية أو محلّل mDNS.
تصحيح الأخطاء في سجلات Gateway
يكتب Gateway ملف سجل متجددًا (يُطبع عند بدء التشغيل بالشكل 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 ...
يتعامل مراقب السلامة مع حالات probing وannouncing وعمليات إعادة التسمية الحديثة الناتجة عن التعارض على أنها حالات قيد التنفيذ. إذا لم تصل الخدمة مطلقًا إلى announced، يعيد OpenClaw إنشاء المُعلِن، وبعد حالات فشل متكررة، يعطّل Bonjour لعملية Gateway تلك بدلًا من إعادة الإعلان إلى ما لا نهاية.
يستخدم Bonjour اسم مضيف النظام للمضيف المُعلن ذي اللاحقة .local عندما يكون تسمية DNS صالحة. إذا احتوى اسم مضيف النظام على مسافات أو شرطات سفلية أو أي محرف آخر غير صالح في تسمية DNS، يعود OpenClaw إلى openclaw.local. عيّن OPENCLAW_MDNS_HOSTNAME=<name> قبل بدء Gateway عندما تحتاج إلى تسمية مضيف صريحة.
تصحيح الأخطاء على Node بنظام iOS
يستخدم Node بنظام iOS المكوّن NWBrowser لاكتشاف _openclaw-gw._tcp.
لالتقاط السجلات: Settings -> Gateway -> Advanced -> Discovery Debug Logs، ثم Settings -> Gateway -> Advanced -> Discovery Logs -> أعد إنتاج المشكلة -> Copy. يتضمن السجل انتقالات حالة المتصفح وتغييرات مجموعة النتائج.
متى ينبغي تمكين Bonjour
يبدأ Bonjour تلقائيًا عند تشغيل Gateway بإعداد فارغ على مضيفي macOS، لأن التطبيق المحلي وعُقد iOS/Android القريبة تعتمد عادةً على الاكتشاف ضمن الشبكة المحلية نفسها.
مكّنه صراحةً عندما يكون الاكتشاف التلقائي ضمن الشبكة المحلية نفسها مفيدًا على Linux أو Windows أو مضيف آخر غير macOS:
openclaw plugins enable bonjourعند تمكين Bonjour، يستخدم discovery.mdns.mode لتحديد مقدار بيانات TXT الوصفية المراد نشرها؛ ويتحكم الوضع نفسه في تلميحات TXT الاختيارية ضمن سجلات DNS-SD واسعة النطاق. الأوضاع:
| الوضع | السلوك |
|---|---|
minimal (افتراضي) |
مفاتيح TXT الأساسية فقط؛ يحذف sshPort وcliPath وtailnetDns. |
full |
يضيف sshPort وcliPath وtailnetDns — استخدمه عندما يحتاج العملاء إلى هذه التلميحات. |
off |
يمنع البث المتعدد عبر الشبكة المحلية من دون تغيير حالة تمكين Plugin؛ ولا يزال بإمكان DNS-SD واسع النطاق نشر الإشارة الأدنى عندما تكون discovery.wideArea.enabled بقيمة true. |
متى ينبغي تعطيل Bonjour
اترك Bonjour معطّلًا عندما يكون الإعلان متعدد البث عبر الشبكة المحلية غير ضروري أو غير متاح أو ضارًا — تشمل الحالات الشائعة الخوادم غير العاملة بنظام macOS، وشبكات Docker الجسرية، وWSL، أو سياسة شبكة تُسقط بث mDNS المتعدد. يظل Gateway متاحًا عبر عنوان URL المنشور أو SSH أو Tailnet أو DNS-SD واسع النطاق؛ ويصبح الاكتشاف التلقائي عبر الشبكة المحلية وحده غير موثوق.
استخدم تجاوز متغير البيئة للمشكلات الخاصة بعملية النشر (وهو آمن لصور Docker وملفات الخدمات ونصوص التشغيل وتصحيح الأخطاء لمرة واحدة — ويختفي باختفاء البيئة):
OPENCLAW_DISABLE_BONJOUR=1استخدم إعداد Plugin عندما تريد عمدًا إيقاف Plugin اكتشاف الشبكة المحلية المضمّن لإعداد OpenClaw ذاك:
openclaw plugins disable bonjourمحاذير Docker
يعطّل Plugin المضمّن Bonjour تلقائيًا الإعلان متعدد البث عبر الشبكة المحلية في الحاويات المكتشفة عندما لا يكون OPENCLAW_DISABLE_BONJOUR معيّنًا. لا تمرر شبكات Docker الجسرية عادةً بث mDNS المتعدد (224.0.0.251:5353) بين الحاوية والشبكة المحلية، لذا نادرًا ما يجعل الإعلان من داخل الحاوية الاكتشاف يعمل.
محاذير:
- يبدأ Bonjour تلقائيًا على مضيفي macOS ويتطلب التفعيل الاختياري في الأنظمة الأخرى. لا يؤدي تركه معطّلًا إلى إيقاف Gateway — بل يتخطى فقط الإعلان متعدد البث عبر الشبكة المحلية.
- لا يغيّر تعطيل Bonjour قيمة
gateway.bind؛ يظل Docker يستخدم افتراضيًاOPENCLAW_GATEWAY_BIND=lanحتى يعمل منفذ المضيف المنشور. - لا يؤدي تعطيل Bonjour إلى تعطيل DNS-SD واسع النطاق. استخدم الاكتشاف واسع النطاق أو Tailnet عندما لا يكون Gateway وNode على الشبكة المحلية نفسها.
- لا يؤدي إعادة استخدام
OPENCLAW_CONFIG_DIRنفسه خارج Docker إلى الاحتفاظ بسياسة التعطيل التلقائي الخاصة بالحاوية. - عيّن
OPENCLAW_DISABLE_BONJOUR=0فقط مع شبكة المضيف أو macvlan أو شبكة أخرى يُعرف أن بث mDNS المتعدد يمر عبرها؛ وعيّنه إلى1لفرض التعطيل.
استكشاف أخطاء Bonjour المعطّل وإصلاحها
إذا توقف Node عن اكتشاف Gateway تلقائيًا بعد إعداد Docker:
-
تحقق مما إذا كان Gateway يعمل في الوضع التلقائي أو وضع التشغيل الإجباري أو وضع الإيقاف الإجباري:
bash docker compose config | grep OPENCLAW_DISABLE_BONJOUR -
تحقق من إمكانية الوصول إلى Gateway نفسه عبر المنفذ المنشور:
bash curl -fsS http://127.0.0.1:18789/healthz -
استخدم هدفًا مباشرًا عند تعطيل Bonjour:
- واجهة التحكم أو الأدوات المحلية:
http://127.0.0.1:18789 - عملاء الشبكة المحلية:
http://<gateway-host>:18789 - العملاء عبر الشبكات: Tailnet MagicDNS، أو عنوان IP في Tailnet، أو نفق SSH، أو DNS-SD واسع النطاق
- واجهة التحكم أو الأدوات المحلية:
-
إذا مكّنت Plugin Bonjour عمدًا في Docker وفرضت الإعلان باستخدام
OPENCLAW_DISABLE_BONJOUR=0، فاختبر البث المتعدد من المضيف:bash dns-sd -B _openclaw-gw._tcp local.إذا كان الاستعراض فارغًا، أو أظهرت سجلات Gateway عمليات إلغاء متكررة من مراقب السلامة ciao، فأعد
OPENCLAW_DISABLE_BONJOUR=1واستخدم مسارًا مباشرًا أو عبر Tailnet.
أوضاع الفشل الشائعة
- لا يعمل Bonjour عبر الشبكات المختلفة: استخدم Tailnet أو SSH.
- البث المتعدد محظور: تعطّل بعض شبكات Wi-Fi بروتوكول mDNS.
- توقف المُعلِن في مرحلة الاستكشاف/الإعلان: قد تؤدي الأجهزة المضيفة ذات البث المتعدد المحظور، أو جسور الحاويات، أو WSL، أو التغييرات المتكررة في الواجهات إلى بقاء مُعلِن ciao في حالة غير مُعلنة. يعيد OpenClaw المحاولة بضع مرات، ثم يعطّل Bonjour لعملية Gateway الحالية بدلًا من إعادة تشغيل المُعلِن إلى أجل غير مسمى.
- شبكة جسر Docker: يُعطَّل Bonjour تلقائيًا داخل الحاويات المكتشفة. لا تضبط
OPENCLAW_DISABLE_BONJOUR=0إلا لشبكة المضيف أو macvlan أو شبكة أخرى تدعم mDNS. - السكون/التغييرات المتكررة في الواجهات: قد يفقد macOS نتائج mDNS مؤقتًا؛ أعد المحاولة.
- يعمل التصفح لكن يفشل الحلّ: اجعل أسماء الأجهزة بسيطة (وتجنب الرموز التعبيرية أو علامات الترقيم)، ثم أعد تشغيل Gateway. يُشتق اسم مثيل الخدمة من اسم المضيف، لذلك قد تربك الأسماء شديدة التعقيد بعض أدوات الحلّ.
أسماء المثيلات المُهَرَّبة (\032)
غالبًا ما يُهرِّب Bonjour/DNS-SD وحدات البايت في أسماء مثيلات الخدمة على هيئة تسلسلات عشرية \DDD (تتحول المسافات إلى \032). هذا طبيعي على مستوى البروتوكول؛ وينبغي لواجهات المستخدم فك ترميزها عند العرض (يستخدم iOS الدالة BonjourEscapes.decode).
التمكين / التعطيل / الإعداد
| الإعداد | التأثير |
|---|---|
openclaw plugins enable bonjour |
يمكّن Plugin اكتشاف LAN المضمّن على الأجهزة المضيفة التي لا يكون مفعّلًا عليها افتراضيًا. |
openclaw plugins disable bonjour |
يعطّل إعلانات البث المتعدد عبر LAN عن طريق تعطيل Plugin المضمّن. |
OPENCLAW_DISABLE_BONJOUR=1 (أو true/yes/on) |
يعطّل إعلانات البث المتعدد عبر LAN دون تغيير إعداد Plugin. |
OPENCLAW_DISABLE_BONJOUR=0 (أو false/no/off) |
يفرض تشغيل إعلانات البث المتعدد عبر LAN، بما في ذلك داخل الحاويات المكتشفة. |
discovery.mdns.mode |
off | minimal (الافتراضي) | full — راجع الأوضاع أعلاه. |
gateway.bind |
يتحكم في وضع ربط Gateway في ~/.openclaw/openclaw.json. |
OPENCLAW_SSH_PORT |
يتجاوز منفذ SSH عند الإعلان عن sshPort (الوضع الكامل). |
OPENCLAW_TAILNET_DNS |
ينشر تلميح MagicDNS في TXT عند تمكين الوضع الكامل لـ mDNS. |
OPENCLAW_CLI_PATH |
يتجاوز مسار CLI المُعلَن (الوضع الكامل). |
تبدأ الأجهزة المضيفة التي تعمل بنظام macOS تشغيل Plugin اكتشاف LAN المضمّن تلقائيًا بشكل افتراضي. عندما يكون Plugin Bonjour مفعّلًا ولا تكون قيمة OPENCLAW_DISABLE_BONJOUR مضبوطة، يعلن Bonjour على الأجهزة المضيفة العادية ويُعطَّل تلقائيًا داخل الحاويات المكتشفة (Docker وأجهزة Fly.io وبيئات تشغيل الحاويات الشائعة).
مستندات ذات صلة
- سياسة الاكتشاف واختيار وسيلة النقل: الاكتشاف
- إقران Node والموافقات: إقران Gateway