في نهاية الجزء الثاني تركنا الحاويات معزولة: يرى بعضها بعضاً، ولا يرى أيٌّ منها الإنترنت. هذا العزل مفيد، لكن أغلب الخدمات تحتاج الخروج: تحديثات النظام، وتنزيل الحزم، وطلب شهادات SSL، والاتصال بخدمات خارجية.
الحل هو NAT — الآلية نفسها التي يستعملها راوتر بيتك ليُخرِج عشرة أجهزة إلى الإنترنت بعنوان واحد. في هذا الجزء نفعّلها في Proxmox بسطرين، ونفهم ما يحدث فعلاً خلفهما.
كل ما في هذه السلسلة مُنفَّذ فعلاً. بنينا المختبر على سيرفر Proxmox VE 9.2 بعنوان عام واحد، وأنشأنا عليه شبكة خاصة 10.10.10.0/24 وأربع حاويات، ونشرنا ثلاثة نطاقات فرعية حقيقية بشهادات Let's Encrypt. كل لقطة وكل مخرج أمر في هذه المقالات من ذلك المختبر — والعناوين في الصور حقيقية وقت التنفيذ.
ما هو NAT وكيف يعمل؟
NAT اختصار لـ«ترجمة عناوين الشبكة». الفكرة: حين تخرج حزمة من حاوية عنوانها 10.10.10.11 إلى الإنترنت، يستبدل المضيف عنوان المصدر بعنوانه العام قبل إرسالها، ويحتفظ بجدول يتذكّر فيه من أرسل ماذا. وحين يعود الردّ، يراجع الجدول ويعيده إلى الحاوية الصحيحة.
النتيجة: الخادم البعيد يرى عنواناً عاماً واحداً فقط، ولا يعرف شيئاً عن شبكتك الداخلية. وهذا سبب أمني مهم بذاته.
| المرحلة | عنوان المصدر | عنوان الوجهة |
|---|---|---|
| تخرج من الحاوية | 10.10.10.11 | 1.1.1.1 |
| بعد MASQUERADE في المضيف | 82.39.115.50 | 1.1.1.1 |
| يعود الردّ إلى المضيف | 1.1.1.1 | 82.39.115.50 |
| بعد مراجعة جدول التتبّع | 1.1.1.1 | 10.10.10.11 |
شرطان لا ثالث لهما
لتعمل هذه الآلية يجب توفّر شيئين فقط:
- تفعيل التوجيه في نواة لينكس — بدونه يرفض المضيف تمرير أي حزمة ليست موجّهة إليه.
- قاعدة MASQUERADE — هي التي تنفّذ استبدال العنوان.
1) تفعيل التوجيه
للتجربة الفورية:
sysctl -w net.ipv4.ip_forward=1
ولجعله دائماً بعد إعادة التشغيل:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-nat.conf
sysctl --system
2) قاعدة الترجمة
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE
اقرأ القاعدة كجملة: «في جدول الترجمة، بعد اتخاذ قرار التوجيه، كل ما مصدره الشبكة 10.10.10.0/24 وخارج عبر الواجهة vmbr0 — بدّل عنوان مصدره بعنوان تلك الواجهة».
لماذا MASQUERADE لا SNAT؟ الاثنان يؤدّيان الغرض، لكن SNAT يتطلّب كتابة العنوان العام صراحةً، فإذا تغيّر توقّف كل شيء. أما MASQUERADE فيقرأ عنوان الواجهة لحظياً — أبطأ بقدر لا يُلاحظ، وأصحّ في كل الحالات تقريباً.
اجعل القاعدة دائمة — الطريقة الصحيحة
القاعدة أعلاه تختفي عند إعادة التشغيل. أفضل مكان لتثبيتها هو ملف الشبكة نفسه، مربوطةً بالجسر الذي تخدمه:
auto vmbr2
iface vmbr2 inet static
address 10.10.10.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE
ميزة هذه الطريقة أن القاعدة تُضاف مع الجسر وتُحذف معه — فلا تبقى قواعد يتيمة تربكك بعد شهور. وهذا ما فعلناه في المختبر:
البديل: حزمة الحفظ التلقائي
إن كنت تفضّل فصل قواعد الجدار عن ملف الشبكة:
apt install -y iptables-persistent
netfilter-persistent save
الاختبار
pct exec 202 -- ping -c 2 1.1.1.1
pct exec 202 -- apt-get update
iptables -t nat -S POSTROUTING | grep 10.10.10
وللتأكّد من أن الترجمة تعمل فعلاً، اسأل خدمة خارجية عن العنوان الذي تراه:
pct exec 202 -- curl -s https://api.ipify.org
يجب أن يعيد عنوانك العام لا العنوان الداخلي. هذا هو NAT في سطر واحد.
حصر الخروج — لا تفتح لكل شيء
القاعدة السابقة تُخرج كل الشبكة. وهذا مقبول في البداية، لكن الأفضل أمنياً أن تسمح لما يحتاج فقط. مثلاً: خدمات الويب تخرج، وقاعدة البيانات لا تخرج إطلاقاً.
# اسمح للنطاق 10.10.10.10-49 فقط (خدمات الويب)
iptables -t nat -A POSTROUTING -s 10.10.10.0/25 -o vmbr0 -j MASQUERADE
# امنع الخدمات الداخلية من الخروج
iptables -A FORWARD -s 10.10.10.50/26 -o vmbr0 -j REJECT
قاعدة عملية: خدمة لا تحتاج الإنترنت يجب ألّا تصل إليه. قاعدة بيانات مخترقة تستطيع الخروج = تسريب بيانات. وقاعدة بيانات مخترقة لا تستطيع الخروج = مشكلة محصورة.
ماذا عن nftables؟
الأنظمة الحديثة تستعمل nftables خلف الكواليس، لكن أوامر iptables ما زالت تعمل عبر طبقة توافق، وهي ما تجده في أغلب الشروحات. إن أردت الصيغة الحديثة:
nft add table ip nat
nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule ip nat postrouting ip saddr 10.10.10.0/24 oifname "vmbr0" masquerade
لا تخلط بين الاثنين على السيرفر نفسه — اختر واحداً والتزم به.
أخطاء شائعة وحلولها
| العَرَض | السبب | الحل |
|---|---|---|
| ping 10.10.10.1 ينجح وping 1.1.1.1 يفشل | التوجيه غير مفعّل | sysctl -w net.ipv4.ip_forward=1 |
| الـping ينجح وapt update يفشل | لا يوجد خادم أسماء في الحاوية | pct set 202 --nameserver 1.1.1.1 |
| يعمل ثم يتوقّف بعد إعادة التشغيل | القاعدة لم تُثبَّت | ضعها في post-up أو استعمل iptables-persistent |
| قواعد مكرّرة كثيرة | تشغيل الأمر يدوياً عدة مرات | iptables -t nat -F POSTROUTING ثم أضفها مرة واحدة |
| واجهة الخروج اسمها غير vmbr0 | اختلاف التسمية بين السيرفرات | تحقّق بـip route get 1.1.1.1 واستعمل الاسم الظاهر |
أسئلة شائعة
هل يُبطئ NAT الاتصال؟
الأثر مجهري: تعديل رأس الحزمة ومراجعة جدول. لن تلاحظه إلا في أحمال هائلة جداً.
هل يحمي NAT حاوياتي؟
يحميها من الاتصال الوارد غير المطلوب (لأن لا أحد يستطيع بدء اتصال بعنوان داخلي)، لكنه ليس جداراً نارياً. لا يفحص المحتوى ولا يمنع اتصالاً خارجاً من حاوية مخترقة. اجمعه مع قواعد FORWARD كما أعلاه.
هل أستطيع تخصيص عنوان عام لحاوية واحدة مع بقاء الباقي على NAT؟
نعم إن كان عندك أكثر من عنوان: اربط تلك الحاوية بـvmbr0 مباشرة. لكن اسأل نفسك أولاً: لماذا؟ الوسيط العكسي يغنيك عن هذا في 95% من الحالات.
ماذا عن IPv6؟
مع IPv6 لا تحتاج NAT أصلاً — العناوين وفيرة ويمكن إعطاء كل حاوية عنواناً عاماً. لكنك حينها تحتاج جداراً نارياً صارماً، لأن كل حاوية صارت مرئية من الإنترنت.
هل يؤثّر هذا على الأجهزة الافتراضية على vmbr0؟
لا. القاعدة مقيّدة بمصدر 10.10.10.0/24 فقط، وما عداه لا يمسّه شيء.
الخطوة التالية
حاوياتك تخرج إلى الإنترنت الآن، لكن لا أحد يستطيع الدخول إليها بعد. في الجزء الرابع نفتح الباب من الخارج بتمرير المنافذ — ونشرح متى يكون هذا هو الحل الصحيح ومتى يكون خطأ.
هذه المقالة جزء من سلسلة «من IP واحد إلى عشرات الخدمات» — عشرة أجزاء بُنيت كلها على سيرفر Proxmox حقيقي: ١. لماذا يكفي عنوان واحد · ٢. الشبكة الخاصة · ٣. إعداد NAT · ٤. تمرير المنافذ · ٥. الـReverse Proxy · ٦. Nginx Proxy Manager · ٧. النطاقات الفرعية · ٨. Cloudflare والشهادات · ٩. مقارنة الحلول · ١٠. سحابة صغيرة كاملة