WireGuard الثابت وHeadscale وNetbird: ثلاث مقاربات مختلفة
يعتمد WireGuard الثابت (راجع دليلنا عن WireGuard) على إعداد جامد: على كل قرين أن يعرف المفتاح العام والعنوان المتاح لنظرائه، وكل قرين جديد يفرض تعديل /etc/wireguard/wg0.conf على الآخرين. فعّال لخادمين أو ثلاثة ثابتة، لكنه يصبح غير قابل للإدارة حين تجمع منظومة وكالة بين خوادم VPS وأجهزة متنقّلة ومكاتب خلف CGNAT: إضافة جهاز تعني تعديل كل الأجهزة الأخرى، وسحب صلاحية تقني تعني إلغاء مفتاحه في كل مكان.
يعيد Headscale تنفيذ خادم التنسيق الخاص بـ Tailscale: تحتفظ بعملاء Tailscale الرسميين وتحصل على شبكة مسطّحة دون سقف لعدد المستخدمين. ويمرّ العزل بين العملاء عبر ملف سياسة ACL واحد للشبكة كلها. إنه الخيار المناسب لفريق واحد يريد البقاء ضمن منظومة Tailscale.
يسلك Netbird الطريق المعاكس: يأتي بعميله الخاص وطبقة تحكم خاصة به ومفهوم المجموعات المرتبطة بقواعد وصول دقيقة، تُدار من واجهة الويب المضمّنة منذ البداية. ويمكن لنسخة واحدة أن تستضيف عدة منظومات معزولة تمامًا، ما يجعله الأداة الطبيعية لوكالة تدير عملاء منفصلين.
بنية Netbird: خادم مدمج واحد
لم يعد سكربت التثبيت الحالي ينشر أربع حاويات منفصلة، بل يولّد حزمة Docker Compose من ثلاث خدمات:
netbird-server — الخادم المدمج. يجمع في حاوية واحدة Management (توزيع مفاتيح WireGuard، وتطبيق قواعد الوصول، وواجهة REST)، وSignal (تبادل واصفات اتصال ICE بين الأقران)، وRelay، وخادم STUN مدمجًا. يُضبط بملف config.yaml وحيد يحلّ محلّ الملفّين القديمين management.json وrelay.env. التخزين في SQLite افتراضيًا، وPostgreSQL خيارًا.
netbird-dashboard — واجهة الويب التي تستهلك واجهة Management البرمجية: المجموعات والأقران وقواعد الوصول ومفاتيح التسجيل، دون سطر أوامر.
netbird-traefik — الوكيل العكسي الذي ينهي TLS (شهادة Let's Encrypt تلقائية) ويوجّه حركة gRPC وWebSocket والواجهة البرمجية إلى الخادم.
تغييران مهمّان مقارنةً بالأدلة القديمة. لم يعد المُرحِّل هو COTURN: منذ الإصدار v0.29 يستخدم Netbird تنفيذه الخاص، الذي يمرّر الاتصالات المُرحَّلة عبر المنفذ 443 (WebSocket فوق TCP، أو QUIC فوق UDP) بدل حجز نطاق من منافذ UDP. والمصادقة صارت مدمجة: منذ الإصدار v0.62 يدير مزوّد هوية مضمَّن (مبني على Dex) المستخدمين المحليين، دون حاجة إلى نشر Zitadel أو Keycloak. وتُضاف خدمة خامسة، هي وكيل Netbird، إذا فعّلته لنشر خدمات على الإنترنت (انظر أدناه).
تمرّ كل التدفقات بين العملاء عبر WireGuard مشفّر من طرف إلى طرف: لا يرى الخادم إلا بيانات التسجيل الوصفية، ولا يرى أبدًا حركة التطبيقات. أما الرخص، فالعميل تحت BSD-3-Clause، والمجلدات management/ وsignal/ وrelay/ وcombined/ في المستودع تحت AGPLv3.
المتطلبات المسبقة
خادم VPS مخصّص لطبقة التحكم. خصّص خادمًا منفصلًا عن عُقد عملائك. يطلب توثيق Netbird معالجًا افتراضيًا واحدًا على الأقل وذاكرة 2 GB؛ ويكفي VPS Solo للبداية.
المنافذ التي يجب فتحها على خادم التحكم:
80 (TCP) — تحقّق Let's Encrypt وإعادة التوجيه إلى HTTPS.443 (TCP) — Dashboard، وواجهة Management البرمجية وgRPC، وSignal، وRelay عبر WebSocket.3478 (UDP) — خادم STUN المدمج.
لم يعد نطاق UDP 49152-65535 ضروريًا: كان يخدم مُرحِّل COTURN في الإصدارات السابقة لـ v0.29 فقط، ولا يبقى مفتوحًا إلا إذا كان عملاء قدامى ما زالوا يعتمدون عليه. ولا تحتاج عُقد العملاء إلى فتح أي منفذ وارد: يُنشئ عميل Netbird اتصالات صادرة نحو طبقة التحكم.
البرمجيات المطلوبة على خادم التحكم: Docker مع إضافة Compose، وjq وcurl، واسم نطاق يشير سجلّه A إلى عنوان IP الخادم (netbird.yourdomain.com). وإن فعّلت وكيل Netbird، فأضف سجلّ CNAME باسم *.netbird يشير إلى الاسم نفسه. وخلف Cloudflare، يضبط توثيق Netbird السجلّين على وضع DNS فقط.
على كل عقدة عميل: العميل netbird (حزمة Debian/RPM أو ملف تنفيذي ثابت)، مع صلاحيات root أو sudo.
نشر طبقة التحكم وربط ثلاث عُقد
تشغيل سكربت التثبيت
على خادم التحكم، نزّل السكربت الرسمي وشغّله:
curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh | bashيسألك السكربت عن نطاقك (
netbird.yourdomain.com)، ثم عن الوكيل العكسي المراد استخدامه: احتفظ بالخيار[0](Traefik المدمج، وTLS تلقائي). ثم يعرض تفعيل وكيل Netbird، ويمكنك إضافته لاحقًا أيضًا. يولّد الملفاتdocker-compose.ymlوconfig.yamlوdashboard.env(وproxy.envإن فُعّل الوكيل)، ثم يشغّل الحزمة. ولتثبيت بلا أسئلة (cloud-init أو CI)، صدّر مسبقًاNETBIRD_DOMAINوNETBIRD_LETSENCRYPT_EMAILوNETBIRD_NON_INTERACTIVE=true.التحقق من استجابة الخدمات
من مجلد التثبيت، تأكّد أن الحاويات تعمل:
docker compose psيجب أن ترى
netbird-traefikوnetbird-dashboardوnetbird-serverفي حالةrunning(والوكيل إن كان مفعّلًا). وعند الشك، تظهر أغلب أخطاء الإعداد في سجلّ الخادم:docker compose logs -f netbird-serverإنشاء حساب المسؤول ومفتاح Setup Key
افتح
https://netbird.yourdomain.comفي المتصفح. ينشر السكربت Netbird دون أي مستخدم: تُوجَّه إلى الصفحة/setupحيث تُنشئ حساب المسؤول (البريد الإلكتروني والاسم وكلمة المرور). ولا تتوفّر هذه الصفحة إلا ما دام لا يوجد أي مستخدم.في قائمة Setup Keys انقر على Create Setup Key. امنحه اسمًا (
vps-client-a)، واختر النوعReusable(لتسجيل عدة أجهزة بالمفتاح نفسه) ومدة صلاحية. انسخ المفتاح، فستحتاج إليه على كل عقدة.تسجيل العقدة 1
على أول خادم VPS للعميل، ثبّت عميل Netbird:
curl -fsSL https://pkgs.netbird.io/install.sh | shثم اربطه بطبقة التحكم بتوجيهه إلى نسختك (دون
--management-urlيتّجه العميل إلى خدمة Netbird السحابية):netbird up \ --management-url https://netbird.yourdomain.com \ --setup-key <YOUR_SETUP_KEY>تحقّق من الاتصال:
netbird statusيجب أن تقرأ
Management: ConnectedوSignal: Connected، إضافةً إلى عنوان IP في الشبكة المشبكة ضمن النطاق100.64.x.xيخصّصه خادمك.تسجيل العقدتين 2 و3
كرّر الإجراء نفسه تمامًا على خادمَي VPS الآخرين للعميل: أمر
curlنفسه لتثبيت العميل، وأمرnetbird upنفسه مع--management-urlنفسه و--setup-keyنفسه (إن كان من النوعReusable).بعد تسجيل العقد الثلاث، تحقّق من العقدة 1 أن الأقران ظاهرون:
netbird status --detailتعرض النتيجة كل قرين بعنوانه في الشبكة المشبكة وحالته وزمن استجابته. ومنذ الإصدار v0.82، يعرض الأمر
netbird status --tableالمعلومات نفسها في جدول.اختبار اتصال الشبكة المشبكة دون منفذ عام مفتوح
قبل الاختبار، تحقّق من حالة جدار الحماية على العقدة 1 — يجب ألا يكون أي منفذ وارد مفتوحًا نحو العقد الأخرى:
sudo ufw status numberedيجب ألا يظهر إلا منفذ SSH (22). أرسل الآن ping إلى العقدة 2 عبر عنوانها في الشبكة المشبكة (يظهر في
netbird status --detail، مثل100.64.0.2):ping -c 3 100.64.0.2يعبر الـping نفق WireGuard القائم بين القرينين. وإن تعذّر الاتصال المباشر، يتولّى المُرحِّل المدمج في الخادم المهمة عبر المنفذ 443: ينجح الـping في الحالتين، دون أي قاعدة UFW إضافية.
التمييز بين الاتصالات المباشرة والمُرحَّلة
لمعرفة ما إذا كان القرين متصلًا مباشرةً أو عبر المُرحِّل:
netbird status --detailيعرض الحقل
Connection typeالقيمةP2Pللاتصال المباشر، أوRelayedحين تمرّ الحركة عبر المُرحِّل. ولعرض الأقران المُرحَّلين فقط:netbird status -d --filter-by-connection-type Relayedالحالة
P2Pهي المتوقّعة بين خادمَي VPS لكل منهما عنوان IPv4 عام. أماRelayedفيبقى مشفّرًا من طرف إلى طرف لكنه يضيف زمن استجابة: يبيّن قسم استكشاف الأعطال ما يجب فحصه.
العزل بين العملاء: المجموعات وقواعد الوصول
تكمن قوة Netbird مقارنةً بـ Headscale في العزل حسب المجموعة، المُدار من الواجهة. نقطة يجب معرفتها أولًا: عند إنشاء الحساب يضع Netbird سياسة Default تسمح لكل أقران المجموعة الخاصة All بالتواصل فيما بينهم. وما دامت قائمة، فلا يصمد أي عزل. ولفصل خوادم العميل A عن خوادم العميل B:
1. أنشئ مجموعة لكل عميل في واجهة الويب (client-a وclient-b)، ومجموعة agency-ops لأجهزة فريقك.
2. أسند كل قرين إلى مجموعته. في صفحة القرين، ضمن قسم المجموعات، أضف المجموعة المناسبة. ويمكن لمفتاح Setup Key أيضًا أن يُسند مجموعة تلقائيًا إلى كل جهاز يُسجَّل به: خصّص مفتاحًا لكل عميل.
3. حدّد قواعد الوصول (Access Control → Policies). تسمح سياسة client-a-internal بالحركة بين أقران المجموعة client-a. وتسمح سياسة ops-ssh للمجموعة agency-ops وحدها ببلوغ المنفذ 22 في مجموعات العملاء: فلا يستطيع جهاز مخترَق داخل الشبكة المشبكة أن يكون نقطة ارتكاز نحو كل الخوادم. ولا تُنشأ أي قاعدة بين client-a وclient-b.
4. احذف سياسة Default بعد أن تصبح السياسات البديلة جاهزة. وبالترتيب المعاكس يتوقّف كل تواصل بين الأقران.
النتيجة: جهاز مسؤول لدى العميل A يبلغ خادم VPS A عبر عنوانه في الشبكة المشبكة لكنه لا يرى خادم VPS B، وتبقى المجموعة agency-ops العضو العابر الوحيد. ويمكنك أيضًا تعريف Network Routes: يؤدّي قرين دور الموجّه لشبكة فرعية خاصة (مثل 192.168.10.0/24) ويتيحها لبقية أقران المجموعة، دون عميل Netbird على كل جهاز في تلك الشبكة.
إغلاق SSH العام: الاستماع على واجهة الشبكة المشبكة فقط
بعد تسجيل العقد، لم تعد الإدارة بحاجة إلى منفذ SSH مفتوح على الإنترنت: يمرّ ssh [email protected] بالكامل داخل النفق المشفّر. ينشئ عميل Netbird واجهة WireGuard باسم wt0 (الاسم الافتراضي)؛ اسمح بـ SSH على هذه الواجهة، ثم ارفضه في غيرها:
sudo ufw allow in on wt0 to any port 22 proto tcp
sudo ufw deny 22/tcp
sudo ufw status numberedيطبّق UFW أول قاعدة مطابقة: يجب أن تظهر قاعدة wt0 قبل قاعدة الرفض. أبقِ جلسة SSH الحالية مفتوحة، واختبر اتصالًا جديدًا عبر عنوان الشبكة المشبكة قبل إغلاقها: إن لم يعمل النفق، تبقى لديك وسيلة للخروج. ثم تحدّد سياسة ops-ssh المذكورة أعلاه من يستطيع، داخل الشبكة المشبكة، بلوغ هذا المنفذ.
`netbird expose`: نشر خدمة محلية دون فتح منفذ
تربط الشبكة المشبكة أجهزتك ببعضها. ولجعل خدمة متاحة من الإنترنت دون المساس بجدار حماية الخادم، يوفّر Netbird منذ الإصدار v0.66 (فبراير 2026) الأمر netbird expose. يعتمد هذا الأمر على وكيل Netbird: في نسخة مستضافة ذاتيًا يجب أن يكون الوكيل مفعّلًا (عند التثبيت أو لاحقًا)، مع سجلّ DNS شامل (wildcard) يشير إلى الخادم.
على المسؤول أولًا أن يسمح بالميزة: Settings → Clients → Peer Expose، مع حصر مجموعات الأقران المسموح لها عند الحاجة. ثم، على خادم VPS يعمل عليه مثلًا Grafana على 127.0.0.1:3000:
netbird expose 3000 --with-name-prefix grafana --with-user-groups supervision-adminsيعرض الأمر عنوان URL عامًا على نطاق الوكيل ويُبقي الجلسة مفتوحة؛ ويزيلها Ctrl+C. الخدمة مؤقتة: يجدّدها العميل كل 30 ثانية، ويحذفها الخادم بعد نحو 90 إلى 120 ثانية من آخر تجديد إذا اختفى العميل. ويبقى المنفذ 3000 مغلقًا على جدار حماية الخادم.
دون خيار مصادقة، يكون العنوان عامًا لكل من يعرفه. وتوجد ثلاث وسائل حماية لـ HTTP: --with-user-groups (تسجيل دخول SSO محصور في المجموعات المذكورة)، و--with-password <password> (كلمة مرور تختارها أنت)، و--with-pin <6 أرقام>. أما --protocol tcp فينشر خدمة غير HTTP دون إمكانية مصادقة. ويستطيع كل قرين الاحتفاظ بعشر جلسات متزامنة، ويفشل الأمر إذا كان خيار Block Inbound Connections مفعّلًا على القرين. ولخدمة دائمة، أنشئها من Dashboard بدلًا من ذلك.
Netbird وHeadscale وWireGuard اليدوي في لمحة
مرّر الجدول أفقيًا
| المعيار | Netbird المستضاف ذاتيًا | Headscale | WireGuard اليدوي |
|---|---|---|---|
| إدارة الأقران | تلقائية، بطبقة تحكم وواجهة ويب | تلقائية، بعملاء Tailscale الرسميين | يدوية، ملف `wg0.conf` على كل عقدة |
| NAT وCGNAT | STUN مدمج، ومُرحِّل على المنفذ 443 | خوادم DERP (خادم DERP مدمج اختياري) | يتطلب عنوان IP عامًا أو إعادة توجيه منفذ |
| العزل | مجموعات وسياسات في الواجهة | ملف سياسة ACL (HuJSON) | لا شيء، سوى `AllowedIPs` لكل قرين |
| نشر خدمة | `netbird expose` أو وكيل Netbird | غير مدمج | نفق SSH أو وكيل عكسي تُعدّه بنفسك |
| الرخصة | BSD-3 (العميل)، AGPLv3 (الخادم) | BSD-3-Clause | برمجيات حرّة (نواة Linux والأدوات) |
العمليات اليومية
تجديد مفتاح Setup Key أو إلغاؤه. في واجهة الويب: Setup Keys → مفتاحك → Revoke. يحتفظ الأقران المسجّلون مسبقًا باتصالهم، وتُرفض محاولات التسجيل الجديدة بهذا المفتاح. أنشئ مفتاحًا جديدًا للتسجيلات القادمة.
إلغاء قرين. Peers → اختر القرين → Delete. تُزال العقدة من الشبكة المشبكة؛ ومن جهة العميل ينقطع الاتصال بـ Management وتُهدم أنفاق WireGuard نحو هذا القرين.
الوصول إلى الواجهة البرمجية للأتمتة. يوفّر Netbird واجهة REST موثّقة. أنشئ مستخدم خدمة (Team → Service Users) ورمز الوصول الخاص به، ثم أدِر كل شيء من سكربتات Ansible أو خطوط CI:
curl -s https://netbird.yourdomain.com/api/peers \
-H 'Authorization: Token <PAT>'المراقبة. يعرض الخادم المدمج مقاييس Prometheus على /metrics، على المنفذ 9090 افتراضيًا (المفتاح server.metricsPort في config.yaml): هدف جمع واحد يغطي Management وSignal وRelay. اربط Grafana به لمتابعة الأقران المتصلين ونشاط المُرحِّل.
التحديث. من مجلد التثبيت، اسحب الصور الجديدة ثم أعد إنشاء الحاويات:
docker compose pull netbird-server dashboard
docker compose up -d --force-recreate netbird-server dashboardأضف proxy إلى الأمرين إن كان مفعّلًا. وإذا كان docker-compose.yml يثبّت إصدارات محدّدة، فعدّل وسوم image: أولًا، لأن docker compose pull لا يغيّرها. يفقد الأقران طبقة التحكم بضع ثوانٍ أثناء إعادة التشغيل، فخطّط للعملية خارج ساعات الذروة. ويُحدَّث Traefik بمعزل عن Netbird.
التحصين: المصادقة متعددة العوامل على Dashboard ونسخ البيانات احتياطيًا
يتولّى مزوّد الهوية المضمَّن المصادقة الثنائية للحسابات المحلية: يفرض Settings → Authentication → Local MFA رمز TOTP على كل مستخدم. ويمكنك أيضًا ربط مزوّد OIDC (Keycloak أو Authentik أو Microsoft Entra ID…) وتطبيق سياسة MFA الخاصة بك فيه.
تعيش الحالة الدائمة لشبكتك (قاعدة بيانات Management ومفاتيح التشفير) في وحدة تخزين Docker باسم netbird_data، المركّبة على /var/lib/netbird: فقدانها يعني إعادة تسجيل كل أقرانك. أوقف الحزمة للحصول على نسخة متّسقة، وانسخ ملفات الإعداد ووحدة التخزين، ثم أعد التشغيل:
docker compose stop
mkdir -p backup
cp docker-compose.yml config.yaml dashboard.env backup/
docker compose cp -a netbird-server:/var/lib/netbird/ backup/
docker compose startإن كان الوكيل مفعّلًا، فأضف proxy.env وtraefik-dynamic.yaml. واحتفظ بنسخ سبعة أيام على الأقل، خارج الخادم.
استكشاف الأعطال
أقران عالقون في Relayed.
المُرحِّل يعمل، لكن الاتصال المباشر يفشل. تحقّق أولًا من أن منفذ UDP 3478 على خادم التحكم مفتوح (ufw status)، ثم من قدرة العقد على إرسال UDP صادر. على خادم VPS بعنوان IP عام ودون NAT، يكفي جدار حماية مضيف يرفض UDP الوارد غير المطلوب لإفشال الاتصال المباشر؛ ويقترح توثيق Netbird عندئذٍ sudo ufw allow in proto udp to any port 49152:65535 على حساب فتح أوسع، أو قبول المُرحِّل. والقرين الذي يظهر Connected ولا يردّ على الـping يدلّ غالبًا على الحجب نفسه، من جهة الواجهة wt0.
UDP محجوب في شبكة شركة.
لا شيء يحتاج إلى ضبط: منذ الإصدار v0.36 يجرّب العميل المُرحِّل عبر QUIC (UDP/443) وعبر WebSocket (TCP/443)، ويحتفظ بأول ما يستجيب. وإن لم يمرّ سوى TCP/443 الصادر، يبقى القرين متصلًا في الوضع المُرحَّل.
قرين عالق في Connecting.
نجح التسجيل لكن النفق لا يتكوّن. تحقّق من أن netbird status يعرض فعلًا Signal: Connected، وأن الخادم يعلن عنوانًا عامًا صحيحًا (الحقل exposedAddress في config.yaml)، وأن المنفذين 443/TCP و3478/UDP متاحان من العقدة.
قراءة السجلّات.
من جهة الخادم: docker compose logs -f netbird-server. ومن جهة العميل يُكتب السجلّ افتراضيًا في /var/log/netbird/client.log. ولتشخيص كامل، يضع الأمر netbird debug for 5m العميل في وضع التسجيل المفصّل خمس دقائق ثم ينتج أرشيف تشخيص (وينتجه netbird debug bundle فورًا).
تحليل أسماء DNS بين الأقران.
يمنح Netbird كل قرين اسم DNS يظهر في الحقل Domain Name في صفحته. فإن فشل الـping بالاسم بينما ينجح ping 100.64.0.2، فتحقّق من أن الخدمة تعمل على القرين (sudo netbird service status) وأن DNS النظام يمرّ فعلًا عبر Netbird (resolvectl status).
وكيل Netbird عالق على «Issuing certificate…»
حين يُفعَّل الوكيل، يتكرّر عَرَض بعينه: تبقى الخدمة المنشأة على «Issuing certificate…» (الحالة certificate_pending أو certificate_failed) ولا يمكن بلوغها أبدًا. ما زالت التذكرة netbird #5517، المفتوحة في 5 مارس 2026، مفتوحةً حتى 7 نوفمبر 2026 بستة وثلاثين تعليقًا ووسم triage-needed. والرسالة الأكثر تكرارًا في سجلّ الوكيل، no viable challenge type found، لا تقول إلا إن سلطة الشهادات لم تتلقَّ أي ردّ صالح على تحدّياتها: فلا يوجد سبب واحد. ابدأ بقراءة السجلّ (docker compose logs proxy | grep -i acme) ودوّن الخطأ بدقّة، ثم استبعد الأسباب واحدًا تلو الآخر.
ترتيب تشخيص شهادة لا تصدر
- صلاحيات مجلد الشهادات — خطأ
permission deniedعلى/certsهو الحالة الوحيدة التي حسمها أحد المساهمين في المستودع: لن يصلحه أي تحديث، فالسبب صلاحيات نظام الملفات. تحقّق من المستخدم الذي تعمل به الحاوية قبل تغيير الصلاحيات. - DNS وCAA والمنافذ — يجب أن يُحلّ الاسم إلى الوكيل، وألا يستبعد أي سجلّ CAA سلطة Let's Encrypt. ويجب أن يكون المنفذ 443 متاحًا من الإنترنت لتحدّي
tls-alpn-01(الافتراضي)، والمنفذ 80 لتحدّيhttp-01. تتحقّق Let's Encrypt من عدة مناطق في العالم، فيُفشل الحجب الجغرافي التحقّق. - شبكة CDN أو وكيل في الأمام — لا تمرّر Cloudflare وبعض الأجهزة بروتوكول ALPN
acme-tls/1. في هذه الحالة انتقل إلىNB_PROXY_ACME_CHALLENGE_TYPE=http-01فيproxy.env. - Traefik في الواجهة — إذا كان Traefik يمرّر TLS إلى الوكيل دون فكّه، فيجب أن تحمل نقطة الدخول HTTPS الخيار
allowACMEByPass=true، الذي يضعه سكربت التثبيت علىwebsecure. وعلى Traefik قائم، استخدم اسم نقطة الدخول الخاصة بك؛ فقد اضطر مشاركون في التذكرة إلى إضافته على نقطة دخول HTTP أيضًا، بينما كان لدى آخرين دون نتيجة. - ما لم يثبت بعد — لا يمثّل أيٌّ من هذه المسارات «السبب» بعينه: اختبرها على تثبيتك قبل أن تستنتج.
أصل مغلق: الشهادة عبر DNS-01 باستخدام lego
يتطلب التحدّيان tls-alpn-01 وhttp-01 أن تصل السلطة إلى وكيلك من الإنترنت، وهذا يتعارض مع أصل مغلق إلا أمام نطاقات شبكة CDN أو مع حجب جغرافي. أما التحدّي dns-01 فيرفع هذا القيد: يثبت التحكّم في النطاق بسجلّ TXT مؤقت يُنشأ عبر واجهة مزوّد DNS البرمجية. لا يدعمه وكيل Netbird أصلًا: فالطلب (التذكرة #5450، المفتوحة في 25 فبراير 2026) ما زال مفتوحًا. لكن توثيق Netbird يصف إعدادًا باسم «private proxy with lego»: يحصل lego على شهادة شاملة (wildcard) ويجدّدها عبر DNS-01، ويضعها خطّاف نشر في وحدة تخزين مشتركة، ثم يعيد الوكيل تحميلها دون إيقاف بعد كل تجديد.
نقاط الانتباه في إعداد lego
- متغيّرات الوكيل — يحدّد
NB_PROXY_WILDCARD_CERT_DIRمجلد الشهادات الشاملة، ويفعّلNB_PROXY_PRIVATE=trueالاستماع الخاص على الشبكة المشبكة. ثبّت صورة للوكيل تعرف هذين المتغيّرين. - الوضع الخاص لا يغلق شيئًا وحده — لا يعطّل
NB_PROXY_PRIVATEالاستماع العادي للوكيل. أزِل بنفسك المنافذ المنشورة ومسارات الدخول (وسوم Traefik، وCaddy، وnginx) المؤدية إلى الحاوية. - نطاق الشهادة الشاملة — لا تغطي
*.proxy.yourdomain.comإلا مستوى واحدًا من النطاقات الفرعية. وأي اسم خارج التغطية يعود إلى ACME المدمج، الذي لا يمكن أن ينجح إذا كان الوكيل خاصًا بالكامل. - انكشاف الشهادة — تظهر الشهادة الشاملة والنطاق الأساسي في سجلّات Certificate Transparency، لا أسماء الخدمات التي تغطيها؛ لكن اختراق مفتاحها يطال كل تلك الأسماء.
- التشغيل — استخدم خادم ACME الإنتاجي لدى Let's Encrypt (شهادات الاختبار غير موثوقة)، وانسخ وحدات تخزين lego والشهادات احتياطيًا، وثبّت إصدارات مختبَرة من lego والوكيل.
ما تغيّره الشبكة المشبكة في إدارة الخوادم
تحلّ شبكة Netbird المشبكة المستضافة ذاتيًا محلّ ثلاث طبقات تصونها يدويًا: توزيع مفاتيح WireGuard، وقواعد UFW بين الخوادم، وتوثيق صلاحيات الوصول المتقاطعة. يُسجَّل كل خادم VPS جديد للعميل بأمر واحد، وكل إلغاء فوري ومركزي. ويمكن إغلاق SSH العام، وينشر netbird expose خدمة عند الطلب دون فتح أي منفذ.
يتيح لك العزل بالمجموعات النمو دون خطر التداخل: لا يمكن لخوادم عميلين مختلفين أن ترى بعضها، حتى إن كانت تعمل على البنية التحتية نفسها. وتبقى طبقة التحكم تحت سيطرتك: لا اعتماد على خدمة SaaS خارجية، ولا حدّ لعدد المقاعد، ولا اشتراك لكل عقدة.
وللمضيّ أبعد، صِف تجهيز العقد في Ansible (راجع دليلنا عن Ansible): يصبح تثبيت العميل والأمر netbird up وقواعد UFW على wt0 مهامّ متكرّرة النتيجة (idempotent) ضمن دور قابل لإعادة الاستخدام.