احجب نطاق وجهة واحدًا لكل مجموعة عملاء VPN
قاعدة nftables واحدة تكفي لرفض بادئة وجهة لمجموعة VPN مسموح لها، دون المساس بحركة البوابة نفسها. طابِق الخطاف والموضع.
قاعدة واحدة يمكنها إبعاد مجموعة VPN مسموح لها عن نطاق وجهة دون تعكير أي شيء آخر تفعله البوابة. القاعدة نفسها قصيرة؛ لكن ما يحدد نجاحها هو الخطاف الذي تسكنه وموضعها داخل السلسلة. الخطأ في هذين الأمرين ينتج جدار حماية يبدو صحيحًا ويعمل على نحو غير متسق. ابدأ من حالة الحزمة عند وصولها إلى القاعدة.
ما الذي تطابقه القاعدة فعليًا
تطابق القاعدة ثلاثة أشياء في وقت واحد: واجهة الإدخال، وبادئة المصدر، وبادئة الوجهة. يجب أن تتحقق الثلاثة قبل أن يُطبَّق الإسقاط، وهذا ما يجعلها ضيقة. قراءتها كتعبير واحد أسهل من قراءتها كثلاث سياسات منفصلة.
مطابقة الواجهة هي ما يفصل حركة العملاء المُمرَّرة عن اتصالات البوابة نفسها. بدونها، فإن قاعدة تذكر مجموعة المصدر فقط ستصيب أيضًا الحزم التي تولّدها البوابة من ذلك العنوان، إن حدث ذلك أصلًا. بادئة المصدر تحصر السياسة في العملاء المسموح لهم، وبادئة الوجهة تحصرها في نطاق واحد. اقرأ القاعدة كتقاطع لا كقائمة.
اكتب القيم الثلاث قبل تعديل أي شيء: اسم واجهة النفق، والمجموعة التي يوزعها الخادم، والبادئة التي تنوي رفضها. خطأ مطبعي في أي منها ينتج قاعدة تُحلَّل بنظافة ولا تحمي شيئًا. احتفظ بهذه القيم الثلاث في سجل التغيير بجانب القاعدة.
الخطاف يحدد من تنطبق عليه القاعدة
تُربط سلسلة netfilter بخطاف، والخطاف هو ما يحدد الحزم التي تراها السلسلة أصلًا. خطاف forward يرى الحركة الموجَّهة عبر البوابة، وهي حركة العميل إلى الوجهة. وكل ما سواه في السلسلة موجَّه إلى جمهور مختلف.
خطاف input يرى الحركة المتوجهة إلى البوابة نفسها، فقاعدة توضع هناك تحكم الوصول إلى خدماتها لا العبور. وخطاف output يرى الحركة التي تنشئها البوابة، وهو عكس ما تحتاجه سياسة مجموعة العملاء. أسماء السلاسل مجرد تسميات اختيارية اختارها من كتب مجموعة القواعد، فلا تستنتج الخطاف من الاسم. تحقق من مكان ربط السلسلة قبل أن تفترض ما يمكنها مطابقته.
| Hook | Traffic it sees | Right for this policy |
|---|---|---|
| input | Addressed to the gateway | No, that is the host's own services |
| forward | Routed through the gateway | Yes, for client-to-destination traffic |
| output | Generated by the gateway | No, that is the opposite direction |
قراءة الربط فحص من سطر واحد يمنع القاعدة من الهبوط في سلسلة لا ترى الحزمة أبدًا.
ضع القاعدة قبل القبول الواسع
تُقيَّم القواعد بالترتيب، والحكم الأول يفوز. القبول الواسع في موضع أبكر داخل السلسلة ينهي التقييم للحزم التي يطابقها، فالإسقاط المضاف بعده لا يُنفَّذ عليها أبدًا. قاعدة الترتيب هذه هي السبب الكامل في أن قاعدة تبدو صحيحة قد لا يكون لها أثر.
أدرج القاعدة قبل القبول بدلًا من إلحاقها في النهاية. إذا كانت السلسلة تحتوي أصلًا على قبول عام لواجهة النفق، فيجب أن تسبقه القاعدة الجديدة وإلا فهي زينة. تحقق من الترتيب الناتج لا من الملف الذي عدّلته، لأن مجموعة قواعد مبنية من عدة ملفات قد لا تطابق أي ملف بمفرده. ثم أكّد بحزمة اختبار من المجموعة.
sudo nft list chain inet filter forward
sudo nft insert rule inet filter forward iifname "tun0" ip saddr 10.90.0.0/24 ip daddr 198.51.100.0/24 drop
sudo nft -c -f /etc/nftables.conf
الأمر الثالث يحلّل الملف دون تطبيقه، فيلتقط أخطاء الصياغة قبل أن تصبح انقطاعًا. طبّق مع خطة تراجع، لأن قاعدة خاطئة في سلسلة forward قد تقطع النفق الذي تعمل عبره.
التدفقات القائمة لا تهتم بقاعدتك الجديدة
مُدخل conntrack أُنشئ قبل وجود القاعدة يظل مطابقًا للقبول السابق. لهذا يبدو الإسقاط الجديد أحيانًا فاعلًا مع الاتصالات الجديدة وعابثًا مع الاتصال الذي تُختبره.
اقرأ مطابقة الحالة في أعلى السلسلة. إن كانت تقبل حركة established وrelated قبل قاعدتك، فكل تدفق جارٍ يستمر حتى يُغلق. هذا عادةً السلوك الذي تريده لقاعدة طارئة، وهو مربك حين تتوقع قطعًا فوريًا. قرر أي أثر تريد قبل النشر. الاختبار الذي يعيد استخدام اتصال مفتوح سيخبرك بقصة خاطئة.
sudo conntrack -L -s 10.90.0.14 -d 198.51.100.20
sudo nft list ruleset | grep -n -A3 'ct state'
الأمر الأول يُظهر ما إذا كان تدفق ما موجودًا، والثاني يُظهر ما إذا كانت قاعدة حالة مبكرة تظل تقبله. كلاهما للقراءة فقط وآمن أثناء حادث.
ما ليست هذه القاعدة
القاعدة ليست قائمة حجب نطاقات، ولا سياسة IPv6، ولا تقييدًا على حساب تطبيق بعينه.
كل واحد من تلك يحتاج آلية خاصة به. حجب النطاق عليه أن يحل الأسماء، وهو ما لا يفعله مرشح الحزم. حركة IPv6 تحتاج مطابقة خاصة بها، لأن تعبير ip لا يقول شيئًا عن حزم ip6. أما التقييد على مستوى التطبيق فينتمي إلى الخدمة أو إلى وكيل مُوثَّق لا إلى مطابقة بادئة. إبقاء هذه المتطلبات منفصلة هو ما يمنع مطالبة قاعدة ضيقة واحدة بأربع وظائف.
العقد الذي تقدمه هذه القاعدة دقيق: حركة من مجموعة مسموح لها إلى بادئة وجهة واحدة تُرفض، بينما تحتفظ حركة البوابة غير المتصلة بسياسيتها الحالية. اكتب تلك الجملة بجانب القاعدة، وسيعرف الشخص التالي الغرض منها.