ابنِ عنقود VPS خاصاً بشبكة WireGuard متشابكة
اربط عقد VPS في عنقود خاص بشبكة WireGuard متشابكة بالكامل: خطة عناوين واحدة، و[Peer] لكل عقدة، وAllowedIPs بقناع /32، وجدار حماية صارم، وخدمات مرتبطة بـ wg0.
باختصار: لتحويل عدة خوادم VPS إلى عنقود خاص، امنح كل عقدة VPS واجهة WireGuard بعنوان من شبكة فرعية خاصة واحدة، وأضف كل عقدة أخرى كـ `[Peer]` مع `Endpoint` العام الخاص بها وقناع `/32` في `AllowedIPs`، واسمح بـ UDP 51820 من عقدك فقط، واربط قواعد البيانات والخدمات الداخلية بعنوان `wg0` بدلاً من عنوان IP العام. حتى نحو عشر عقد يسهل صيانة ذلك يدوياً أو بقالب؛ وما بعد ذلك، استخدم أدوات تولّد الإعدادات وتوزعها.
يفترض هذا الدليل أنك تعرف الأساسيات من دليل WireGuard VPN وأنك حصّنت SSH على كل عقدة كما في دليل تحصين SSH؛ وللوصول إلى العقد عبر خادم عبور دون تمرير الوكيل، راجع دليل StrictModes وتمرير الوكيل.
خطة العناوين لعقد الـ VPN
اختر نطاقاً خاصاً واحداً لا يتعارض مع أي شيء آخر تستخدمه (الشبكة المنزلية، Docker، نطاقات pods في Kubernetes). يكفي `/24` لعنقود صغير ويبقي العناوين سهلة القراءة. خصص لكل عقدة عنواناً ثابتاً واحفظ الخطة في نظام إدارة الإصدارات، لأن كل الإعدادات مشتقة منها.
| العقدة | الدور | عنوان IP العام | عنوان wg0 | ListenPort |
|---|---|---|---|---|
| node1 | تطبيق | 203.0.113.11 | 10.88.0.1/24 | 51820 |
| node2 | تطبيق | 203.0.113.12 | 10.88.0.2/24 | 51820 |
| node3 | قاعدة بيانات | 203.0.113.13 | 10.88.0.3/24 | 51820 |
| node4 | مراقبة | 203.0.113.14 | 10.88.0.4/24 | 51820 |
إعدادات كل نظير على كل عقدة VPS
في الشبكة المتشابكة بالكامل تتحدث كل عقدة مباشرة مع كل عقدة أخرى، لذا يحتوي كل ملف إعدادات على `[Interface]` واحد وN-1 من أقسام `[Peer]`. أربع عقد تعني ستة أنفاق إجمالاً؛ وعشر عقد تعني 45. لكل عقدة عنوان IP عام، لذا لا حاجة عادةً إلى `PersistentKeepalive`؛ والتفاصيل في دليل keepalive وPresharedKey.
- 01.على كل عقدة شغّل `apt install wireguard`، ثم `umask 077; wg genkey | tee /etc/wireguard/wg0.key | wg pubkey > /etc/wireguard/wg0.pub`.
- 02.اجمع كل المفاتيح العامة وخطة العناوين في مكان واحد.
- 03.اختيارياً، ولّد مفتاح `wg genpsk` واحداً لكل زوج من العقد احتياطاً لعصر الحوسبة الكمومية.
- 04.اكتب `/etc/wireguard/wg0.conf` على كل عقدة كما هو موضح أدناه.
- 05.شغّل `systemctl enable --now wg-quick@wg0` وتحقق في `wg show` من وجود مصافحة حديثة مع كل نظير.
# /etc/wireguard/wg0.conf on node1
[Interface]
Address = 10.88.0.1/24
ListenPort = 51820
PrivateKey = <node1 private key>
[Peer]
# node2
PublicKey = <node2 public key>
Endpoint = 203.0.113.12:51820
AllowedIPs = 10.88.0.2/32
[Peer]
# node3
PublicKey = <node3 public key>
Endpoint = 203.0.113.13:51820
AllowedIPs = 10.88.0.3/32
[Peer]
# node4
PublicKey = <node4 public key>
Endpoint = 203.0.113.14:51820
AllowedIPs = 10.88.0.4/32كيف يعمل AllowedIPs في الشبكة المتشابكة
يؤدي `AllowedIPs` مهمتين في آن واحد. للحركة الصادرة، هو جدول توجيه: الحزم الموجهة إلى `10.88.0.3` تذهب إلى النظير الذي يدرج `10.88.0.3/32`. وللحركة الواردة، هو قائمة وصول: الحزمة القادمة من ذلك النظير لا تُقبل إلا إن كان عنوان مصدرها ضمن `AllowedIPs` لذلك النظير. لهذا يحصل كل نظير على `/32` الخاص به تحديداً، لا على `/24` كاملة.
القناع `/24` في سطر `Address` ينشئ فقط مسار النواة للشبكة الفرعية على `wg0`؛ ثم يختار WireGuard النظير الصحيح لكل وجهة.
- ▹يجب ألا يتشارك نظيران أبداً نطاق `AllowedIPs` متداخلاً على الواجهة نفسها؛ فالأخير هو الذي يُعتمد.
- ▹إن كانت عقدة توجّه أيضاً شبكة فرعية خاصة (مثل Docker على node3)، فأضف تلك الشبكة إلى `AllowedIPs` الخاص بـ node3 على العقد الأخرى.
- ▹لا تضع `0.0.0.0/0` في نظير ضمن الشبكة المتشابكة ما لم تكن تريد فعلاً أن تخرج كل الحركة عبر تلك العقدة.
جدار الحماية: عقدك وحدها تصل إلى النفق
لا يرد WireGuard على الحزم غير الموثقة، لكن قصر UDP 51820 على عناوين IP المعروفة للعقد يقلل الضجيج مع ذلك. داخل النفق، افتح فقط المنافذ التي تحتاجها كل خدمة. مثال nftables هذا لـ Debian 12/13 وUbuntu 24.04 يوضع في `/etc/nftables.conf`؛ حمّله بالأمر `nft -f /etc/nftables.conf` وفعّل `nftables.service`. أبقِ جلسة SSH مفتوحة أثناء الاختبار.
table inet filter {
set mesh_peers {
type ipv4_addr
elements = { 203.0.113.11, 203.0.113.12, 203.0.113.13, 203.0.113.14 }
}
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif lo accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport 22 accept
udp dport 51820 ip saddr @mesh_peers accept
iifname "wg0" ip saddr 10.88.0.0/24 tcp dport { 5432, 6379, 9100 } accept
}
}اربط الخدمات بواجهة wg
جدار الحماية طبقة واحدة؛ والثانية ألا تستمع على العنوان العام إطلاقاً. اربط الخدمات الداخلية بعنوان `wg0` للعقدة كي لا يكشفها خطأ في جدار الحماية. ولأن `wg0` يجب أن تكون موجودة قبل أن ترتبط الخدمة، رتّب الوحدات بملف systemd إضافي (drop-in)، أو اسمح بالارتباط بعناوين غير مفعّلة بعد عبر `net.ipv4.ip_nonlocal_bind = 1`.
# PostgreSQL on node3: postgresql.conf
listen_addresses = '10.88.0.3'
# pg_hba.conf
host all all 10.88.0.0/24 scram-sha-256
# Redis: /etc/redis/redis.conf
bind 10.88.0.3
# systemctl edit postgresql (repeat for other services)
[Unit]
[email protected]
[email protected]Note · تحقق من النتيجة بالأمر `ss -tlnp`: يجب أن تظهر الخدمات الداخلية على `10.88.0.x`، لا على `0.0.0.0` أو عنوان IP العام أبداً.
التوسع: متى تنتقل إلى الأدوات
الشبكة المتشابكة المكتوبة يدوياً لا بأس بها ما دام عدد العقد صغيراً والتغييرات نادرة. كل عقدة جديدة تعني تعديل كل ملف إعدادات موجود، فيتضاعف العمل تربيعياً. حين يصبح ذلك عبئاً، ولّد الإعدادات بدلاً من كتابتها.
في NoctisNode، تُنشر كل عقد VPS الجديدة في FI-1 (فنلندا)، لكل منها عنوان IPv4 مخصص ومنفذ 1 Gbps غير محدود الاستهلاك، والفوترة بالساعة مع واجهة API للوكلاء (مع TTL للحذف التلقائي) تجعل إضافة عقد الاختبار وإزالتها رخيصة. تبدأ الخطط من فئة Wisp؛ راجع خطط VPS.
| حجم العنقود | النهج |
|---|---|
| 2–5 عقد | إعدادات مكتوبة يدوياً، وخطة العناوين في ملف نصي |
| 5–15 عقدة | Ansible أو أداة إعدادات أخرى تولّد wg0.conf من قالب ومخزون واحد |
| 15+ عقدة أو تغيّر متكرر | مدير شبكة متشابكة يوزع المفاتيح والنظراء تلقائياً، أو تصميم محور وأطراف (hub-and-spoke) |
الأسئلة الشائعة
Qكيف أربط عدة خوادم VPS في شبكة خاصة؟
Aثبّت WireGuard على كل VPS، وامنح كل عقدة عنواناً من شبكة فرعية خاصة واحدة، وأدرج كل عقدة أخرى كنظير مع نقطة نهايتها العامة وAllowedIPs بقناع /32. ثم اربط الخدمات الداخلية بعنوان WireGuard.
Qهل تحتاج عقد الـ VPN في شبكة WireGuard المتشابكة إلى PersistentKeepalive؟
Aعادةً لا، لأن لكل عقدة VPS عنوان IP عاماً ويمكن الوصول إليها مباشرة. أضف `PersistentKeepalive = 25` فقط لعقدة موجودة خلف NAT.
Qما الذي يجب أن تكون عليه AllowedIPs لكل عقدة VPS؟
Aيحصل كل نظير على عنوان WireGuard الخاص به فقط بقناع /32، إضافة إلى أي شبكة فرعية توجّهها تلك العقدة. استخدام الشبكة الفرعية الكاملة للعنقود لكل نظير يسبب مسارات متداخلة ويعطّل الشبكة المتشابكة.
Qكم عقدة يمكن أن تضم شبكة WireGuard المتشابكة؟
AWireGuard نفسه يتعامل مع نظراء كثيرين، لكن الشبكة المتشابكة الكاملة المُدارة يدوياً تصبح مملة بعد نحو عشر عقد لأن كل عقدة تحتاج إعدادات كل عقدة أخرى. ما بعد ذلك، ولّد الإعدادات بالأتمتة أو استخدم مدير شبكة متشابكة.