دليل عملي

Pangolin على VPS: كشف خدمة خلف NAT دون فتح أي منفذ

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

لديك خدمة تعمل على NAS أو Raspberry Pi أو VM محلية، وتريد الوصول إليها من الإنترنت — دون فتح منفذ على جهاز التوجيه، ودون IP ثابتة، ودون تسليم حركة بياناتك لطرف ثالث. ‏Pangolin مقرون بـ‏Gerbil يحل هذه المشكلة تحديداً: relay لـ‏WireGuard تشغّله بنفسك على VPS، مع ‏HTTPS تلقائي وواجهة ويب لإدارة كل شيء.

المحتويات· المشكلة: كشف خدمة خلف NAT1/11
  1. 01المشكلة: كشف خدمة خلف NAT
  2. 02ما يقدمه Pangolin مقارنة بالبدائل
  3. 03البنية المعمارية: VPS relay وGerbil وNewt
  4. 04المتطلبات
  5. 05نشر Pangolin وGerbil على VPS
  6. 06إضافة نفق باستخدام Newt على الجهاز المصدر
  7. 07كشف خدمة: مثال Nextcloud خلف NAT
  8. 08الأمان: التوكنات والتدوير والتحكم في الوصول
  9. 09استكشاف الأخطاء
  10. 10مقارنة: Pangolin مقابل Cloudflare Tunnel مقابل Tailscale/Headscale
  11. 11للمزيد

المشكلة: كشف خدمة خلف 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

  1. تحضير 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
  2. إنشاء ملف 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.

  3. إعداد 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.

  4. إعداد سجل DNS wildcard

    في منطقة DNS الخاصة بك، أنشئ سجل A wildcard يشير إلى IP الـ VPS:

    *.yourdomain.com  →  A  →  VPS_IP

    على Cloudflare، أنشئ هذا السجل مع تعطيل الـ proxy (‏DNS-only، السحابة الرمادية) حتى تتمكن شهادات Let's Encrypt من الإصدار بشكل صحيح عبر تحدي HTTP-01 الذي يستخدمه Pangolin.

  5. إنشاء وحدة 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 على الجهاز المصدر

  1. إنشاء نفق في واجهة Pangolin

    سجّل دخولك لواجهة Pangolin على http://VPS_IP:3000 ببيانات المشرف. اذهب إلى Sites → Add site، أعطه اسماً (مثلاً homelab) ودوّن site token المُولَّد. ثم في Resources → Add resource، اختر الموقع، أدخل النطاق الفرعي المطلوب (nextcloud.yourdomain.com) والمنفذ المحلي للجهاز المصدر (مثلاً 8080).

  2. تثبيت 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
  3. إعداد 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
  4. التحقق من الاتصال الكامل

    على VPS، تحقق من إنشاء نفق WireGuard:

    docker exec gerbil wg show

    يجب أن ترى peer مع latest handshake حديث. من أي متصفح أو سطر أوامر:

    curl -I https://nextcloud.yourdomain.com

    الاستجابة المتوقعة: HTTP/2 200 (أو صفحة تسجيل دخول خدمتك). تُصدر شهادة Let's Encrypt تلقائياً عند أول وصول.

كشف خدمة: مثال Nextcloud خلف NAT

  1. إعداد 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',
  2. التحقق من الوصول العام والشهادة

    انتظر 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 الأصلية وإعدادها.

VPS بصلاحية root وIPv4 مخصصة

‏Pangolin وGerbil بحاجة إلى منفذ UDP مفتوح وIPv4 مخصصة للاستماع لاتصالات WireGuard الواردة. تتوفر هذه المتطلبات في VPS ServOrbit مع حرية اختيار نظام التشغيل والوصول الكامل بصلاحية root.

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

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

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