قاعدة NAT كان المفروض أن تمنح مجموعة عملاء VPN واحدة عنوانها العام الخاص تقف عند صفر حزم، بينما تستمر المجموعة نفسها في الخروج تحت المصدر الخطأ. القاعدة عادة ليست مخطئة بشأن العنوان؛ بل مخطئة بشأن الواجهة. -o eth0:0 تشير إلى جهاز غير موجود، لأن eth0:0 تسمية مرتبطة بعنوان، والجهاز الخاص بذلك العنوان هو eth0. مراقبة العدّادات أسرع طريقة لتأكيد ذلك، والإصلاح أصغر مما يوحي به التحقيق.

تحقق مما تسميه النواة الجهاز

اقرأ العرضين بشكل منفصل قبل تغيير أي شيء:

ip link show
ip address show dev eth0
ip route get 203.0.113.20

قائمة الروابط تظهر الواجهات. وقد تظهر قائمة العناوين عنوان IPv4 ثانيا يحمل التسمية: eth0:0، والجهاز الخاص بذلك العنوان ما زال eth0. يعامل دليل العناوين في iproute2 التسمية كاسم للعنوان، لا كرابط ثان، وهذا هو الفرق الذي يقوم عليه المشكل كله.

التاريخ يفسر الالتباس. الصيغة القديمة ifconfig eth0:0 كانت فعلا تبدو كواجهة جديدة، وما زالت النصوص البرمجية من ذلك العصر تشير إلى واحدة. في نظام حالي، الاسم المستعار تسمية على عنوان، ولا شيء في مسار التوجيه أو netfilter يعامله كنقطة خروج منفصلة.

تحقق مما طابقته القاعدة فعلا

اقرأ العدّادات مع قائمة القواعد لا من الذاكرة:

iptables -t nat -L POSTROUTING -v -n --line-numbers

قاعدة يبقى عدّاد حزمها صفرا بينما يتدفق مرور مطابق لا يجري تقييمها، وشرط واجهة الخروج الذي يسمي eth0:0 سبب شائع. جهاز الخروج الذي اختاره المسار هو eth0، لذا شرط يبحث عن اسم مختلف لا يصبح صحيحا أبدا، أيا كان عنوان المصدر الذي اختارته النواة.

غير الشرط إلى الجهاز الحقيقي واترك التسمية خارجه. إن كنت بحاجة إلى التمييز بين مجموعتي عملاء تشتركان في ذلك الجهاز، ميزهما ببادئة المصدر، لا باسم واجهة لا يمكن أن يوجد. قاعدتان بمطابقات -s غير متداخلة تكونان مقروءتين وقابلتين للاختبار؛ أما قاعدة واحدة بجهاز خيالي فليست كذلك. أعط كل قاعدة تعليقا يسمي المجموعة، لأن بعد ستة أشهر لن تدل البادئة وحدها أحدا على سبب وجودها.

تحقق من المسار الذي اختار الجهاز

يعمل NAT بعد التوجيه بعد أن يكون المسار قد اختار واجهة خروج بالفعل، لذا يجب أن تكون الواجهة في القاعدة هي التي اختارها المسار. اسأل النواة مباشرة باستخدام ip route get للحصول على عنوان عميل تمثيلي واقرأ كلا من الجهاز والمصدر الذي يبلغ عنه.

إذا كان الجواب يسمي eth0، فجزء الواجهة في القاعدة محسوم. وإذا كان يسمي جهاز نفق، فلن تصل الحزمة أبدا إلى القاعدة التي تعدلها، وينتقل البحث إلى جدول التوجيه وأولوياته. القاعدة التي لا تطابق أبدا لأن الحزمة خرجت من مكان آخر تبدو في مخرجات العدّاد مطابقة لقاعدة بها جهاز مكتوب خطأ. تأكد من أي الحالتين لديك قبل تعديل أي شيء، لأن الثانية تحتاج تغييرا في التوجيه لا في النص.

اختر المصدر المترجم عن قصد

بعد أن يصبح الجهاز صحيحا، يصبح عنوان المصدر قرارا منفصلا. هذه مجموعة IPv4 توضيحية وعنوان مثال فقط:

iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 \
  -j SNAT --to-source 203.0.113.20

كتابة عنوان في --to-source لا تجعل أحدا يعيد توجيهه إليك. على مزود المنبع أو مالك العنوان أن يسلم الردود الخاصة بذلك العنوان إلى هذا المضيف، ويجب أن يكون العنوان مما يسمح لك باستخدامه. وإلا فإن القاعدة ستطابق وتترجم وستبقى الردود ذاهبة إلى مكان آخر.

تغيير عنوان المصدر ليس مثل تغيير وصلة المنبع. حين تكون الحاجة الحقيقية مسارا ماديا مختلفا، على سياسة التوجيه أن تختار ذلك المسار أولا؛ ثم يعيد SNAT كتابة المصدر على الجهاز الذي اختارته السياسة. وإضافة مزيد من التسميات إلى eth0 لا توفر المسار ولا التصريح.

تحقق باتصال فتحته للتو

افتح اتصال عميل جديدا بدلا من إعادة استخدام اتصال قائم. يحتفظ تتبع الاتصالات بالترجمة التي سجلها عند بدء التدفق، لذا قد تستمر جلسة قديمة في استخدام عنوان المصدر السابق وتجعل قاعدة جديدة صحيحة تبدو معطلة. راقب زيادة العدّاد، ثم لاحظ المصدر المترجم على السلك أو عند الطرف البعيد.

لعدة مجموعات تشترك في واجهة واحدة، أعط كل واحدة مطابقة مصدر صريحة وعنوان ترجمة خاصا بها، واحتفظ بها في تكوين الجدار الناري المدار، وسجل الترتيب الذي تقيم به. ثم سجل ما تحققت منه: الجهاز من ip route get، والعدّاد الذي تحرك، والمصدر الذي رآه الطرف البعيد. ذلك السجل يجيب على التقرير التالي دون تكرار التباس الاسم المستعار.

مقالات ذات صلة