انشر منفذ عميل VPN من خلف CGNAT: قائمة تحقق
قاعدة NAT للوجهة وحدها تمنح اتصالات نصف مفتوحة. ثبّت عنوان النفق، وترجم في الاتجاهين، وتأكد من مسار الرد قبل الاختبار.
ضع خدمة على حاسوب محمول خلف NAT من فئة مشغلي الاتصالات، ووجّه ذلك الحاسوب إلى خادم VPS عبر VPN، فلن يستطيع أحد في الخارج الوصول إليه. تضيف قاعدة NAT للوجهة على خادم VPS فتحصل على شيء أسوأ من الصمت: اتصالات تُفتح ثم تتوقف. الرد ليس مفقودًا، بل يخرج عبر المسار الافتراضي الخاص بالعميل، ما يعني أن الخادم لا يراه أبدًا. نفّذ هذه الفحوص الخمسة بالترتيب وتوقّف عند أول فحص لا يصمد.
تأكد من أن الخادم سيمرر الحزم أصلًا
علّم هذا المربع قبل كتابة أي ترجمة. قاعدة DNAT لحزمة ترفض النواة تمريرها يقبلها محلل القواعد ثم يُسقطها مسار التمرير، ما ينتج مهلة تبدو كمشكلة في جدار الحماية.
sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1
ضبطها في نواة قيد التشغيل ليس مثل ضبطها عبر إعادة تشغيل. اكتب net.ipv4.ip_forward=1 في ملف تحت /etc/sysctl.d/، ونفّذ sysctl --system، ثم اقرأ القيمة مرة أخرى بدلًا من الوثوق بأن الملف قد التُقط. الحاوية التي تدير فضاءها الخاص لأسماء الشبكة تحتاج القيمة نفسها داخل ذلك الفضاء، لا على المضيف فقط.
إذا ظلّت القراءة صفرًا، فتوقّف هنا. لن يعمل أي شيء لاحقًا.
ثبّت عنوان النفق قبل أن تشير إليه أي قاعدة
يمنح المسبح العناوين بترتيب الاتصال، لذا فقاعدة كُتبت لعقد اليوم قد تشير بهدوء إلى عميل مختلف الأسبوع المقبل. اربط العنوان بهوية الشهادة بدلًا من ترتيب الوصول.
client-config-dir /etc/openvpn/ccd
ifconfig-push 10.77.0.14 10.77.0.13
هذا الزوج هو طرف العميل وطرف النظير لنفق نقطة إلى نقطة، مع ضبط الخادم على الاسم الشائع للشهادة. في طوبولوجيا الشبكة الفرعية تُقرأ القيمة الثانية كقناع شبكة بدلًا من ذلك، فاكتب الصيغة التي تطابق الطوبولوجيا المستخدمة. ثم أعد توصيل العميل واقرأ العنوان على العميل نفسه، لأن رؤية الخادم للمسبح ليست دليلًا على ما أعدّه العميل.
إذا تغيّر العنوان بعد إعادة الاتصال، فتوقّف. قاعدة NAT تتبع هدفًا متحركًا ستفشل على نحو متقطع ولن تعلّمك شيئًا.
ترجم في الاتجاهين
ترجمة الوجهة ترسل الحزمة الواردة إلى العميل. ترجمة المصدر هي ما يجعل العميل يردّ على الخادم بدلًا من المرسل الأصلي، وهي القاعدة التي ينسى الناس كتابتها.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 29443 -j DNAT --to-destination 10.77.0.14:29443
iptables -t nat -A POSTROUTING -d 10.77.0.14 -p tcp --dport 29443 -j SNAT --to-source 10.77.0.13
بدون القاعدة الثانية يردّ العميل عبر وصلة مشغّل خدمة الإنترنت، فيرى النظير البعيد عنوان مصدر لم يخاطبه قط، بينما لا يحتفظ الخادم بأي إدخال تتبع للرد. يرى المراقب الخارجي مصافحة تكتمل نصفها، وهذه بالضبط العلامة التي تدفع الناس للبحث عن خطأ في جدار الحماية غير موجود.
اقرأ القاعدتين مرة أخرى باستخدام iptables -t nat -S وتأكد من أن اسم الواجهة هو الذي يحمل العنوان العام. على مضيف يصفّي أصلًا بواسطة nftables، اكتب الترجمة في سلسلة NAT من nftables من عائلة العنوان المطابقة بدلًا من خلط الأدوات.
دع جدول التصفية يمر
جداول NAT تعيد كتابة الرؤوس؛ لكنها لا تمنح إذنًا. مع سياسة DROP افتراضية يحتاج التدفق الممرَّر إلى قبول خاص به، إضافة إلى اتجاه العودة الذي تغطيه معظم السياسات أصلًا بقاعدة established,related.
iptables -A FORWARD -i eth0 -o tun0 -p tcp --dport 29443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
تحقق من سياسة سلسلة FORWARD قبل إضافة أي شيء، لأن ترتيب قاعدة DROP مبكرة يحدد ما إذا كانت قاعدتك ستُستشار أصلًا. على مضيف تعيش تصفيته في nftables، أضف القاعدة المكافئة إلى خطاف forward في جدول inet وتأكد من أن السلسلة الأساسية ترى فعلًا حركة المرور الممرَّرة وليس المدخلات المحلية فقط. إذا بقي عدّاد الحزم على القاعدة الجديدة صفرًا بينما ترتفع عدّادات NAT، فالحزمة تُسقط قبل قاعدتك. تلك هي الإشارة إلى قراءة ترتيب السلسلة، لا إلى إضافة نسخة ثانية من القاعدة نفسها.
أثبت ذلك من شبكة خارجية
اختبر من شبكة غير مرتبطة. فحص من جهاز آخر على الشبكة المحلية نفسها قد يمر عبر دعم NAT للالتفاف ولا يمارس أبدًا المسار الذي يستخدمه عميل بعيد، لذا فنتيجة خضراء هناك تثبت الشيء الخطأ.
tcpdump -ni any port 29443
conntrack -L | grep 29443
شغّل الالتقاط على الخادم وعلى العميل في الوقت نفسه. يُظهر التقاط الخادم ما إذا كانت الحزمة المترجمة تغادر نحو النفق؛ ويُظهر التقاط العميل ما إذا كان الطلب يصل وأين يُوجَّه الرد. وجود إدخال ترجمة في conntrack -L يثبت أن القاعدة طابقت، وغيابه يثبت أن الحزمة لم تصل إلى سلسلة NAT قط.
ماسحات المنافذ دليل ضعيف. تُبلغ عن المنفذ مغلقًا حتى يُربط التطبيق ويستمع، لذا استخدم اتصالًا حقيقيًا بالخدمة الحقيقية. وحين ينجح الأمر أخيرًا، أبقِ التعرض على ذلك المنفذ الواحد: تمرير SSH أو لوحة إدارة لأن القاعدة الأولى بدت غير ملائمة قرار أكبر بكثير من نشر خدمة.