تم نشر إصدار nftables 1.0.0 لتصفية الحزم، لتوحيد واجهات تصفية الحزم لـ IPv4 وIPv6 وARP وجسور الشبكة (التي تهدف إلى استبدال iptables وip6table وarptables وebtables). تم تضمين التغييرات المطلوبة لتشغيل إصدار nftables 1.0.0 في Linux 5.13 kernel. لا يرتبط التغيير الكبير في رقم الإصدار بأي تغييرات أساسية، ولكنه مجرد نتيجة للاستمرار المستمر للترقيم بالتدوين العشري (الإصدار السابق كان 0.9.9).
تتضمن حزمة nftables مكونات مرشح الحزمة التي تعمل في مساحة المستخدم ، بينما يتم توفير مستوى kernel بواسطة النظام الفرعي nf_tables ، والذي كان جزءًا من Linux kernel منذ الإصدار 3.13. على مستوى النواة ، يتم توفير واجهة عامة مستقلة عن البروتوكول توفر الوظائف الأساسية لاستخراج البيانات من الحزم ، وتنفيذ العمليات على البيانات ، والتحكم في التدفق.
يتم تجميع قواعد التصفية نفسها ومعالجات البروتوكولات المحددة في بايت كود في مساحة المستخدم، وبعد ذلك يتم تحميل بايت كود هذا في النواة باستخدام واجهة Netlink وتنفيذه في النواة في بيئة خاصة. آلة افتراضيةوهذا يذكرنا بـ BPF (مرشحات حزم بيركلي). يسمح هذا النهج بتقليل حجم كود التصفية الذي يعمل على مستوى النواة بشكل كبير، وينقل جميع عمليات تحليل القواعد ومنطق البروتوكول إلى مساحة المستخدم.
الابتكارات الرئيسية:
- تمت إضافة دعم لعنصر القناع "*" إلى قوائم المجموعة، والذي يتم تشغيله لأي حزم لا تندرج ضمن العناصر الأخرى المحددة في المجموعة. الجدول x {قائمة حظر الخريطة {نوع ipv4_addr: عناصر الفاصل الزمني لعلامات الحكم = {192.168.0.0/16: قبول، 10.0.0.0/8: قبول، *: إسقاط } } chain y { نوع خطاف مرشح التوجيه المسبق الأولوية 0؛ قبول السياسة؛ IP الصدر vmap @blocklist } }
- من الممكن تحديد المتغيرات من سطر الأوامر باستخدام خيار "--define". # جدول cat test.nft netdev x { chain y { نوع مرشح ربط أجهزة الدخول = $dev Priority 0; إسقاط السياسة؛ } } # nft —define dev="{ eth0, eth1 }" -f test.nft
- في قوائم الخرائط، يُسمح باستخدام التعبيرات الثابتة (ذات الحالة): مرشح الجدول inet {خريطة portmap {نوع inet_service: عناصر عداد الحكم = { 22 حزمة عداد 0 بايت 0: الانتقال إلى ssh_input، * حزم العداد 0 بايت 0: إسقاط } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { نوع مرشح الخطاف prerouting الأولوية الخام؛ قبول السياسة؛ iif vmap { "lo": الانتقال إلى wan_input } } }
- تمت إضافة أمر "list Hooks" لعرض قائمة المعالجات لعائلة حزم معينة: # nft list Hooks ip Device eth0 Family ip { Hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw [nf_tables] } إدخال الخطاف { -0000000100 chain ip ab [nf_tables] +0000000300 chain inet mz [nf_tables] } ربط للأمام { -0000000225 selinux_ipv4_forward 0000000000 chain ip ac [nf_tables] } إخراج الخطاف { -0000000225 selinux_ipv4_output } ربط postrouting { +0000000225 4 selinux_ipvXNUMX_postroute } }
- تسمح كتل قائمة الانتظار بدمج تعبيرات jhash وsymhash وnumgen لتوزيع الحزم على قوائم الانتظار في مساحة المستخدم. ... قائمة الانتظار إلى Symhash mod 65536 ... أعلام قائمة الانتظار تتجاوز numgen inc mod 65536 ... قائمة الانتظار إلى jhash oif . يمكن أيضًا دمج meta mark mod 32 "queue" مع قوائم الخرائط لتحديد قائمة انتظار في مساحة المستخدم بناءً على مفاتيح عشوائية. ... تجاوز أعلام قائمة الانتظار إلى خريطة oifname { "eth0" : 0، "ppp0" : 2، "eth1" : 2 }
- من الممكن توسيع المتغيرات التي تتضمن قائمة مجموعة إلى عدة خرائط. تحديد الواجهات = { eth0, eth1 } table ip x { chain y { نوع أولوية إدخال خطاف المرشح 0; قبول السياسة؛ iifname vmap { lo : Accept, $interfaces : drop } } } # nft -f x.nft # جدول مجموعة قواعد قائمة nft ip x { chain y { نوع مرشح الخطاف أولوية الإدخال 0; قبول السياسة؛ iifname vmap { "lo" : قبول، "eth0" : إسقاط، "eth1" : إسقاط } } }
- يُسمح بدمج vmaps (خريطة الحكم) على فترات: # nft add Rule xy tcp dport . IP الصدر vmap { 1025-65535 . 192.168.10.2 : قبول }
- تم تبسيط صيغة تعيينات NAT. أصبح الآن مسموحًا بتحديد نطاقات العناوين: … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } أو تحديدات صريحة. عناوين IP والمنافذ: … dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } أو مجموعات من نطاقات عناوين IP والمنافذ: … dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }
المصدر: opennet.ru
