دليل النشر

Headscale على VPS: استبدال خادم تنسيق Tailscale

انشر على VPS Cloud ←

دليل عملي

Headscale على VPS: استبدال خادم تنسيق Tailscale

النشر13 دقيقةً للقراءةعدد الخطوات: 15

‏Tailscale‏ يبسّط شبكات ‏WireGuard‏ تبسيطاً جذرياً — حتى اللحظة التي تبلغ فيها حدود الخطة المجانية، أو تدرك أن كل اتصال بين أجهزتك يمرّ بخادم تنسيق لا تتحكم فيه. ‏Headscale‏ هو التطبيق مفتوح المصدر لذلك الخادم. تثبّته على خادمك الافتراضي الخاص، وتوجّه عملاء ‏Tailscale‏ الحاليين نحوه، فتبقى شبكتك المتشابكة تحت سيطرتك الكاملة. التثبيت لا يستغرق أكثر من عشرين دقيقة. والصيانة تقتصر على تحديثات الحزم. يرشدك هذا المقال خطوةً بخطوة، من تثبيت الملف الثنائي حتى التحقق من أن عقدتين تريان بعضهما عبر ‏MagicDNS‏.

المحتويات· لماذا تستبدل خادم تنسيق Tailscale السحابي؟1/9
  1. 01لماذا تستبدل خادم تنسيق Tailscale السحابي؟
  2. 02المتطلبات قبل البدء
  3. 03تثبيت Headscale على خادم Debian/Ubuntu الافتراضي
  4. 04توصيل عقد العملاء بخادم Headscale الخاص
  5. 05التحقق: هل ترى العقد بعضها؟
  6. 06Tailscale المجاني مقابل Headscale: مقارنة واقعية
  7. 07حالة استخدام: وصول SSH بين VPS التطوير والإنتاج دون كشف المنفذ 22
  8. 08استكشاف الأخطاء: الأخطاء الأكثر شيوعاً
  9. 09Headscale: استعادة التحكم في شبكتك المتشابكة

لماذا تستبدل خادم تنسيق 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.

  1. تنزيل الملف الثنائي وتثبيته

    ‏يوزّع 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‏ يجب أن يُرجع رقم الإصدار المثبَّت.

  2. إنشاء ملف التكوين 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‏ بنطاقك الفعلي.

  3. إنشاء مجلدات البيانات وتوليد المفاتيح

    ‏أنشئ مجلد البيانات وخصّص له الصلاحيات الصحيحة:

    mkdir -p /var/lib/headscale
    chown headscale:headscale /var/lib/headscale

    شغّل ‏Headscale‏ مرة واحدة لتوليد المفاتيح الخاصة تلقائياً:

    headscale generate private-key

    ‏لا تشارك هذه الملفات أبداً واحتفظ بنسخة احتياطية منها — فهي تُوقّع هوية خادم التنسيق.

  4. تفعيل الخدمة وتشغيلها عبر systemd

    ‏تُثبّت الحزمة وحدة ‏systemd‏ تلقائياً. فعّلها عند الإقلاع وشغّل الخدمة:

    systemctl enable --now headscale
    systemctl status headscale

    ‏يجب أن تظهر ‏Active: active (running)‏. راجع السجلات إذا فشل التشغيل:

    journalctl -u headscale -f
  5. كشف 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.

  1. إنشاء مستخدم في Headscale

    ‏ينظّم ‏Headscale‏ العقد حسب المستخدمين. أنشئ أول مستخدم من الخادم الافتراضي:

    headscale users create my-team
    headscale users list
  2. توليد مفتاح مصادقة مسبق (preauthkey)

    ‏يتيح ‏preauthkey‏ تسجيل عقدة دون تدخل يدوي. ولّد مفتاحاً لمستخدمك:

    headscale preauthkeys create --user my-team --expiration 24h

    ‏الخيار ‏--reusable‏ ينشئ مفتاحاً قابلاً للاستخدام المتعدد. انسخ القيمة المُرجَعة.

  3. توصيل عقدة عميل بخيار --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‬، لا يلزم تكرار الأمر — العقدة تتصل تلقائياً عند الإعادة.

  4. التحقق من تسجيل العقدة

    من الخادم الافتراضي، أدرج العقد المسجّلة:

    headscale nodes list

    تعرض كل عقدة مسجّلة: اسمها، وعنوان IP الشبكة المتشابكة (في نطاق 100.64.x.x)، والمستخدم المرتبط بها، وحالتها. الحالة online تؤكد أن العقدة نشطة وتواصلت مع المنسّق. الحالة offline أو disconnected تعني أن العقدة لم تتصل بعد أو أن الخدمة متوقفة عليها.

التحقق: هل ترى العقد بعضها؟

بعد تسجيل العقد، تحقق من الاتصال الشامل قبل توجيه حركة المرور الفعلية عبر الشبكة المتشابكة.

  1. فحص حالة الشبكة من عقدة عميل

    ‏من أي عقدة عميل مسجّلة، شغّل:

    tailscale status

    ‏تُدرج الأمر جميع الأقران القابلين للوصول مع عناوين ‏IP‏ الشبكة المتشابكة وحالة الاتصال.

  2. اختبار الاتصال بـ ping

    ‏تعرّف على ‏IP‏ الشبكة المتشابكة للعقدة الهدف من ‏tailscale status‏ (صيغة ‏100.64.x.x‏) ثم اختبر:

    ping 100.64.0.2

    ‏ping‏ يستجيب يؤكد أن نفق ‏WireGuard‏ يعمل.

  3. اختبار دقة 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‏ ليكون متاحاً فقط عبر الشبكة المتشابكة.

  1. تحديد واجهات الشبكة المتشابكة وعناوينها

    ‏على كل خادم افتراضي، واجهة ‏WireGuard‏ التي ينشئها ‏Tailscale‏ تُسمّى ‏tailscale0‏:

    tailscale ip -4

    ‏سجّل ‏IP‏ الشبكة المتشابكة لخادم الإنتاج (مثال ‏100.64.0.3‏) وخادم التطوير (مثال ‏100.64.0.2‏).

  2. تكوين UFW لتقييد SSH على شبكة mesh

    ‏على خادم الإنتاج، عدّل قواعد ‏UFW‏:

    ufw allow in on tailscale0 to any port 22 proto tcp
    ufw deny 22
    ufw enable

    ‏المنفذ 22 لم يعد متاحاً من الإنترنت، لكنه يبقى قابلاً للوصول من أي عقدة في شبكة ‏mesh‏.

  3. الاتصال بـ 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 واحتياط ملفَي المفاتيح.

خادم افتراضي جاهز لـ Headscale في بضع نقرات

تأتي خوادمنا الافتراضية بنظامَي Debian وUbuntu مع وصول SSH بصلاحيات الجذر، وعنوان IP مخصص، والمنفذ UDP 41641 مفتوحاً. ثبّت Headscale دون عوائق واحتفظ بالتحكم في بنيتك التحتية.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة