لماذا تستبدل خادم تنسيق Tailscale السحابي؟
يُفوِّض Tailscale تنسيق WireGuard إلى خدمة سحابية خارجية. يُعيد Headscale هذه الوظيفة بصيغة مفتوحة المصدر على VPS الخاص بك — دون اعتماد خارجي، وتبقى بيانات الطوبولوجيا داخل بنيتك التحتية.
Tailscale لا يحمل حركة بيانات شبكتك: حزم WireGuard تنتقل مباشرةً من عقدة إلى أخرى، مشفّرةً من طرف إلى طرف. ما تديره Tailscale عبر سحابتها هو مستوى التحكم — تبادل المفاتيح العامة، واكتشاف الأقران، وتعيين عناوين IP ضمن الشبكة الفرعية 100.x.x.x، وحل MagicDNS، وتوزيع مرحّلات DERP. بدون خادم التنسيق، لا تستطيع العقد إيجاد بعضها. Headscale هو التطبيق مفتوح المصدر لهذا الخادم: يتحدث البروتوكول ذاته الذي يتحدثه متحكم Tailscale تماماً، مما يعني أن عملاء Tailscale الحاليين يعملون دون تعديل — يكفي توجيههم نحو رابط تسجيل دخول جديد.
- خصوصية البيانات الوصفية: لا تعبر أي قائمة بأجهزتك أو عناوين IP الداخلية أو أسماء العقد عبر خادم طرف ثالث. مستوى التحكم يبقى في بنيتك التحتية.
- بلا حد مفروض على العقد: Headscale لا يفرض سقفاً على عدد الأجهزة المسجّلة — حدودك هي موارد خادمك الافتراضي، لا شبكة أسعار.
- بلا حد على المستخدمين: الخطة المجانية من Tailscale مقيّدة بـ 3 مستخدمين؛ Headscale يدير عدداً من المستخدمين بقدر ما تنشئ.
- BYOD بلا حساب Tailscale: يتصل متعاونوك عبر مفتاح المصادقة المسبق الذي تولّده، دون الحاجة إلى إنشاء حساب على tailscale.com.
- تكامل OIDC اختياري: يدعم Headscale تفويض المصادقة لمزوّد OIDC (مثل Keycloak أو Authelia أو Google Workspace) للفرق التي لديها SSO بالفعل.
- خوادم DERP قابلة للتخصيص: يمكنك تكوين مرحّلات DERP خاصة بك على خوادمك الافتراضية لتقليل زمن الاستجابة.
- الديمومة: شبكتك المتشابكة لا تعتمد على قرارات تجارية لمزوّد خارجي، ولا على احتمالات توقف بنيته التحتية.
المتطلبات قبل البدء
قبل تثبيت Headscale، تأكد من أن بيئتك تستوفي المتطلبات التالية.
- خادم افتراضي يعمل بنظام Debian 11/12 أو Ubuntu 22.04/24.04، بذاكرة وصول عشوائي لا تقل عن 1 غيغابايت وصلاحيات الجذر — Headscale يستهلك أقل من 50 ميغابايت في التشغيل الاعتيادي.
- المنفذ UDP 41641 متاح من الإنترنت على الخادم الافتراضي: هذا هو منفذ الإشارة WireGuard الذي يستخدمه عملاء Tailscale للاتصال بالمنسّق.
- المنفذ TCP 443 أو 8080 مفتوح لـ API HTTP/HTTPS الخاص بـ Headscale.
- عميل Tailscale مثبَّت على كل عقدة تريد ربطها — تطبيق Tailscale الرسمي يعمل كما هو مع Headscale.
- اختياري: اسم نطاق يشير إلى خادمك الافتراضي إذا أردت تفعيل HTTPS بشهادة Let's Encrypt و MagicDNS على لاحقة مخصصة.
تثبيت Headscale على خادم Debian/Ubuntu الافتراضي
يُثبَّت Headscale عبر الحزمة الرسمية .deb. تشمل الإعدادات الملف الثنائي وخدمة systemd وإعداد nginx الذي يُقدِّم واجهة gRPC API وواجهة DERP.
تنزيل الملف الثنائي وتثبيته
يوزّع Headscale حزم
.deb لمعماريتَي amd64 و arm64. احضر الإصدار الأخير من GitHub وثبّته بـ dpkg:HEADSCALE_VERSION=$(curl -s https://api.github.com/repos/juanfont/headscale/releases/latest | grep tag_name | cut -d '"' -f4 | tr -d 'v') curl -Lo /tmp/headscale.deb \ https://github.com/juanfont/headscale/releases/latest/download/headscale_${HEADSCALE_VERSION}_linux_amd64.deb dpkg -i /tmp/headscale.debعلى ARM64، استبدل
linux_amd64 بـ linux_arm64. تحقق من التثبيت: headscale version يجب أن يُرجع رقم الإصدار المثبَّت.إنشاء ملف التكوين YAML
تنشئ الحزمة تلقائياً مستخدم النظام
headscale ومجلد /etc/headscale/. حرّر ملف التكوين الرئيسي:nano /etc/headscale/config.yamlتكوين أدنى صالح للعمل:
server_url: https://votre-domaine.com listen_addr: 0.0.0.0:8080 private_key_path: /var/lib/headscale/private.key noise: private_key_path: /var/lib/headscale/noise_private.key ip_prefixes: - 100.64.0.0/10 derp: urls: - https://controlplane.tailscale.com/derpmap/default auto_update_enabled: true db_type: sqlite3 db_path: /var/lib/headscale/db.sqlite dns_config: magic_dns: true base_domain: votre-domaine.comاستبدل
votre-domaine.com بنطاقك الفعلي.إنشاء مجلدات البيانات وتوليد المفاتيح
أنشئ مجلد البيانات وخصّص له الصلاحيات الصحيحة:
mkdir -p /var/lib/headscale chown headscale:headscale /var/lib/headscaleشغّل Headscale مرة واحدة لتوليد المفاتيح الخاصة تلقائياً:
headscale generate private-keyلا تشارك هذه الملفات أبداً واحتفظ بنسخة احتياطية منها — فهي تُوقّع هوية خادم التنسيق.
تفعيل الخدمة وتشغيلها عبر systemd
تُثبّت الحزمة وحدة systemd تلقائياً. فعّلها عند الإقلاع وشغّل الخدمة:
systemctl enable --now headscale systemctl status headscaleيجب أن تظهر
Active: active (running). راجع السجلات إذا فشل التشغيل:journalctl -u headscale -fكشف Headscale عبر وكيل عكسي HTTPS (موصى به)
لتتصل العملاء عبر HTTPS، ضع Headscale خلف nginx مع شهادة Let's Encrypt:
apt install -y nginx certbot python3-certbot-nginx certbot --nginx -d votre-domaine.comتكوين nginx لـ Headscale:
server { listen 443 ssl; server_name votre-domaine.com; location / { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; } }
توصيل عقد العملاء بخادم Headscale الخاص
بمجرد تشغيل خادم Headscale، تُشغِّل كل آلة عميل daemon الخاص بـ Tailscale مُوجَّهًا إلى عنوان URL الخاص بـ Headscale بدلاً من خوادم Tailscale Inc.
إنشاء مستخدم في Headscale
ينظّم Headscale العقد حسب المستخدمين. أنشئ أول مستخدم من الخادم الافتراضي:
headscale users create my-team headscale users listتوليد مفتاح مصادقة مسبق (preauthkey)
يتيح preauthkey تسجيل عقدة دون تدخل يدوي. ولّد مفتاحاً لمستخدمك:
headscale preauthkeys create --user my-team --expiration 24hالخيار
--reusable ينشئ مفتاحاً قابلاً للاستخدام المتعدد. انسخ القيمة المُرجَعة.توصيل عقدة عميل بخيار --login-server
على كل جهاز عميل (Linux أو macOS أو Windows أو iOS أو Android)، يُستخدم عميل Tailscale الرسمي. عند الاتصال الأول، حدّد رابط خادم Headscale بعلامة --login-server:
على Linux:
tailscale up --login-server https://votre-domaine.com --authkey VOTRE_PREAUTHKEYعلى macOS، شغّل من الطرفية:
tailscale up --login-server https://votre-domaine.com --authkey VOTRE_PREAUTHKEYعلى Windows، أنشئ مفتاح تسجيل جديداً بـ
--authkeyوشغّل العميل من نافذة PowerShell بصلاحيات المسؤول. بعد التسجيل الأول بـpreauthkey، لا يلزم تكرار الأمر — العقدة تتصل تلقائياً عند الإعادة.التحقق من تسجيل العقدة
من الخادم الافتراضي، أدرج العقد المسجّلة:
headscale nodes listتعرض كل عقدة مسجّلة: اسمها، وعنوان IP الشبكة المتشابكة (في نطاق
100.64.x.x)، والمستخدم المرتبط بها، وحالتها. الحالةonlineتؤكد أن العقدة نشطة وتواصلت مع المنسّق. الحالةofflineأوdisconnectedتعني أن العقدة لم تتصل بعد أو أن الخدمة متوقفة عليها.
التحقق: هل ترى العقد بعضها؟
بعد تسجيل العقد، تحقق من الاتصال الشامل قبل توجيه حركة المرور الفعلية عبر الشبكة المتشابكة.
فحص حالة الشبكة من عقدة عميل
من أي عقدة عميل مسجّلة، شغّل:
tailscale statusتُدرج الأمر جميع الأقران القابلين للوصول مع عناوين IP الشبكة المتشابكة وحالة الاتصال.
اختبار الاتصال بـ ping
تعرّف على IP الشبكة المتشابكة للعقدة الهدف من
tailscale status (صيغة 100.64.x.x) ثم اختبر:ping 100.64.0.2ping يستجيب يؤكد أن نفق WireGuard يعمل.
اختبار دقة MagicDNS
إذا فعّلت
magic_dns: trueفي إعداد Headscale وحدّدتbase_domain، يمكن الوصول لكل عقدة باسمها القصير:ping nom-du-noeud # أو بالاسم الكامل FQDN ping nom-du-noeud.votre-domaine.comتعمل دقة DNS عبر الشبكة الفرعية المتشابكة — لا يلزم أي سجل DNS عام للأسماء الداخلية. إذا فشلت الدقة، تحقق من أن
dns_config.base_domainمضبوط فيconfig.yamlوأنnameserversيتضمن عناوين DNS صالحة. لاحظ أن هذه الميزة تعمل فقط على العقد التي تشغّل tailscaled بالإعداد الكامل.
Tailscale المجاني مقابل Headscale: مقارنة واقعية
مرّر الجدول أفقيًا
| المعيار | Tailscale المجاني | Headscale (ذاتي الإدارة) |
|---|---|---|
| عدد المستخدمين | 3 مستخدمين كحد أقصى | لا حد مفروض من البرنامج |
| عدد العقد | 100 عقدة كحد أقصى | لا حد مفروض من البرنامج |
| خادم التنسيق | سحابة Tailscale (بنية تحتية لطرف ثالث) | خادمك الافتراضي الخاص |
| التكلفة الشهرية | مجاني ضمن حدود الخطة | تكلفة الخادم الافتراضي فقط |
| العميل المستخدم | عميل Tailscale الرسمي | عميل Tailscale الرسمي (متوافق، --login-server) |
| MagicDNS | نعم، على tailnet تديره Tailscale | نعم، على نطاقك المخصص |
| OIDC / SSO | متاح في الخطط المدفوعة | متاح مجاناً عبر تكوين YAML |
| الصيانة التشغيلية | لا شيء (خدمة مُدارة) | تحديثات الحزم والنسخ الاحتياطي للمفاتيح |
حالة استخدام: وصول SSH بين VPS التطوير والإنتاج دون كشف المنفذ 22
تُتيح شبكة Headscale المتشابكة الوصول عبر SSH بين الخوادم دون فتح المنفذ 22 على الواجهة العامة — يمر الاتصال عبر عنوان IP الداخلي لـ Tailscale من خلال نفق WireGuard.
من أكثر حالات الاستخدام شيوعاً في شبكة mesh هو وصول SSH بين الأجهزة دون كشف المنفذ 22 للإنترنت. مع Headscale، تكون خوادم التطوير والإنتاج مسجّلةً في الشبكة المتشابكة ذاتها. إليك طريقة قفل SSH ليكون متاحاً فقط عبر الشبكة المتشابكة.
تحديد واجهات الشبكة المتشابكة وعناوينها
على كل خادم افتراضي، واجهة WireGuard التي ينشئها Tailscale تُسمّى
tailscale0:tailscale ip -4سجّل IP الشبكة المتشابكة لخادم الإنتاج (مثال
100.64.0.3) وخادم التطوير (مثال 100.64.0.2).تكوين UFW لتقييد SSH على شبكة mesh
على خادم الإنتاج، عدّل قواعد UFW:
ufw allow in on tailscale0 to any port 22 proto tcp ufw deny 22 ufw enableالمنفذ 22 لم يعد متاحاً من الإنترنت، لكنه يبقى قابلاً للوصول من أي عقدة في شبكة mesh.
الاتصال بـ SSH عبر شبكة mesh
من خادم التطوير أو محطة العمل المسجّلة:
ssh [email protected] # أو عبر MagicDNS إذا كان مفعّلاً ssh [email protected]الاتصال يمرّ كاملاً عبر نفق WireGuard المشفّر. لا منفذ مفتوح على الإنترنت لخادم الإنتاج.
التصليب: فعّل قوائم التحكم بالوصول (acls: في config.yaml) لتحديد العقد التي يمكنها الوصول إلى بعضها وعلى أي منافذ. فعّل سجلات التدقيق (log: level: info). حدّث Headscale بانتظام — التوافق مع إصدارات عميل Tailscale الحديثة يُصان في الإصدارات الحديثة من الخادم.
استكشاف الأخطاء: الأخطاء الأكثر شيوعاً
أكثر المشكلات شيوعًا عند نشر Headscale تتعلق بالاتصال بالشبكة وشهادات TLS ومزامنة مفاتيح WireGuard.
المنفذ UDP 41641 مغلق. هذا السبب الأكثر شيوعاً لفشل الاتصال المباشر بين العقد. يجب فتح المنفذ 41641 على بروتوكول UDP في الخادم الافتراضي حتى تتمكن العقد من إنشاء أنفاق WireGuard. تحقق بـ ufw status وافتحه إذا لزم: ufw allow 41641/udp. إذا بقي مغلقاً، ينتقل الاتصال إلى وضع مرحّل DERP — تعمل العقد لكن مع تأخير أعلى.
مشكلة DERP: العقد مرئية لكن غير قابلة للوصول. يستخدم Headscale خريطة DERP العامة من Tailscale افتراضياً (controlplane.tailscale.com/derpmap/default). إذا كانت منطقة خادمك غير مغطاة أو كان HTTPS الصادر مقيّداً، فالمرحّلات غير متاحة. تحقق بـ tailscale netcheck من أي عقدة عميل — تقيس الأمر التأخير نحو كل منطقة DERP وتُشير إلى تلك غير الفعّالة.
انحراف الساعة: خطأ مصادقة. يستخدم Headscale رموز JWT قصيرة الصلاحية. إذا انحرفت ساعة الخادم أو عقدة عميل أكثر من دقيقتين، تُرفض الرموز برسالة token is expired أو token is not yet valid. زامن الساعة: systemctl enable --now systemd-timesyncd على Debian/Ubuntu.
عقدة تُسجَّل لكن تظهر offline. اتصلت العقدة بالخادم لحظة التسجيل لكنها لا تحافظ على اتصال مستمر. تحقق من تشغيل خدمة Tailscale على العقدة: systemctl status tailscaled. راجع السجلات: journalctl -u tailscaled -f. السبب الأكثر شيوعاً هو جدار حماية محلي يحجب الاتصالات الصادرة على UDP.
Headscale: استعادة التحكم في شبكتك المتشابكة
يُحوِّل Headscale الاشتراك في خدمة سحابية خاصة إلى بنية تحتية للشبكة تُشغِّلها بنفسك وتُراجعها وتُوسِّعها — دون تغيير تجربة المستخدم على جانب العميل.
ينقل Headscale خادم تنسيق Tailscale من بنية تحتية لطرف ثالث إلى خادمك الافتراضي الخاص. النتيجة شبكة WireGuard mesh متطابقة وظيفياً — نفس العملاء، نفس MagicDNS، نفس سلوك اختراق NAT — لكن تحت سيطرتك الكاملة. للفرق التي تتجاوز حدود الخطة المجانية (3 مستخدمين أو 100 عقدة في Tailscale)، يُعدّ Headscale بديلاً مباشراً دون تغيير أي أداة من جانب العميل. ولمن لا يريد ببساطة أن يكون خادم طرف ثالث في حلقة بنيته التحتية، فهو الخيار الوحيد المتوافق مع هذا المتطلب. التثبيت الموصوف هنا يستغرق أقل من عشرين دقيقة؛ وتتلخص الصيانة في تحديث حزمة Debian واحتياط ملفَي المفاتيح.