انتشار فیلتر بسته nftables 1.0.0

انتشار فیلتر بسته nftables 1.0.0 منتشر شده است که رابط های فیلتر بسته را برای IPv4، IPv6، ARP و پل های شبکه یکپارچه می کند (با هدف جایگزینی iptables، ip6table، arptables و ebtables). تغییرات مورد نیاز برای اجرای nftables 1.0.0 در هسته لینوکس 5.13 گنجانده شده است. تغییر قابل توجهی در شماره نسخه با هیچ تغییر اساسی همراه نیست، بلکه تنها نتیجه ادامه مداوم شماره گذاری در نماد اعشاری است (نسخه قبلی 0.9.9 بود).

بسته nftables شامل اجزای فیلتر بسته است که در فضای کاربر اجرا می شود، در حالی که کار در سطح هسته توسط زیرسیستم nf_tables ارائه می شود که از زمان انتشار 3.13 بخشی از هسته لینوکس بوده است. سطح هسته تنها یک رابط عمومی مستقل از پروتکل ارائه می دهد که عملکردهای اساسی را برای استخراج داده ها از بسته ها، انجام عملیات داده و کنترل جریان ارائه می دهد.

قوانین فیلتر و کنترل کننده های خاص پروتکل در بایت کد در فضای کاربر کامپایل می شوند، پس از آن این بایت کد با استفاده از رابط Netlink در هسته بارگذاری می شود و در هسته در یک ماشین مجازی ویژه که یادآور BPF (فیلترهای بسته برکلی) است، اجرا می شود. این رویکرد به شما این امکان را می دهد که اندازه کدهای فیلترینگ در حال اجرا در سطح هسته را به میزان قابل توجهی کاهش دهید و تمام عملکردهای تجزیه قوانین و منطق کار با پروتکل ها را به فضای کاربر منتقل کنید.

نوآوری های اصلی:

  • پشتیبانی از عنصر ماسک "*" به لیست های مجموعه اضافه شده است، که برای هر بسته ای که تحت سایر عناصر تعریف شده در مجموعه قرار نمی گیرند فعال می شود. جدول x { فهرست مسدود نقشه { نوع ipv4_addr : حکم رای پرچم‌های فاصله عناصر = { 192.168.0.0/16 : قبول، 10.0.0.0/8 : پذیرش، * : رها کردن } } زنجیره y { نوع فیلتر قلاب اولویت پیش‌روتینگ 0; پذیرش سیاست ip sadr vmap @blocklist } }
  • امکان تعریف متغیرها از خط فرمان با استفاده از گزینه "--define" وجود دارد. # cat test.nft table netdev x { chain y { type filter hook ingress devices = $dev priority 0; کاهش سیاست؛ } } # nft —define dev="{ eth0, eth1 }" -f test.nft
  • در لیست های نقشه، استفاده از عبارات ثابت (stateful) مجاز است: جدول inet filter { map portmap { type inet_service : verdict counter element = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { type filter hook prerouting priority raw; پذیرش سیاست iif vmap { "lo" : jump 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_ok input] {-0000000100 IP زنجیره ای AB [NF_TABLES] +0000000300 زنجیره ای inet mz [nf_tables]} قلاب به جلو {-0000000225 selinux_ipv4_forward 0000000000 IP زنجیره ای ac [nf_tables]} خروجی {-0000000225 selinux_ipv4_outouth _Postroute}}
  • بلوک‌های صف به عبارات jhash، symhash و numgen اجازه می‌دهند تا بسته‌ها را در صف‌های فضای کاربر توزیع کنند. ... صف به symhash mod 65536 ... صف پرچم دور زدن به numgen inc mod 65536 ... صف به jhash oif. متا مارک mod 32 "queue" همچنین می تواند با لیست های نقشه ترکیب شود تا یک صف در فضای کاربر بر اساس کلیدهای دلخواه انتخاب شود. ... صف پرچم های دور زدن نقشه oifname { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
  • این امکان وجود دارد که متغیرهایی را که شامل یک لیست مجموعه هستند در چندین نقشه گسترش دهید. تعریف رابط ها = { eth0، eth1 } جدول ip x { زنجیره y { نوع اولویت ورودی قلاب فیلتر 0; پذیرش سیاست iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list ruleset table ip x { chain y { type filter hook input priority 0; پذیرش سیاست iifname vmap { "lo" : accept, "eth0" : drop, "eth1" : drop } }
  • ترکیب vmaps (نقشه حکم) در فواصل زمانی مجاز است: # nft add rule xy tcp dport . ip sadr 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 به ip saddr map { 10.141.11.4: 192.168.2.3: 80. . 192.168.1.2 } یا ترکیبی از محدوده IP و پورت: ... dnat به ip saddr . tcp dport map { 80 . 10.141.10.2: 10.141.10.5-8888. 8999-XNUMX }

منبع: opennet.ru

اضافه کردن نظر