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

الطلب الداخلي لا يزال حزمة مستقلة لها مصدرها ووجهتها وخدمتها، والنواة تعرف جمعية الأمان التي خرجت منها. هذه المعرفة هي ما يمكن لقاعدة جدار ناري أن تطابقه.

حزمتان، واجهة واحدة

تخيّل الاتجاه الوارد. تصل حزمة مغلفة بـ ESP أو UDP، فتجد النواة السياسة المطابقة وتفك تشفيرها وتُسلّم الحزمة الواضحة إلى مسار التمرير. القاعدة التي تنظر إلى اسم الواجهة فقط لا تستطيع التمييز بين تلك الحزمة وأي حركة أخرى تصل على السلك نفسه.

ما يميّزها هو سياق مسار الأمان الوارد المرتبط بالحزمة. تعرضه nftables بعبارة meta ipsec exists، وهي صحيحة عندما تصل الحزمة عبر مسار أمان IPsec. اجمعها مع مجموعة العملاء والوجهة والخدمة، فتصبح القاعدة محددة بما يكفي لتكون آمنة.

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

اكتب قاعدة التمرير

افترض خدمة وصول عن بُعد IPv4 موثّقة بعملاء في 10.90.0.0/24 ووجهة معتمدة واحدة على 203.0.113.40. يبدو جزء القاعدة لذلك التدفق هكذا.

meta ipsec exists ip saddr 10.90.0.0/24 \
  ip daddr 203.0.113.40 tcp dport 443 \
  oifname "eth0" counter accept

العناوين والواجهة أمثلة تُستبدل. ضع المكافئ المراجع في سياسة التمرير قبل القاعدة التي كانت سترفض التدفق، ولا تُفرّغ مجموعة قواعد قائمة لتثبيتها؛ فالبوابة ليست تجربة غرفة نظيفة.

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

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

السياق الوارد ليس السياق الصادر

تغطي العائلة نفسها من التعابير الاتجاه الآخر بعبارة rt ipsec، التي تصف جمعية الأمان الصادرة التي ستستخدمها الحزمة. وهي تجيب عن سؤال مختلف: لا من أين جاءت هذه الحزمة، بل هل ستُحمى في مرحلتها التالية.

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

أبقِ السؤالين في قاعدتين منفصلتين كي يرى القارئ أيّهما يُفرض. القاعدة الواحدة الذكية التي تفحص الاثنين أصعب في المراجعة وأصعب بكثير في التنقيح حين يتوقف نصفها عن المطابقة. كما أن قاعدتين بعدّادات تخبرك أي شرط يفشل، وهذا ما لن تفعله قاعدة مدمجة أبدًا.

NAT ليس قرار جدار ناري

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

القبول داخل سلسلة NAT ليس سماحًا عامًا هو الآخر. لـ NAT والتصفية وظيفتان مختلفتان، وسلسلة NAT لا تفحص كل حزمة لاحقة من تدفق قائم، وهذا بالضبط سبب أن الاعتماد عليها للأمان ينتج قواعد تبدو عاملة في الاختبار وتفشل تحت الحمل.

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

تحقق من الخدمة الداخلية بدقة

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

يوثّق مرجع nftables العبارتين meta ipsec و rt ipsec، إضافة إلى التعابير الخاصة بكل اتجاه، وهو المكان الذي تتحقق فيه من الصياغة مقابل نسختك المثبتة. وأبقِ النطاق صريحًا: هذا مثال IPv4، ولا يقول شيئًا عن IPv6، ولا يحوّل تمرير المنافذ العامة التعسفي إلى جزء من خدمة VPN.

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