Remote access
Tailscale
يمكن لـ OpenClaw تهيئة Tailscale Serve (ضمن tailnet) أو Funnel (عام) تلقائيًا للوحة معلومات Gateway ومنفذ WebSocket. يُبقي هذا Gateway مرتبطًا بواجهة loopback، بينما يوفّر Tailscale بروتوكول HTTPS والتوجيه وترويسات الهوية (في حالة Serve).
الأوضاع
gateway.tailscale.mode:
| الوضع | السلوك |
|---|---|
serve |
خدمة Serve ضمن Tailnet فقط عبر tailscale serve. يظل Gateway على 127.0.0.1. |
funnel |
بروتوكول HTTPS عام عبر tailscale funnel. يتطلب كلمة مرور مشتركة. |
off (افتراضي) |
لا توجد أتمتة لـ Tailscale. |
تستخدم مخرجات الحالة والتدقيق مصطلح إتاحة Tailscale لوضع Serve/Funnel هذا في OpenClaw. يعني off أن OpenClaw لا يدير Serve أو Funnel؛ ولا يعني أن عفريت Tailscale المحلي متوقف أو مسجّل الخروج.
أمثلة التهيئة
ضمن Tailnet فقط (Serve)
{ gateway: { bind: "loopback", tailscale: { mode: "serve" }, },}افتح: https://<magicdns>/ (أو gateway.controlUi.basePath الذي هيّأته)
لإتاحة واجهة التحكم عبر خدمة Tailscale مسماة بدلًا من اسم مضيف الجهاز، اضبط gateway.tailscale.serviceName على اسم الخدمة:
{ gateway: { bind: "loopback", tailscale: { mode: "serve", serviceName: "svc:openclaw" }, },}عندئذٍ يُبلّغ بدء التشغيل عن عنوان URL للخدمة بالشكل https://openclaw.<tailnet-name>.ts.net/ بدلًا من اسم مضيف الجهاز. تتطلب خدمات Tailscale أن يكون المضيف عقدة موسومة معتمدة في شبكة tailnet لديك — هيّئ الوسم واعتمد الخدمة في Tailscale قبل تمكين ذلك، وإلا يفشل tailscale serve --service=... أثناء بدء تشغيل Gateway.
ضمن Tailnet فقط (الربط بعنوان IP لشبكة Tailnet)
استخدم هذا لجعل Gateway يستمع مباشرةً على عنوان IP لشبكة Tailnet، من دون Serve/Funnel:
{ gateway: { bind: "tailnet", auth: { mode: "token", token: "your-token" }, },}اتصل من جهاز آخر ضمن Tailnet:
- واجهة التحكم:
http://<tailscale-ip>:18789/ - WebSocket:
ws://<tailscale-ip>:18789
الإنترنت العام (Funnel + كلمة مرور مشتركة)
{ gateway: { bind: "loopback", tailscale: { mode: "funnel" }, auth: { mode: "password", password: "replace-me" }, },}فضّل OPENCLAW_GATEWAY_PASSWORD على حفظ كلمة مرور على القرص ضمن الملفات الملتزم بها.
أمثلة CLI
openclaw gateway --tailscale serveopenclaw gateway --tailscale funnel --auth passwordالمصادقة
يتحكم gateway.auth.mode في المصافحة:
| الوضع | حالة الاستخدام |
|---|---|
none |
دخول خاص فقط |
token (الافتراضي عند ضبط OPENCLAW_GATEWAY_TOKEN) |
رمز مميز مشترك |
password |
سر مشترك عبر OPENCLAW_GATEWAY_PASSWORD أو التهيئة |
trusted-proxy |
وكيل عكسي مدرك للهوية؛ راجع مصادقة الوكيل الموثوق |
ترويسات هوية Tailscale (Serve فقط)
عندما يكون tailscale.mode: "serve" وgateway.auth.allowTailscale مضبوطًا على true، يمكن لمصادقة واجهة التحكم/WebSocket استخدام ترويسات هوية Tailscale (tailscale-user-login) بدلًا من رمز مميز/كلمة مرور. يتحقق OpenClaw من الترويسة عبر تحليل عنوان x-forwarded-for الخاص بالطلب باستخدام عفريت Tailscale المحلي (tailscale whois) ومطابقته مع اسم تسجيل الدخول في الترويسة قبل قبوله. لا يتأهل الطلب لهذا المسار إلا عندما يصل من loopback حاملًا ترويسات Tailscale x-forwarded-for وx-forwarded-proto وx-forwarded-host.
يفترض هذا التدفق الخالي من الرموز المميزة أن مضيف Gateway موثوق. إذا كان من الممكن تشغيل شيفرة محلية غير موثوقة على المضيف نفسه، فاضبط gateway.auth.allowTailscale: false واطلب بدلًا من ذلك المصادقة برمز مميز/كلمة مرور.
نطاق التجاوز:
- ينطبق فقط على سطح مصادقة WebSocket الخاص بواجهة التحكم. لا تستخدم نقاط نهاية واجهة HTTP API (
/v1/*و/tools/invokeو/api/channels/*وغيرها) مطلقًا مصادقة ترويسة هوية Tailscale؛ بل تتبع دائمًا وضع مصادقة HTTP المعتاد لـ Gateway. - بالنسبة إلى جلسات مشغّل واجهة التحكم التي تحمل بالفعل هوية جهاز المتصفح، تتجاوز هوية Tailscale المتحقق منها رحلة إقران رمز التمهيد/رمز QR.
- لا يتجاوز ذلك هوية الجهاز نفسها: يظل العملاء الذين لا يملكون هوية جهاز مرفوضين، وتظل اتصالات أدوار العقد تمر عبر عمليات الإقران والتحقق من المصادقة المعتادة.
ملاحظات
- يتطلب Tailscale Serve/Funnel تثبيت CLI الخاص بـ
tailscaleوتسجيل الدخول إليه. - يرفض
tailscale.mode: "funnel"بدء التشغيل ما لم يكن وضع المصادقةpassword، لتجنب الإتاحة العامة. - ينطبق
gateway.tailscale.serviceNameعلى وضع Serve فقط ويُمرر إلىtailscale serve --service=<name>. يجب أن تستخدم القيمة تنسيق Tailscalesvc:<dns-label>، مثلsvc:openclaw. يتطلب Tailscale أن تكون مضيفات الخدمة عقدًا موسومة، وقد تحتاج الخدمة إلى اعتماد من وحدة تحكم المشرف قبل أن يتمكن Serve من نشرها. - يتراجع
gateway.tailscale.resetOnExitعن تهيئةtailscale serve/tailscale funnelعند إيقاف التشغيل. - يُبقي
gateway.tailscale.preserveFunnel: trueمسارtailscale funnelالمهيأ خارجيًا نشطًا عبر عمليات إعادة تشغيل Gateway. معmode: "serve"، يتحقق OpenClaw منtailscale funnel statusقبل إعادة تطبيق Serve ويتخطاه عندما يغطي مسار Funnel منفذ Gateway بالفعل. تظل سياسة Funnel الذي يديره OpenClaw والقائمة على كلمة المرور فقط دون تغيير. - يستخدم
gateway.bind: "tailnet"ربطًا مباشرًا بشبكة Tailnet (من دون HTTPS أو Serve/Funnel) إضافةً إلى127.0.0.1المحلي المطلوب عند توفر عنوان IPv4 لشبكة Tailnet؛ وإلا فإنه يعود إلى loopback فقط. - يفضّل
gateway.bind: "auto"واجهة loopback؛ استخدمtailnetلقصر إتاحة الشبكة على Tailnet مع الاحتفاظ بوصول loopback على المضيف نفسه. - لا يتيح Serve/Funnel سوى واجهة تحكم Gateway + WS. تتصل العقد عبر نقطة نهاية WS نفسها في Gateway، لذا يعمل Serve للوصول إلى العقد أيضًا.
متطلبات Tailscale وحدوده
- يتطلب Serve تمكين HTTPS لشبكة tailnet لديك؛ يعرض CLI مطالبة إذا لم يكن مفعّلًا.
- يحقن Serve ترويسات هوية Tailscale؛ أما Funnel فلا يفعل ذلك.
- يتطلب Funnel إصدار Tailscale v1.38.3 أو أحدث وMagicDNS وتمكين HTTPS وسمة عقدة funnel.
- لا يدعم Funnel سوى المنافذ
443و8443و10000عبر TLS. - يتطلب Funnel على macOS إصدار تطبيق Tailscale مفتوح المصدر.
التحكم في المتصفح (Gateway بعيد + متصفح محلي)
لتشغيل Gateway على جهاز والتحكم في متصفح على جهاز آخر، شغّل مضيف عقدة على جهاز المتصفح وأبقِ كليهما على شبكة tailnet نفسها. يمرر Gateway إجراءات المتصفح إلى العقدة؛ ولا حاجة إلى خادم تحكم منفصل أو عنوان URL لخدمة Serve.
تجنب Funnel للتحكم في المتصفح؛ وتعامل مع إقران العقدة مثل وصول المشغّل.
معرفة المزيد
- نظرة عامة على Tailscale Serve: https://tailscale.com/kb/1312/serve
- أمر
tailscale serve: https://tailscale.com/kb/1242/tailscale-serve - نظرة عامة على Tailscale Funnel: https://tailscale.com/kb/1223/tailscale-funnel
- أمر
tailscale funnel: https://tailscale.com/kb/1311/tailscale-funnel