تمرير منفذ نحو نظير WireGuard خلف NAT: DNAT مع SNAT
يُسلِّم DNAT الطلب، لكن الرد يخرج من العنوان الخطأ. أضف قاعدة SNAT مطابقة وضع كلتيهما بعد إعداد النفق.
يطلب متصفح https://203.0.113.10:8443، فيقبل الوكيل الاتصال، ولا تجيب الخدمة على نظير WireGuard أبدًا. قاعدة DNAT تؤدي عملها؛ الرد هو الجزء الذي يفشل. تتبَّع الحزمة عبر التحويلين فيصبح النقص في القاعدة واضحًا. الإصلاح هو عبارة NAT إضافية واحدة في الخطاف الصحيح، لا نفق جديد.
تتبَّع طلبًا واحدًا من البداية إلى النهاية
يصل الطلب على الواجهة العامة للوكيل، ومصدره العنوان العام للعميل ووجهته عنوان الوكيل. في nat PREROUTING تعيد قاعدة DNAT كتابة الوجهة إلى عنوان النفق الخاص بالنظير، 10.90.0.2. ثم يرسل قرار التوجيه الحزمة عبر wg0، ويكتمل مسار التمرير.
على النظير تحمل الحزمة الآن العنوان المصدر العام الأصلي، لأن شيئًا لم يعد كتابته. تقبل الخدمة الاتصال وترسل ردها إلى بوابتها الافتراضية، وهي موجّه المنزل أمام النظير. لا يملك ذلك الموجّه أي حالة لتدفق لم يره، فإما أن يُسقط الحزمة أو يحوّلها إلى عنوانه العام، وهو ما لن يقبله العميل.
عدم التماثل هو المشكلة كلها: الطلب يمر عبر الوكيل، والرد يحاول الذهاب مباشرة. لا يفيد تتبّع الاتصالات في الوكيل إلا إذا عاد الرد عبر الوكيل، ولا يمكنه العودة إلى هناك ما دام عنوان المصدر يشير إلى العميل الأصلي.
أضف التحويل العكسي
أعد كتابة مصدر التدفق المُمرَّر إلى عنوان النفق الخاص بالوكيل قبل أن يغادر نحو النظير. ثم تجيب الخدمة إلى 10.90.0.1، ويستقبلها الوكيل، ويعكس تتبّع الاتصالات كلا التحويلين قبل أن تعود الحزمة إلى العميل.
iptables -t nat -A PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
iptables -t nat -A POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1قاعدة POSTROUTING ضيقة عن قصد: تطابق الوجهة المحوّلة وواجهة النفق، فلا تعيد كتابة حركة غير ذات صلة تصادف خروجها عبر wg0. قاعدة masquerade واسعة كانت ستخفي عنوان العميل أيضًا، لكنها ستفعل ذلك مع كل تدفق وتجعل جدول NAT أصعب في التدقيق.
ضع القواعد حيث يوجد النفق
القواعد التي تشير إلى عنوان النفق أو واجهته يجب أن تعمل بعد أن يضبطها wg-quick. تُنشأ الواجهة قبل PreUp، لكن العناوين وMTU وDNS والمسارات تُطبَّق بعد ذلك، ويُشغَّل PostUp حالما يصبح كل ذلك في مكانه. ضع الإضافات في PostUp والحذف في PreDown.
PostUp = iptables -t nat -A PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
PostUp = iptables -t nat -A POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1
PreDown = iptables -t nat -D PREROUTING -p tcp -m multiport --dports 8080,8443 -j DNAT --to-destination 10.90.0.2
PreDown = iptables -t nat -D POSTROUTING -d 10.90.0.2 -o wg0 -p tcp -m multiport --dports 8080,8443 -j SNAT --to-source 10.90.0.1يجب أن تطابق عمليات الحذف الإضافات رمزًا برمز، بما في ذلك مطابقات multiport والواجهة. الحذف الذي يختلف في مطابقة واحدة لا يزيل شيئًا، ويعيد الاتصال التالي إضافة نسخة ثانية من القاعدة. بعد بضع عمليات إعادة اتصال يحتوي الجدول على تكرارات يصعب نسبتها إلى سطر إعداد.
تحقَّق من النتيجة بواسطة iptables -t nat -S بعد إعادة الاتصال. إذا ظهرت القاعدة نفسها مرتين، فسطر PreDown لا يطابق والتنظيف يفشل بصمت.
التمرير والترشيح وNAT الأخرى
فعِّل تمرير IPv4 بشكل دائم، ثم اسمح بالتدفق المُمرَّر في جدول الترشيح. يحدث DNAT قبل سلسلة FORWARD، لذا تطابق قاعدة الترشيح الوجهة المحوّلة لا العنوان العام. إذا كان UFW يدير الجدار الناري، فعبِّر عن السماح كقاعدة مسار؛ قاعدة مضيف عادية لا تغطي حركة التمرير.
لا تزال طبقتا NAT أخريان قادرتين على كسر المسار حتى عندما تكون قواعد الوكيل صحيحة. على اتصال منزلي، العنوان العام ملك للموجّه، وفتح المنفذ في جداره الناري ليس مثل إنشاء إدخال تمرير منفذ يرسل ذلك المنفذ إلى الوكيل. المنفذ الذي يبدو مفتوحًا من الخارج بينما لا يجيب شيء غالبًا يفتقد ذلك التعيين تحديدًا.
على VPS خلف NAT، يعيّن المزوّد منفذًا عامًا إلى عنوان خاص. يجب أن يوافق التعيين المنفذ الذي تعلنه، وعدم التطابق يبدو تمامًا كنفق معطوب. أكِّد تعيين المزوّد قبل تغيير إعداد WireGuard.
تحقَّق من مسار العودة واقبل التكلفة
اتصل من شبكة ليست شبكة LAN الخاصة بالوكيل، ثم افحص زوج التحويل بينما الاتصال مفتوح:
conntrack -L -p tcp --dport 8080
tcpdump -ni any tcp port 8080يجب أن يُظهر إدخال conntrack الصف الأصلي والصف المحوَّل واتجاه الرد. إذا كان الرد غائبًا، فالنظير لا يرسل عبر النفق، وهذا يعني عادةً أن قاعدة SNAT لم تُطبَّق أو أن جدار النظير الناري أسقط التدفق.
أعد التشغيل مرة واحدة لتثبت أن PostUp يعيد تطبيق القواعد، ثم أوقف النفق وأكِّد أن PreDown أزالها. القواعد الميتة التي تبقى بعد قطع الاتصال هي سبب سلوك تغيير لاحق بشكل غير متوقع.
أخيرًا، اقبل ما يكلّفه SNAT. ترى الخدمة كل طلب قادمًا من الوكيل، فلم تعد سجلات الوصول وحدود المعدل لكل عميل وقوائم العناوين المسموح بها تميّز المستخدمين. تحتاج حالة الانعكاس إلى تحويل مصدر خاص بها للعملاء على شبكة LAN الخاصة بالوكيل. إذا كان النظير يحتاج عناوين العملاء الحقيقية، فالبديل مسار عودة إلى شبكة العميل، وهو عمل أكبر لكنه يحفظ المعلومة.