المشكلة: كشف خدمة خلف NAT
تضع معظم اتصالات المنازل والشركات أجهزتك خلف NAT: لا يمكن الوصول إلى أي منفذ وارد من الخارج دون إعداد صريح على جهاز التوجيه. وحتى عندما يكون هذا الإعداد ممكناً، فإنه يفتح مساراً مباشراً لشبكتك المحلية.
السيناريوهات الواقعية كثيرة: NAS يشغّل Nextcloud تريد مشاركته مع العملاء، أو homelab على Proxmox يستضيف عشرات الخدمات، أو Raspberry Pi يدير أتمتة المنزل، أو VM تطوير محلية تريد اختبارها من الخارج. في كل هذه الحالات، الحل المعتاد — port forwarding — يعاني من مشكلتين: يعتمد على جهاز التوجيه، ويفتح مساراً مباشراً لشبكتك الخاصة.
للبدائل الشائعة قيودها الخاصة: Cloudflare Tunnel يمرر كل حركة بياناتك عبر خوادم Cloudflare مما يطرح تساؤلات حول الخصوصية. Tailscale/Headscale ينشئ شبكة mesh بين أجهزتك، وهو ممتاز للوصول نقطة لنقطة، لكنه ليس مصمماً لكشف خدمة HTTP(S) علناً بنطاق فرعي مخصص. Pangolin يشغل مساحة مختلفة: relay لـWireGuard مستضاف ذاتياً، مع إدارة الشهادات والنطاقات الفرعية، تتحكم فيه بالكامل من VPS الخاص بك.
ما يقدمه Pangolin مقارنة بالبدائل
- استضافة ذاتية كاملة — حركة بياناتك تمر فقط عبر VPS الخاص بك، لا يرى أي طرف ثالث حركة تطبيقاتك.
- لا منافذ واردة مطلوبة — الاتصال يُبادر من الجهاز المصدر نحو VPS (اتجاه صادر)، لا يُشكّل NAT أي عائق.
- HTTPS تلقائي عبر Let's Encrypt — يدير Pangolin الشهادات لكل نطاق فرعي مكشوف دون تدخل يدوي.
- واجهة ويب مدمجة — أضف أنفاقاً وأدر الموارد والمستخدمين من لوحة ويب دون تعديل ملفات الإعداد.
- تشفير WireGuard من طرف إلى طرف — النفق بين الجهاز المصدر وVPS مشفّر على مستوى النقل، بصرف النظر عن HTTPS التطبيقي.
- متعدد المواقع — يمكن لنسخة Pangolin واحدة على VPS توجيه عشرات الخدمات من أجهزة مختلفة تحت نطاقات فرعية مستقلة.
البنية المعمارية: VPS relay وGerbil وNewt
يعتمد Pangolin على ثلاثة مكونات تتوزع الأدوار بينها:
[الجهاز المصدر] [VPS ServOrbit] [الإنترنت]
service:8080 Pangolin (التنسيق)
newt (عميل) ←─WireGuard UDP─→ Gerbil (نفق WG) ←─HTTPS──→ زائر
Traefik (reverse proxy)Pangolin هو مستوى التحكم: يدير الأنفاق والنطاقات الفرعية والشهادات والمستخدمين عبر REST API وواجهة ويب. يعمل على VPS.
Gerbil هو نظير WireGuard من جهة الخادم. يفتح منفذ UDP، ينشئ الأنفاق مع العملاء، ويوجّه الحركة الواردة نحو الخدمات المكشوفة. يعمل أيضاً على VPS بجانب Pangolin.
Newt هو العميل الخفيف الذي يعمل على الجهاز المصدر (NAS أو Pi أو VM محلية). يتصل بـGerbil على منفذ UDP لـWireGuard، يحافظ على النفق نشطاً، ويعيد توجيه الحركة الواردة نحو الخدمة المحلية على المنفذ المُعدّ.
التدفق الفعلي: يصل زائر إلى nextcloud.yourdomain.com ← يستقبل Traefik (يديره Pangolin) الطلب عبر HTTPS ← يمرره عبر Gerbil من خلال نفق WireGuard النشط ← يستلمه Newt ويعيد توجيهه نحو localhost:8080 على الجهاز المصدر. تستجيب الخدمة عبر نفس المسار في الاتجاه العكسي.
المتطلبات
على جهة VPS:
- VPS بصلاحية root وIPv4 مخصصة — خطة {{vps.start.name}} كافية للبدء (1 vCPU، 1 غيغابايت RAM للأحمال الخفيفة، 2 غيغابايت موصى به لأنفاق متعددة).
- Ubuntu 22.04 أو 24.04 (يعمل أيضاً Debian 12).
- منفذ UDP متاح لـWireGuard (افتراضياً 51820، قابل للتغيير).
- اسم نطاق مع إمكانية الوصول لإدارة DNS — ستحتاج لإنشاء سجل A wildcard *.yourdomain.com يشير إلى IP الـ VPS.
- تثبيت Docker وDocker Compose (apt install docker.io docker-compose-plugin).
على جهة الجهاز المصدر:
- جهاز Linux (Raspberry Pi أو NAS يشغّل DSM 7+، VM على Proxmox، خادم فعلي) مع وصول UDP صادر إلى منفذ WireGuard على VPS — تسمح به معظم مزودي الإنترنت.
- خدمة تستمع على منفذ محلي (Nextcloud أو Gitea أو Home Assistant إلخ).
الإصدار الحالي: Pangolin 1.23.0 (صدر في 16 سبتمبر 2026).
نشر Pangolin وGerbil على VPS
تحضير VPS وفتح منفذ WireGuard
اتصل بـ VPS كـ root وثبّت Docker إن لم يكن مثبتاً:
apt update && apt install -y docker.io docker-compose-plugin ufwافتح منفذ UDP لـ WireGuard (51820 افتراضياً) وتأكد من إمكانية الوصول لمنافذ HTTP/HTTPS:
ufw allow 80/tcp ufw allow 443/tcp ufw allow 51820/udp ufw enableلتقييد الوصول للوحة الإدارة (المنفذ 3000 افتراضياً)، اقصره على IP الخاص بك:
ufw allow from YOUR_IP to any port 3000إنشاء ملف docker-compose.yml
أنشئ مجلد عمل وملف الإعداد:
mkdir -p /opt/pangolin && cd /opt/pangolinأنشئ
docker-compose.ymlبالمحتوى التالي:cat > docker-compose.yml <<'EOF' services: pangolin: image: fosrl/pangolin:1.23.0 container_name: pangolin restart: unless-stopped volumes: - ./config:/app/config - ./data:/app/data ports: - "3000:3000" networks: - pangolin_net gerbil: image: fosrl/gerbil:latest container_name: gerbil restart: unless-stopped cap_add: - NET_ADMIN volumes: - ./data:/var/lib/gerbil ports: - "51820:51820/udp" networks: - pangolin_net depends_on: - pangolin networks: pangolin_net: driver: bridge EOFعدّل رقم إصدار صورة
pangolinليطابق أحدث إصدار على GitHub.إعداد Pangolin وتشغيل الـ stack
أنشئ مجلد الإعداد وملف
config.ymlالأساسي:mkdir -p /opt/pangolin/config cat > /opt/pangolin/config/config.yml <<'EOF' app: base_domain: yourdomain.com admin_email: [email protected] port: 3000 wireguard: port: 51820 subnet: 10.0.0.0/24 acme: enabled: true staging: false EOFاستبدل
yourdomain.comبنطاقك الفعلي. شغّل الـ stack:cd /opt/pangolin && docker compose up -d docker compose logs -f pangolinيولّد Pangolin كلمة مرور مشرف عند أول تشغيل — دوّنها من السجلات. الواجهة متاحة على
http://VPS_IP:3000.إعداد سجل DNS wildcard
في منطقة DNS الخاصة بك، أنشئ سجل A wildcard يشير إلى IP الـ VPS:
*.yourdomain.com → A → VPS_IPعلى Cloudflare، أنشئ هذا السجل مع تعطيل الـ proxy (DNS-only، السحابة الرمادية) حتى تتمكن شهادات Let's Encrypt من الإصدار بشكل صحيح عبر تحدي HTTP-01 الذي يستخدمه Pangolin.
إنشاء وحدة systemd للتشغيل التلقائي
عادةً يكفي Docker مع
restart: unless-stopped، لكن إن فضّلت وحدة systemd مخصصة:cat > /etc/systemd/system/pangolin.service <<'EOF' [Unit] Description=Pangolin reverse tunnel stack After=docker.service Requires=docker.service [Service] Type=oneshot RemainAfterExit=yes WorkingDirectory=/opt/pangolin ExecStart=/usr/bin/docker compose up -d ExecStop=/usr/bin/docker compose down [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable pangolin
إضافة نفق باستخدام Newt على الجهاز المصدر
إنشاء نفق في واجهة Pangolin
سجّل دخولك لواجهة Pangolin على
http://VPS_IP:3000ببيانات المشرف. اذهب إلى Sites → Add site، أعطه اسماً (مثلاًhomelab) ودوّن site token المُولَّد. ثم في Resources → Add resource، اختر الموقع، أدخل النطاق الفرعي المطلوب (nextcloud.yourdomain.com) والمنفذ المحلي للجهاز المصدر (مثلاً8080).تثبيت Newt على الجهاز المصدر
على الجهاز الذي يستضيف خدمتك، نزّل ملف Newt التنفيذي المناسب لمعمارية جهازك:
# Linux x86_64 curl -Lo /usr/local/bin/newt \ https://github.com/fosrl/newt/releases/latest/download/newt-linux-amd64 chmod +x /usr/local/bin/newtلـ Raspberry Pi (ARM64):
curl -Lo /usr/local/bin/newt \ https://github.com/fosrl/newt/releases/latest/download/newt-linux-arm64 chmod +x /usr/local/bin/newtإعداد Newt وتشغيله
شغّل Newt بالـ site token المحصّل في الخطوة السابقة:
newt \ --server https://yourdomain.com:3000 \ --token YOUR_SITE_TOKEN \ --target localhost:8080للتشغيل التلقائي، أنشئ وحدة systemd:
cat > /etc/systemd/system/newt.service <<'EOF' [Unit] Description=Newt WireGuard tunnel client After=network.target [Service] ExecStart=/usr/local/bin/newt \ --server https://yourdomain.com:3000 \ --token YOUR_SITE_TOKEN \ --target localhost:8080 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now newtالتحقق من الاتصال الكامل
على VPS، تحقق من إنشاء نفق WireGuard:
docker exec gerbil wg showيجب أن ترى peer مع
latest handshakeحديث. من أي متصفح أو سطر أوامر:curl -I https://nextcloud.yourdomain.comالاستجابة المتوقعة:
HTTP/2 200(أو صفحة تسجيل دخول خدمتك). تُصدر شهادة Let's Encrypt تلقائياً عند أول وصول.
كشف خدمة: مثال Nextcloud خلف NAT
إعداد Nextcloud لقبول نطاق الـ proxy
تحجب Nextcloud الطلبات القادمة من نطاقات غير مُعلنة. أضف النطاق العام إلى
config.php:# من الجهاز المصدر، في مجلد Nextcloud nano config/config.phpأضف في مصفوفة
trusted_domains:'trusted_domains' => array ( 0 => 'localhost', 1 => 'nextcloud.yourdomain.com', ), 'overwritehost' => 'nextcloud.yourdomain.com', 'overwriteprotocol' => 'https',التحقق من الوصول العام والشهادة
انتظر 30 إلى 60 ثانية بعد أول وصول حتى تُصدر Let's Encrypt الشهادة، ثم:
curl -v https://nextcloud.yourdomain.com 2>&1 | grep -E 'subject|issuer|HTTP'الشهادة موقّعة من Let's Encrypt والرابط العام متاح الآن من أي شبكة، دون أي منافذ مفتوحة على جانب الشبكة المحلية.
الأمان: التوكنات والتدوير والتحكم في الوصول
تدوير site token — أنشئ توكناً جديداً من واجهة Pangolin وحدّث وحدة systemd الخاصة بـ Newt على الجهاز المصدر. يُبطَل التوكن القديم فوراً. جدوِل هذا التدوير كل 90 يوماً أو عند أي تغيير في الموظفين الذين يصلون للجهاز المصدر.
قائمة بيضاء لعناوين IP في Pangolin — لكل مورد مكشوف، يمكنك تحديد قائمة بيضاء من عناوين IP ضمن Resources → Access Policy. مفيد لتقييد الوصول للوحة الإدارة أو الأدوات الداخلية على نطاق IP مكتبك.
وصول موثّق — يدعم Pangolin موفري OIDC (Authentik وKeycloak وZitadel) لإضافة طبقة مصادقة أمام أي مورد مكشوف، دون تعديل التطبيق خلف النفق.
تقييد منفذ الإدارة — يجب ألا يكون المنفذ 3000 الخاص بـ Pangolin متاحاً علناً. قيّده على IP الخاص بك: ufw allow from YOUR_IP to any port 3000 && ufw deny 3000.
استكشاف الأخطاء
النفق لا يُنشأ — UDP محجوب من قِبَل مزود الإنترنت. بعض المزودين يصفّون UDP الصادر على المنافذ غير القياسية. اختبر من الجهاز المصدر: nc -u -v VPS_IP 51820. إن رُفض الاتصال، غيّر منفذ WireGuard في config.yml إلى 443 (UDP) أو 53 (UDP) — هذه المنافذ تمر في كل الحالات تقريباً. حدّث ufw على VPS وفقاً لذلك.
عدم تطابق MTU — زمن استجابة أو انقطاعات عشوائية. تضيف WireGuard overhead تغليف (نحو 60 بايت). إن كانت خدمتك تنقل ملفات كبيرة وتلاحظ انقطاعات، قلّل MTU لواجهة WireGuard في إعداد Gerbil: mtu = 1380 قيمة آمنة على معظم الروابط.
الخدمة غير متاحة رغم أن النفق نشط. تحقق أولاً من أن الخدمة المحلية تستمع على 0.0.0.0 لا فقط على 127.0.0.1: ss -tlnp | grep 8080. ثم تأكد أن المنفذ المُعدّ في Pangolin يتطابق مع منفذ الخدمة الفعلي. أخيراً، راجع سجلات Newt: journalctl -u newt -f.
شهادة Let's Encrypt لم تُصدر. يستخدم Pangolin تحدي HTTP-01 الذي يتطلب أن يكون المنفذ 80 على VPS متاحاً من الإنترنت. تحقق من أن ufw allow 80/tcp مُفعَّل ولا توجد خدمة أخرى تشغل المنفذ 80 (ss -tlnp | grep :80). على Cloudflare، تأكد أن السجل wildcard في وضع DNS-only (السحابة الرمادية).
واجهة Pangolin لا تستجيب بعد إعادة التشغيل. إن أعاد Docker التشغيل قبل توفر الشبكة، قد يبدأ Pangolin دون واجهة شبكية. أضف network-online.target لتبعية systemd، أو أعد تشغيل docker compose up -d من /opt/pangolin.
مقارنة: Pangolin مقابل Cloudflare Tunnel مقابل Tailscale/Headscale
مرّر الجدول أفقيًا
| المعيار | Pangolin + Gerbil | Cloudflare Tunnel | Tailscale / Headscale |
|---|---|---|---|
| الاستضافة | استضافة ذاتية على VPS الخاص بك | SaaS من Cloudflare | SaaS (Tailscale) أو استضافة ذاتية (Headscale) |
| التكلفة | تكلفة VPS فقط | مجاني حتى حدود معينة، ثم اشتراك | مجاني (استخدام شخصي)، اشتراك للفرق |
| تشفير كامل | WireGuard بين الجهاز وVPS، HTTPS للزائر | TLS حتى خوادم Cloudflare (يُفكّ التشفير أثناء العبور) | WireGuard بين جميع العقد (mesh كامل) |
| كشف HTTP عام | نعم، مع HTTPS تلقائي ونطاقات فرعية مخصصة | نعم، مع شهادات تديرها Cloudflare | غير مصمم لذلك أصلاً (يحتاج reverse proxy إضافي) |
| تعقيد الإدارة | متوسط — stack Docker للصيانة، وواجهة ويب | منخفض — connector ملف تنفيذي واحد، كل شيء يديره Cloudflare | منخفض (Tailscale) إلى متوسط (Headscale المستضاف ذاتياً) |
| خصوصية الحركة | الحركة مرئية فقط على VPS الخاص بك | الحركة تُفكّ شفرتها على خوادم Cloudflare | حركة mesh مشفرة، غير مركزية |
للمزيد
يُقدّم Pangolin 1.23.0 دعماً للتوافر العالي في الإصدار Enterprise وإدارة متعددة للمشرفين على الخادم — ميزات مفيدة بمجرد أن تنمو بنيتك التحتية لتتجاوز الاستخدام الشخصي.
لكشف خدمات غير HTTP (SSH خاص، قواعد بيانات، بروتوكولات UDP تطبيقية)، يدعم Pangolin الآن الموارد الخاصة TCP/UDP المتاحة عبر عميل Newt — دون كشفها علناً على URL، لكن مع إمكانية الوصول إليها من شبكة WireGuard الخاصة بك.
إن كانت حاجتك مختلفة — تنسيق الوصول بين عدة أجهزة دون كشف عام — فإن Headscale على VPS هو الأداة المناسبة. للكشف دون VPS وسيط باستخدام بنية Cloudflare التحتية، يبقى Cloudflare Tunnel الخيار الأبسط. ولوضع أسس تشفير الشبكة على VPS، يغطي دليل WireGuard على VPS تثبيت واجهة WireGuard الأصلية وإعدادها.