استضافة خادم NetBird VPN ذاتياً على VPS
شغّل NetBird على VPS واحد مع إعداد DNS وTLS، وثبّت سكربت التثبيت السريع، وأنشئ مفاتيح إعداد للأجهزة غير التفاعلية، ثم قارنه بـ Headscale.
ما الذي يوفّره استضافة خادم NetBird VPN ذاتياً
يضع تشغيل خادم NetBird VPN ذاتياً طبقة التحكم على VPS تملكه أنت. وهي الجزء الذي يحتفظ بقائمة الأقران، ويحدّد الجهاز الذي يمكنه الوصول إلى جهاز آخر، ويساعد جهازين متصلين عبر NAT (ترجمة عناوين الشبكة) في العثور أحدهما على الآخر. أما الأنفاق نفسها فتبقى أنفاق WireGuard، مع تشفير مباشر بين أجهزتك. ما يتغيّر هو أن شركة خارجية لا تعود تحتفظ بقائمة أجهزتك أو تدير عملية تسجيل دخولك. يجب أن تكون واضحاً بشأن ما يوفّره ذلك، لأن طبقة التحكم المستضافة لا تحتفظ أصلاً بالمفاتيح التي تشفّر حركة مرورك، كما أن ما يستطيع خادم التنسيق فعلياً فعله إذا تعرّض للاختراق أضيق مما يفترضه معظم الناس قبل قراءة ذلك.
يقع NetBird بين تقنيتين قد تكون على دراية بإحداهما. فهو overlay شبكي، لذلك تتصل الأقران بعضها ببعض بدلاً من إرسال كل شيء عبر بوابة واحدة. كما يمكن استضافته ذاتياً من البداية إلى النهاية، وهذا يضعه في مقابل خادم التحكم Headscale المستضاف ذاتياً لـTailscale. إذا لم تشغّل من قبل سوى نفق ببوابة واحدة، فاقرأ أولاً الفرق بين WireGuard العادي وmesh overlay، لأن هذا النموذج الذهني هو ما يجعل بقية هذه الصفحة مفيدة.
إذا كان ما تريده فعلياً هو خادم واحد تخرج منه كل حركة مرورك، فإن mesh يضيف مكونات أكثر مما يتطلبه هذا الهدف. يحقق نفق WireGuard عادي على VPS واحد أو عقدة خروج Tailscale ذلك بجهد تشغيل أقل بكثير. وإذا كان الهدف هو الوصول إلى شبكة خاصة واحدة بدلاً من ربط الأجهزة بعضها ببعض، فإن موجّه شبكة فرعية لـTailscale على VPS يعلن عن ذلك النطاق إلى tailnet لديك مسبقاً، من دون الحاجة إلى أي مكوّن من المكونات الواردة أدناه.
ما الذي يشغّله هذا المكدس فعلياً
تغيّر التخطيط مؤخراً، ومعظم الشروحات الأقدم تصف التخطيط السابق. بعد التحقق في October 2026 من الإصدار v0.80.0 ومن الإصدار v0.76.2 الذي يثبّته هذا الدليل، تبيّن أن quickstart script ينشئ ملف Compose يحتوي افتراضياً على ثلاث خدمات.
netbird-serverيشغّل management API، وخدمة الإشارات، وrelay مع STUN listener مضمّن، وموفّر هوية مضمّناً. في الإصدارات الأقدم، كانت هذه المكوّنات حاويات منفصلة، وكان موفّر الهوية عبارة عن تثبيت Zitadel منفصل يتعيّن عليك إنشاؤه أولاً.dashboardهو admin web console.traefikينهي TLS (أمان طبقة النقل)، ويطلب شهادة من Let's Encrypt عند أول تشغيل.
توجد خدمتان إضافيتان، لكنهما تظلان متوقفتين ما لم تجب بنعم على مطالبة. تنشر خدمة NetBird Proxy الخدمات الداخلية على أسماء مضيفين عامة. وتصفّي CrowdSec حركة المرور المسيئة. لا تحتاج إلى أي منهما لإنشاء mesh يعمل، كما تستهلك كلتاهما الذاكرة على خادم صغير.
إذا كنت تنتقل من wg-easy في حاوية Docker واحدة، فستجد أن عدد المكوّنات ازداد. ما تحصل عليه مقابل ذلك هو access policies وحسابات لكل مستخدم، إضافة إلى peers تتصل مباشرة ببعضها بدلاً من المرور عبر gateway واحد.
ما تحتاج إليه قبل البدء
اسم نطاق عام ليس اختيارياً. تعمل لوحة المعلومات وواجهة API وrelay كلها عبر HTTPS على المنفذ 443، ويحصل Traefik على شهادته من Let's Encrypt باستخدام تحدي TLS-ALPN-01، الذي تتم الإجابة عنه على المنفذ 443. لذلك تحتاج إلى اسم يُحلّ إلى عنوان VPS هذا من الإنترنت العام. لن يعمل عنوان IP مجرد في هذا الإعداد.
أنشئ سجل A واحداً، netbird.example.com، يشير إلى عنوان IPv4 العام لخادم VPS، وانتظر حتى ينتشر قبل تشغيل أي شيء.
dig +short netbird.example.comيجب أن يطبع ذلك عنوان خادمك. إذا شغّلت أداة التثبيت قبل انتشار DNS، يفشل طلب الشهادة عند التشغيل الأول. كما تؤدي عمليات التحقق الفاشلة المتكررة إلى بلوغ حدود المعدل في Let's Encrypt، وعندها سيتعين عليك انتظار تجدد الحد قبل المحاولة مرة أخرى.
يجب أن تكون 3 منافذ قابلة للوصول من الإنترنت: TCP 80 لإعادة التوجيه إلى HTTPS، وTCP 443 للوحة المعلومات وواجهة API وحركة signal وrelay وتحدي الشهادة، وUDP 3478 لـ STUN.
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 3478/udp
sudo ufw reload
sudo ufw statusافتح هذه المنافذ أيضاً في جدار الشبكة الناري لدى مزود الخدمة. هذا عنصر تحكم منفصل في معظم لوحات VPS، وهو سبب استمرار رفض الاتصالات رغم أن ufw status الخاص بالخادم يبدو صحيحاً.
STUN، أي session traversal utilities for NAT، هو الآلية التي يتعلم بها أحد النظراء العنوان العام والمنفذ اللذين خصصهما NAT الخاص به، حتى يتمكن النظيران من محاولة إنشاء نفق مباشر. إذا حظرت UDP 3478، فسيستمر اتصال النظراء عبر relay على TCP 443، ولذلك قد لا يبدو أن هناك عطلاً. لكنك تحصل على Connection type: Relayed لدى كل نظير، وتمر جميع حركة الشبكة عبر VPS بدلاً من انتقالها مباشرة بين النظراء.
من ناحية البرامج، تحتاج إلى Docker مع الإضافة Compose v2، بالإضافة إلى jq وcurl. يتحقق البرنامج النصي من Docker وCompose وjq، ويتوقف إذا كان أحدها مفقوداً. ويستخدم curl من دون التحقق من وجوده، لذلك ثبّته أولاً. إذا كان Docker حديث التثبيت على هذا الخادم، فابدأ بقراءة تشغيل Docker Compose على VPS.
المنافذ عند تخطي reverse proxy المضمّن
من دون Traefik، يظل الخادم الموحّد ينقل الإدارة وsignal وrelay عبر واجهة HTTP خلفية واحدة، لذلك تكاد قائمة المنافذ لا تتوسع. ينشر ملف Compose المُنشأ ما يلي:
- TCP 8080، لوحة المعلومات، مرتبط بـ 127.0.0.1
- TCP 8081،
netbird-server، مرتبط بـ 127.0.0.1 - UDP 3478، STUN، منشور مباشرة
ينهي proxy الخاص بك TLS على TCP 443، ثم يوجّه الطلبات إلى هذين المنفذين المحليين. لا يمر STUN عبر proxy، لذلك يظل UDP 3478 مفتوحاً في الجدار الناري في كلتا الحالتين. أما الأدلة التي تذكر منافذ منفصلة لـ management gRPC وsignal gRPC وrelay، فتصف التصميم الأقدم متعدد الحاويات.
اختر هذا الخيار فقط عندما ينهي الخادم TLS لخدمة أخرى مسبقاً. وإلا فإن Traefik المضمّن يحتاج إلى قواعد أقل ويؤدي إلى أخطاء أقل.
تثبيت خادم NetBird باستخدام quickstart script
يضع السطر الواحد الموثّق أحدث إصدار مباشرةً في shell:
curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh | bashثبّت الإصدار بدلاً من ذلك. يتغير latest، لذلك ينتج عن تنفيذ الأمر نفسه بعد أسبوعين تثبيتان مختلفتان، ولا يسجّل أي ملف على القرص أي إصدار كتب إعداداتك. نزّل إصداراً موسوماً، واقرأه، ثم شغّله.
mkdir -p ~/netbird
cd ~/netbird
curl -fsSL -o getting-started.sh \
https://github.com/netbirdio/netbird/releases/download/v0.76.2/getting-started.sh
less getting-started.sh
bash getting-started.shيسألك script عن النطاق أولاً:
Enter the domain you want to use for NetBird (e.g. netbird.my-domain.com):ثم يسألك عن طريقة التعامل مع TLS:
Which reverse proxy will you use?
[0] Traefik (recommended - automatic TLS, included in Docker Compose)
[1] Existing Traefik (labels for external Traefik instance)
[2] Nginx (generates config template)
[3] Nginx Proxy Manager (generates config + instructions)
[4] External Caddy (generates Caddyfile snippet)
[5] Other/Manual (displays setup documentation)
Enter choice [0-5] (default: 0):اختر [0]. تكتب الخيارات من 2 إلى 4 مقتطف إعداد وتترك الربط لك، بينما يكتب الخيار 5 ملف Compose فقط ويعرض وثائق الإعداد في الطرفية. هذا مناسب لخادم يشغّل proxy مسبقاً، وغير مناسب لخادم جديد. يسألك الخيار 0 بعد ذلك عن عنوان بريد إلكتروني، ويسجّله Traefik في حسابك لدى Let's Encrypt. ما زال prompt يصفه بأنه عنوان لإشعارات الشهادة، لكن Let's Encrypt أوقفت إرسال رسائل انتهاء الصلاحية في June 4, 2025، لذلك تظهر مشكلات التجديد في سجل Traefik بدلاً من صندوق الوارد.
اختر عدم تثبيت خدمة NetBird Proxy عند التثبيت الأول. فهي تحتاج إلى سجل DNS إضافي، وهو wildcard *.netbird.example.com من نوع CNAME يشير إلى netbird.example.com، ولا تضيف شيئاً إلى mesh عادي. لا يظهر prompt الخاص بـCrowdSec إلا بعد تمكين proxy، لذلك يؤدي رفض proxy إلى تخطيه أيضاً. يمكنك إضافة كليهما لاحقاً.
يكتب script الملفات في الدليل الحالي: docker-compose.yml وconfig.yaml بالوضع 600 وdashboard.env. ومع Traefik المضمّن، يضيف traefik-dynamic.yaml وproxy.env فقط عند تمكين NetBird Proxy. تعامل مع هذا الدليل على أنه state يجب الاحتفاظ به، لأن config.yaml يحتوي على المفتاح الذي يشفّر البيانات في store. لا يمكن لإعادة التثبيت إصلاح فقدانه.
docker compose ps
docker compose logs -f netbird-serverيجب أن تقرأ كل خدمة running، ويجب أن يستقر سجل الخادم بدلاً من إعادة التشغيل في حلقة. راقب الشهادة بشكل منفصل:
docker compose logs traefik | grep -i acmeإن ACME (automatic certificate management environment) هو البروتوكول الذي يستخدمه Traefik للحصول على الشهادة. تكون الأخطاء هنا دائماً تقريباً بسبب DNS أو إغلاق المنفذ 443.
إنشاء حساب المسؤول الأول
افتح https://netbird.example.com. في التثبيت الجديد، ستظهر صفحة إعداد بدلاً من نموذج تسجيل الدخول. أدخل عنوان بريد إلكتروني واسماً وكلمة مرور، ثم انقر على Create Account. سيصبح هذا الحساب حساب المسؤول الأول، وستعيد الصفحة توجيهك إلى نموذج تسجيل الدخول.
يُخزَّن هذا الحساب في مخزن المستخدمين الخاص بـNetBird، ويشغّله موفّر هوية مضمّن في الحاوية netbird-server. لا توجد أي مكوّنات خارجية. وهذا هو أكبر تغيير مقارنةً بإصدار NetBird المستضاف ذاتياً قبل عام، إذ كان التثبيت العامل يتطلب أولاً إعداد Zitadel أو Keycloak، ثم نسخ أربع قيم OIDC (OpenID Connect) إلى setup.env قبل أن يبدأ أي شيء على الإطلاق.
إذا ظهر تحذير بشأن شهادة المتصفح بدلاً من صفحة الإعداد، فهذا يعني أن الشهادة لم تُصدر. أصلح ذلك قبل المتابعة، لأن لوحة المعلومات تتصل بواجهة API باستخدام اسم المضيف نفسه، وتفشل بطرق مربكة عند وجود شهادة غير صالحة.
أضف أول نظير
ثبّت العميل على أي جهاز Linux، بما في ذلك VPS نفسه إذا أردت إضافته إلى الشبكة:
curl -fsSL https://pkgs.netbird.io/install.sh | shفي Debian وUbuntu، يضبط ذلك البرنامج النصي مستودع حزم NetBird، ثم يثبّت العميل عبر apt. لذلك يتولى مدير الحزم إدارة العميل في كلتا الحالتين. إذا كنت لا تفضّل تمرير برنامج نصي إلى shell، فاحفظه أولاً باستخدام curl -fsSL -o install.sh https://pkgs.netbird.io/install.sh واقرأه قبل تشغيل sh install.sh. في كلتا الحالتين، تحقّق مما تم تثبيته:
apt-cache policy netbirdnetbird هو عميل سطر الأوامر والـdaemon. أما netbird-ui فهو تطبيق سطح المكتب في منطقة الإعلام، ولا فائدة منه على خادم headless.
وجّه العميل الآن إلى خادمك:
sudo netbird up --management-url https://netbird.example.comاحذف --management-url، وسيسجّل العميل نفسه لدى الخدمة المستضافة من NetBird، لأن هذا هو الإعداد الافتراضي المضمّن في البرنامج. سينجح الأمر، وسيحصل الجهاز على عنوان، لكن لوحة التحكم المستضافة ذاتياً ستظل فارغة. يقع الجميع تقريباً في هذا الخطأ مرة واحدة.
يطبع الأمر URL تفتحه في المتصفح لإكمال تسجيل الدخول. بعد ذلك:
netbird status
ip addr show wt0اقرأ أربعة أسطر من netbird status: Management: Connected، وSignal: Connected، وسطر Relays: يعرض كل relay متاح، وNetBird IP: ضمن نطاق overlay. يمثّل wt0 واجهة WireGuard التي ينشئها NetBird، وينبغي أن تحمل العنوان نفسه.
ضمّ جهازاً ثانياً دون تدخل باستخدام مفتاح إعداد
لا يعمل تسجيل الدخول عبر المتصفح على جهاز لا يحتوي على متصفح ولا يوجد أحد أمامه. مفتاح الإعداد هو رمز مميّز للمصادقة المسبقة، ويسجّل الجهاز دون الخطوة التفاعلية. أنشئه من لوحة المعلومات ضمن Setup Keys.
يوجد نوعان من المفاتيح. يصادق المفتاح أحادي الاستخدام على جهاز واحد فقط، ثم يُستهلك. ويسجّل المفتاح القابل لإعادة الاستخدام عدة أجهزة، مع إمكانية تحديد حد أقصى لعددها. يتطلب كلا النوعين تاريخ انتهاء، ويمكن لكليهما إسناد النظير الجديد تلقائياً إلى مجموعة، فتُطبَّق قواعد الوصول الخاصة بهذه المجموعة فور ظهور الجهاز.
sudo netbird up --setup-key <SETUP-KEY> \
--management-url https://netbird.example.com \
--hostname build-runner-01يحدد --hostname الاسم الظاهر في لوحة المعلومات. بدونه، يستخدم النظير الاسم الذي يعرّف به الجهاز نفسه، ولا يفيد أحداً أن تظهر مجموعة من الإدخالات كلها باسم ubuntu.
بالنسبة إلى الحاويات ووكلاء البناء قصيرة العمر، حدّد المفتاح على أنه ephemeral عند إنشائه. تُزال النظائر المسجّلة باستخدام مفتاح ephemeral تلقائياً بعد بقائها غير متصلة لأكثر من 10 دقائق، مما يمنع الإدخالات المتوقفة من البقاء في قائمة النظائر.
هناك حد يجب فهمه قبل التخطيط باستخدام مفاتيح الإعداد: يؤدي انتهاء صلاحية المفتاح أو إبطاله إلى إيقاف التسجيلات الجديدة، لكنه لا يفصل الأجهزة التي سبق أن سجّلت باستخدامه. ولإزالة وصول جهاز، أزل ذلك النظير.
هل ما زلت بحاجة إلى موفّر هوية منفصل؟
بالنسبة إلى تثبيت صغير، لا. يتولى مخزن المستخدمين المدمج إدارة الحسابات التي تُنشأ من لوحة التحكم، وهذا يكفي لعدد قليل من المستخدمين.
تحتاج إلى موفّر هوية خارجي إذا كنت تستخدم واحداً بالفعل ولا تريد قائمة مستخدمين ثانية. يقبل NetBird أي موفّر يدعم OIDC. سجّل عميلاً سرياً لـ OIDC لدى موفّر الهوية، ثم أضفه في لوحة تحكم NetBird باستخدام أربع قيم: الاسم، ومعرّف العميل، وسر العميل، وموفّر الإصدار. يمنحك NetBird عنوان URL لإعادة التوجيه، وعليك لصقه مرة أخرى في إعدادات موفّر الهوية. تتوفر تكاملات مخصصة مع Google وMicrosoft Entra ID وOkta وZitadel وKeycloak وAuthentik وPocket ID، بينما تُضاف أي خدمة أخرى بوصفها OIDC عاماً. إذا كنت تشغّل Authentik لتوفير تسجيل دخول موحّد مستضاف ذاتياً بالفعل، فهذا هو المسار الذي يحافظ على قائمة حسابات واحدة بدلاً من قائمتين.
يبقى تسجيل الدخول المحلي متاحاً بعد إضافة موفّر هوية، ويظهر كل موفّر مُعدّ في صفحة تسجيل الدخول. احتفظ بحساب local admin واحد مزود بكلمة مرور قوية. عندئذ يظل بإمكانك تسجيل الدخول إذا كان إعداد OIDC معطلاً.
NetBird أم Headscale: أي control plane ينبغي أن تشغّل؟
كلاهما يلغي الاعتماد نفسه: خادم التحكم المستضاف الذي كانت عملاؤك ستتصل به تلقائياً. لكن بنية المشروعين مختلفة.
يعيد Headscale تنفيذ خادم التحكم الخاص بـTailscale، وتستمر في استخدام عملاء Tailscale الرسميين. لا توجد وحدة تحكم ويب رسمية. تدير المستخدمين ومفاتيح المصادقة المسبقة باستخدام الأمر headscale مع ملف إعداد. توجد واجهات ويب أنشأها المجتمع، لكنها ليست جزءاً من المشروع. يناسب ذلك من يريد حفظ حالته في ملفات وإدارة تغييراته عبر version control.
يوفّر NetBird المنتج كاملاً: عميلاً خاصاً به، ولوحة تحكم خاصة به، وموفّر هوية مضمّناً، وسياسات وصول تعدّلها من المتصفح. هذا يعني مكوّنات أكثر على VPS، لكنه يتطلب جهداً أقل بكثير لتسليمه إلى زميل لن يفتح terminal أبداً.
شغّل Headscale إذا كنت تستخدم عملاء Tailscale بالفعل أو تريد أصغر control plane ممكن. شغّل NetBird إذا كان عدة أشخاص يحتاجون إلى إدارة الأقران وتريد console وSSO دون تجميعهما بنفسك. قبل الالتزام بأي منهما، راجع ما الذي تغطيه فعلياً الخطة المجانية في Tailscale، لأن مجموعة غير تجارية تضم ما يصل إلى ستة مستخدمين لا تدفع شيئاً مقابل control plane مستضاف، مع أجهزة مستخدمين غير محدودة و50 مورداً موسوماً في البداية، وقد لا يكون لديها سبب لتشغيل واحد أصلاً. بعد تجاوز هذا الحد، تزداد الفاتورة وفق عدد الأشخاص لا عدد الأجهزة، لذلك فإن حساب المبلغ الذي سيفرضه Tailscale على مجموعتك يزوّدك برقم تقارنه بتكلفة VPS والساعات التي تتطلبها منك هذه المنظومة.
ما أقل حجم VPS يمكنه تشغيل هذا؟
الحد الأدنى الموثق هو 1 CPU و2 GB من الذاكرة. تشير ملاحظات NetBird نفسها إلى أن الحد الأدنى الحالي يقترب من 1 GB من RAM بعد أن أصبحت إدارة المستخدمين محلية، مقارنةً بـ2 GB إلى 4 GB التي كان يحتاج إليها التصميم الأقدم عندما كان نشر Zitadel كاملاً جزءاً من المكدس. اشترِ 2 GB. تتيح السعة الإضافية للتحديث سحب صور جديدة بينما لا تزال الصور القديمة على القرص.
يمكنك ترك ثلاثة مكونات بأمان على خادم صغير. ارفض خدمة NetBird Proxy، فهي مخصصة لنشر الخدمات الداخلية على أسماء مضيفين عامة ولا علاقة لها باتصال الأقران. تخطَّ CrowdSec، فالبرنامج النصي يعرضه فقط مع الـproxy، ومن الأفضل إضافته لاحقاً إلى خادم مكشوف بدلاً من إضافته منذ اليوم الأول. أبقِ مخزن SQLite الافتراضي في وحدة التخزين netbird_data، وانتقل إلى PostgreSQL فقط عندما تقسّم النشر بين عدة أجهزة أو تواجه تزامناً فعلياً؛ توثّق NetBird هذا الانتقال كعملية ترحيل يمكنك تنفيذها لاحقاً.
الـrelay هو المكوّن الوحيد الذي لا يمكنك حذفه. إذا عيّنت NAT لدى أقران اثنين منفذاً مختلفاً لكل وجهة، فلن يتمكنا أبداً من إنشاء نفق مباشر، ولذلك يكون الـrelay المسار الوحيد الذي يتيح لهما العمل. يؤدي تعطيله إلى توفير قدر ضئيل جداً من الذاكرة، ويعطّل الاتصالات بطريقة يصعب تتبعها.
عندما لا يعود خادم واحد كافياً، انقل الـrelays أولاً. يعمل relay مستقل باستخدام NB_LISTEN_ADDRESS وNB_EXPOSED_ADDRESS وNB_AUTH_SECRET وNB_ENABLE_STUN. يجب أن يكون السر المشترك متطابقاً على الـrelay والخادم الرئيسي، وإلا يفشل العملاء في المصادقة عليه.
أوضاع الفشل وما ستراه
تعرض لوحة المعلومات تحذيراً بشأن الشهادة. لم يحصل Traefik على شهادة. شغّل docker compose logs traefik | grep -i acme. يوجد سببان محتملان. إما أن dig +short netbird.example.com لا يعيد عنوان VPS هذا بعد، أو أن TCP 443 مغلق في مكان ما بين Let's Encrypt والحاوية، وغالباً يكون ذلك في جدار حماية الشبكة لدى موفر الخدمة، وليس على ufw. تُجاب عن التحديات عبر 443، لذلك لا يفيد فتح المنفذ 80 هنا. أصلح السبب قبل إعادة المحاولة في حلقة، لأن Let's Encrypt يسمح بخمس عمليات تحقق فاشلة فقط لكل اسم مضيف في الساعة، وستُمنع من إعادة المحاولة حتى يُعاد ضبط هذا الحد.
يقول العميل إنه اتصل، لكن لوحة المعلومات فارغة. سجّل العميل دخوله إلى خدمة NetBird المستضافة، لأن --management-url كان مفقوداً. شغّل netbird status --detail واقرأ السطر Management:، الذي يحدد الخادم الذي يتصل به فعلياً. إذا ظهر Management: Connected to https://api.netbird.io:443، فهذا يعني أنه اتصل بالخدمة السحابية. شغّل sudo netbird down، ثم sudo netbird up --management-url https://netbird.example.com مرة أخرى.
تظهر الحالة Connection type: Relayed لكل نظير. لا تتشكل أنفاق مباشرة، لذلك تعبر كل حركة الشبكة خادم VPS وتضيف قفزة من زمن الاستجابة. تحقق من UDP 3478 في جدار حماية VPS وفي جدار حماية موفر الخدمة، لأن STUN يتيح للنظير معرفة عنوانه العام ومنفذه. يطبع netbird status --detail أيضاً Direct: false وأنواع مرشحي ICE (إنشاء الاتصال التفاعلي) لكل نظير، ما يوضح مدى تقدم المحاولة. في بعض الشبكات، يكون relayed هو النتيجة الوحيدة المتاحة، ولا يعني ذلك وجود مشكلة.
ينضم أحد النظراء، لكنه لا يستطيع الوصول إلى أي شيء. لا يعني وجود النظير في الشبكة المتداخلة أن نظيرين يمكنهما التحدث. تحدد سياسات الوصول ذلك، كما أن المجموعة التي لا ترتبط بها أي سياسة لا تصل إلى أي شيء. تحقق من السياسة في لوحة المعلومات قبل بدء تصحيح أخطاء المسارات وجدران الحماية.
يبلغ netbird status عن مشكلة في daemon. الخدمة لا تعمل. استخدم sudo netbird service status وsudo netbird service start. توجد سجلات العميل في /var/log/netbird/client.log. بالنسبة إلى أي مشكلة لا تستطيع تحديدها، يجمع netbird debug bundle --anonymize --system-info السجلات والحالة والمسارات وإعدادات DNS وحالة جدار الحماية في أرشيف واحد.
النسخ الاحتياطي والترقيات
يعتمد التثبيت بالكامل على أمرين: الدليل الذي يحتوي على docker-compose.yml وconfig.yaml، وDocker volume الذي يحتوي على قاعدة البيانات ومفاتيح التشفير. انسخهما احتياطياً معاً. يحتوي config.yaml على المفتاح الذي يشفّر البيانات في مخزن البيانات، لذلك لن تؤدي استعادة نسخة من قاعدة البيانات من دونه إلى بيانات قابلة للقراءة.
docker volume ls
docker compose down
sudo tar czf netbird-config.tgz -C ~ netbird
docker run --rm -v netbird_netbird_data:/data -v "$PWD":/backup \
alpine tar czf /backup/netbird-data.tgz -C /data .
docker compose up -dيضيف Compose اسم دليل المشروع إلى أسماء وحدات التخزين، لذلك يظهر volume الموثّق باسم netbird_data عادةً باسم netbird_netbird_data. شغّل docker volume ls أولاً، واستخدم الاسم الذي يطبعه، وإلا فسيفشل الأمر docker run أعلاه بصمت، إذ سينشئ volume فارغاً ويؤرشف أي شيء. احتفظ بالأرشيفات خارج VPS. إذا كانت لديك أداة نسخ احتياطي مسبقاً، فإن restic أو BorgBackup تتولى الجزء الخاص بالنسخ إلى موقع خارجي.
ترقية الخادم هي عملية سحب ثم إعادة إنشاء:
docker compose pull
docker compose up -d
docker compose psقبل الاعتماد على ذلك، شغّل docker compose config | grep image:. يجب تثبيت أي وسم يقرأ latest على إصدار محدد، للسبب نفسه الذي دفعك إلى تثبيت إصدار محدد من سكربت التثبيت: يجب أن تعرف ما الذي يعمل، وأن يتوفر لديك إصدار تعود إليه إذا سببت الترقية مشكلة. تتم ترقية العملاء باستخدام مدير الحزم الذي ثبّتهم.
FAQ
هل أحتاج إلى موفّر هوية خاص بي لاستضافة NetBird ذاتياً؟
لا. تتضمن الإصدارات الحالية مخزناً مدمجاً للمستخدمين، لذا تنشئ حساب المسؤول الأول في المتصفح على https://netbird.example.com، ثم تضيف المستخدمين من لوحة التحكم. موفّر OIDC خارجي اختياري، ويمكنك إضافته لاحقاً باستخدام أربع قيم: الاسم، ومعرّف العميل، وسر العميل، وissuer. تصف الأدلة التي تطلب منك نشر Zitadel أو Keycloak قبل NetBird إعداداً لم يعد مطلوباً. كما أن اتباعها يضيف خدمة كاملة أخرى إلى ما يجب عليك تشغيله.
لماذا تظهر الحالة Connection type: Relayed لجميع أقراني؟
لم تتشكل اتصالات مباشرة، لذلك تمر حركة الشبكة عبر relay على VPS لديك. السبب المعتاد هو حظر UDP 3478، وهو منفذ STUN الذي يستخدمه الأقران لاكتشاف عنوانهم العام ومنفذهم. افتحه في جدار VPS الناري وفي جدار الشبكة الناري المنفصل لدى موفّر الخدمة، ثم شغّل netbird status --detail مرة أخرى واقرأ السطر Direct:. إذا كانت الشبكة التي تستخدمها NAT يعيّن منفذاً مختلفاً لكل وجهة، فلن تكون هناك نتيجة ممكنة سوى relayed، ولا يكون هناك خطأ في الإعداد.
اتصل العميل، لكن لوحة التحكم لا تعرض أي أقران. ماذا حدث؟
سجّل العميل نفسه لدى الخدمة المستضافة الخاصة بـNetBird بدلاً من خادمك، ويحدث ذلك عندما تُترك --management-url من دون تحديد. يعرض netbird status --detail الخادم الذي يتصل به العميل في السطر Management:، لذلك تؤكد قيمة مثل https://api.netbird.io:443 حدوث ذلك. شغّل sudo netbird down، ثم sudo netbird up --management-url https://netbird.example.com، وسيظهر القرين في لوحة التحكم.
ما الفرق بين NetBird المستضاف ذاتياً وHeadscale؟
يستبدل كلاهما خادم تحكم مستضافاً بخادم تشغّله أنت. Headscale هو control plane فقط: تديره باستخدام الأمر headscale وملف إعداد، ولا توجد له وحدة تحكم ويب رسمية، كما أنه يقود عملاء Tailscale الرسميين. يأتي NetBird مع عميله الخاص، ولوحة تحكم للمسؤول، وتكامل مع موفّر الهوية ضمن الحزمة نفسها. تشغيل Headscale أبسط، ويحفظ حالته في ملفات. أما NetBird فمن الأسهل تقديمه إلى أشخاص لن يستخدموا الطرفية.
ما حجم VPS المطلوب لخادم NetBird مستضاف ذاتياً؟
الحد الأدنى الموثّق هو 1 CPU و2 GB من الذاكرة، و2 GB هو الحجم الذي ينبغي شراؤه. انخفض الحد العملي إلى نحو 1 GB في الإصدارات الأخيرة، لأن موفّر الهوية أصبح مضمّناً بدلاً من كونه عملية نشر منفصلة. ارفض خدمة proxy الاختيارية أثناء التثبيت، فهذا يتخطى أيضاً مطالبة CrowdSec، واستخدم مخزن SQLite الافتراضي إلى أن تحتاج فعلاً إلى PostgreSQL.