| NFT(8) | NFT(8) |
نام (NAME)
nft - ابزار خط فرمان مدیریت فایروال و فیلترینگ بستههای nftables
خلاصه دستور (SYNOPSIS)
nft [ -nNscaeSupyjtT ] [ -I directory ] [ -f filename | -i | cmd ...] nft -h nft -v
توضیحات (DESCRIPTION)
دستور nft ابزار خط فرمانی است که برای راهاندازی، نگهداری و بازرسی قوانین فیلترینگ بستهها و دستهبندی آنها در هسته لینوکس، در چارچوب nftables استفاده میشود. زیرسیستم هسته لینوکس با نام nf_tables شناخته میشود و عبارت ‘nf’ مخفف Netfilter است.
گزینهها (OPTIONS)
این دستور گزینههای مختلفی را میپذیرد که برای درک بهتر مفهوم و کاربردشان در اینجا به صورت گروهبندیشده مستند شدهاند. میتوانید با اجرای nft --help اطلاعات مربوط به گزینهها را دریافت کنید.
گزینههای عمومی:
-h, --help
-v, --version
-V
گزینههای مدیریت ورودی مجموعه قوانین که نحوه بارگذاری مجموعههای قوانین را مشخص میکنند:
-f, --file filename
-D, --define name=value
-i, --interactive
-I, --includepath directory
-c, --check
-o, --optimize
قالببندی خروجی فهرست مجموعه قوانین که خروجی دستور list ruleset را تغییر میدهد:
-a, --handle
-s, --stateless
-t, --terse
-S, --service
-N, --reversedns
-u, --guid
-n, --numeric
-y, --numeric-priority
-p, --numeric-protocol
-T, --numeric-time
قالببندی خروجی دستور:
-e, --echo
-j, --json
-d, --debug level
قالبهای فایل ورودی (INPUT FILE FORMATS)
قواعد واژگانی (LEXICAL CONVENTIONS)
ورودی به صورت خط به خط تجزیه میشود. هنگامی که آخرین نویسه یک خط، درست قبل از نویسه خط جدید، یک بکاسلش بدون نقلقول (\) باشد، خط بعدی به عنوان ادامه خط در نظر گرفته میشود. چند دستور در یک خط را میتوان با استفاده از نقطه-ویرگول (;) از هم جدا کرد.
علامت هش (#) آغازگر یک توضیح (comment) است. تمام نویسههای بعدی در همان خط نادیده گرفته میشوند.
شناسهها با یک نویسه الفبایی (a-z,A-Z) شروع میشوند که پس از آن صفر یا چند نویسه الفبایی-عددی (a-z,A-Z,0-9) و نویسههای اسلش (/)، بکاسلش (\)، زیرخط (_) و نقطه (.) قرار میگیرند. شناسههایی که از نویسههای دیگری استفاده میکنند یا با یک کلمه کلیدی تداخل دارند باید داخل نقلقول دوگانه (") قرار گیرند.
فایلهای الحاقی (INCLUDE FILES)
include filename
سایر فایلها را میتوان با استفاده از دستور include الحاق کرد. شاخههایی که برای فایلهای الحاقی جستجو میشوند را میتوان با گزینه -I/--includepath مشخص کرد. میتوانید این رفتار را با پیشوند دادن ‘./’ به مسیر خود برای اجبار به الحاق فایلهای واقع در شاخه کاری جاری (یعنی مسیر نسبی) یا با / برای موقعیت فایل بیانشده به صورت مسیر مطلق بازنویسی (override) کنید.
اگر -I/--includepath مشخص نشده باشد، nft به شاخه پیشفرضی که در زمان کامپایل تعیین شده تکیه میکند. میتوانید این شاخه پیشفرض را از طریق گزینه -h/--help به دست آورید.
دستورات الحاق (include) از نمادهای وایلدکارت معمول پوسته (,?,[]) پشتیبانی میکنند. اگر از نمادهای وایلدکارت در دستور include استفاده شود، تطبیق نیافتن هیچ فایلی خطا محسوب نمیشود. این ویژگی اجازه میدهد شاخههای الحاقی بالقوه خالی برای دستوراتی مانند include "/etc/firewall/rules/" وجود داشته باشد. موارد منطبق بر اساس ترتیب ترتیبی لوکال C بارگذاری میشوند. فایلهایی که با نقطه (.) شروع میشوند با دستورات include مطابقت داده نمیشوند.
متغیرهای نمادین (SYMBOLIC VARIABLES)
define variable = expr undefine variable redefine variable = expr $variable
متغیرهای نمادین را میتوان با استفاده از دستور define تعریف کرد. ارجاع به متغیرها از نوع عبارت (expression) بوده و میتوان از آنها برای مقداردهی اولیه متغیرهای دیگر استفاده کرد. حوزه اثر (scope) یک تعریف، بلوک جاری و تمام بلوکهای درون آن است. متغیرهای نمادین را میتوان با استفاده از دستور undefine حذف کرد و با دستور redefine تغییر داد.
استفاده از متغیرهای نمادین.
define int_if1 = eth0
define int_if2 = eth1
define int_ifs = { $int_if1, $int_if2 }
redefine int_if2 = wlan0
undefine int_if2
filter input iif $int_ifs accept
خانوادههای آدرس (ADDRESS FAMILIES)
خانوادههای آدرس نوع بستههایی را که پردازش میشوند تعیین میکنند. برای هر خانواده آدرس، هسته شامل قلابهایی (hooks) در مراحل مشخصی از مسیرهای پردازش بسته است که در صورت وجود قوانینی برای این قلابها، nftables را فراخوانی میکنند.
| ip | خانواده آدرس IPv4. |
| ip6 | خانواده آدرس IPv6. |
| inet | خانواده آدرس اینترنت (IPv4/IPv6). |
| arp | خانواده آدرس ARP، که بستههای IPv4 ARP را مدیریت میکند. |
| bridge | خانواده آدرس پل (Bridge)، که بستههای عبوری از یک دستگاه پل را مدیریت میکند. |
| netdev | خانواده آدرس Netdev، که بستهها را در مسیر ورودی (ingress) و خروجی (egress) مدیریت میکند. |
تمام اشیاء nftables در فضاهای نام مختص خانواده آدرس قرار دارند، بنابراین همه شناسهها شامل یک خانواده آدرس هستند. اگر شناسهای بدون خانواده آدرس مشخص شود، خانواده ip به صورت پیشفرض استفاده میشود.
خانوادههای آدرس IPV4/IPV6/INET (IPV4/IPV6/INET ADDRESS FAMILIES)
خانوادههای آدرس IPv4/IPv6/Inet بستههای IPv4، IPv6 یا هر دو نوع را مدیریت میکنند. آنها شامل پنج قلاب در مراحل مختلف پردازش بسته در پشته شبکه هستند.
جدول ۱. قلابهای خانواده آدرس IPv4/IPv6/Inet
| قلاب (Hook) | توضیحات |
| prerouting | تمام بستههای ورودی به سیستم توسط قلاب prerouting پردازش میشوند. این قلاب قبل از فرآیند مسیریابی فراخوانی میشود و برای فیلتر کردن زودهنگام یا تغییر ویژگیهای بسته که بر مسیریابی تأثیر میگذارند استفاده میشود. |
| input | بستههای تحویل داده شده به سیستم محلی توسط قلاب input پردازش میشوند. |
| forward | بستههای هدایتشده به یک میزبان دیگر توسط قلاب forward پردازش میشوند. |
| output | بستههای ارسالشده توسط فرآیندهای محلی توسط قلاب output پردازش میشوند. |
| postrouting | تمام بستههای خروجی از سیستم توسط قلاب postrouting پردازش میشوند. |
| ingress | تمام بستههای ورودی به سیستم توسط این قلاب پردازش میشوند. این قلاب قبل از گردانندههای پروتکل لایه ۳ (و بنابراین قبل از قلاب prerouting) فراخوانی میشود و میتواند برای فیلتر کردن و اعمال سیاست (policing) استفاده شود. قلاب Ingress فقط برای خانواده Inet در دسترس است (از هسته لینوکس ۵.۱۰ به بعد). |
خانواده آدرس ARP (ARP ADDRESS FAMILY)
خانواده آدرس ARP بستههای ARP دریافتی و ارسالی توسط سیستم را مدیریت میکند. این خانواده معمولاً برای دستکاری (mangle) بستههای ARP به منظور خوشهبندی (clustering) استفاده میشود.
جدول ۲. قلابهای خانواده آدرس ARP
| قلاب (Hook) | توضیحات |
| input | بستههای تحویل داده شده به سیستم محلی توسط قلاب input پردازش میشوند. |
| output | بستههای ارسالشده توسط سیستم محلی توسط قلاب output پردازش میشوند. |
خانواده آدرس BRIDGE (BRIDGE ADDRESS FAMILY)
خانواده آدرس bridge بستههای اترنت عبوری از دستگاههای پل (bridge) را مدیریت میکند.
فهرست قلابهای پشتیبانیشده دقیقاً مشابه خانوادههای آدرس IPv4/IPv6/Inet در بالا است.
خانواده آدرس NETDEV (NETDEV ADDRESS FAMILY)
خانواده آدرس Netdev بستهها را از مسیر ورودی (ingress) و خروجی (egress) دستگاه مدیریت میکند. این خانواده به شما امکان میدهد بستههای هر نوع ethertype مانند ARP، VLAN 802.1q، VLAN 802.1ad (Q-in-Q) و همچنین بستههای IPv4 و IPv6 را فیلتر کنید.
جدول ۳. قلابهای خانواده آدرس Netdev
| قلاب (Hook) | توضیحات |
| ingress | تمام بستههای ورودی به سیستم توسط این قلاب پردازش میشوند. این قلاب پس از شنودهای شبکه (مانند tcpdump)، درست پس از tc ingress و قبل از گردانندههای پروتکل لایه ۳ فراخوانی میشود و میتواند برای فیلتر کردن زودهنگام و اعمال سیاست استفاده شود. |
| egress | تمام بستههای خروجی از سیستم توسط این قلاب پردازش میشوند. این قلاب پس از گردانندههای پروتکل لایه ۳ و قبل از tc egress فراخوانی میشود و میتواند برای فیلتر کردن دیرهنگام و اعمال سیاست استفاده شود. |
بستههای تونلشده (مانند vxlan) توسط قلابهای خانواده netdev هم به صورت کپسولزداییشده (decapsulated) و هم کپسولهشده (tunneled) پردازش میشوند. بنابراین یک بسته را میتوان هم روی شبکه روکش (overlay) و هم روی شبکه زیرساخت فیلتر کرد.
توجه داشته باشید که ترتیب netfilter و tc در ورودی (ingress) نسبت به خروجی (egress) معکوس (آینهای) است. این امر تقارن را برای NAT و سایر تغییرات بسته (mangling) تضمین میکند.
بستههای ورودی که به رابط دیگری هدایت (redirect) میشوند، تنها در صورتی در خروجی توسط netfilter پردازش میشوند که قبلاً مرحله پردازش ورودی netfilter را پشت سر گذاشته باشند. بدین ترتیب، بستههای ورودی که توسط tc تغییر مسیر داده میشوند مشمول netfilter نمیشوند. اما اگر در ورودی توسط netfilter تغییر مسیر داده شوند، مشمول آن خواهند شد. از نظر مفهومی، tc و netfilter را میتوان به صورت لایههایی در نظر گرفت که netfilter بالای tc قرار دارد: اگر بسته از لایه tc به لایه netfilter منتقل نشده باشد، در خروجی مشمول netfilter نخواهد شد.
مجموعه قوانین (RULESET)
{list | flush} ruleset [family]
کلمه کلیدی ruleset برای مشخص کردن کل مجموعه جدولها، زنجیرهها و غیره که در حال حاضر در هسته وجود دارند استفاده میشود. دستورات ruleset زیر در دسترس هستند:
| list | چاپ مجموعه قوانین در قالبی خوانا برای انسان. |
| flush | پاک کردن کل مجموعه قوانین. توجه داشته باشید که برخلاف iptables، این کار تمام جدولها و هر آنچه درون آنهاست را حذف میکند و عملاً منجر به یک مجموعه قوانین خالی میشود؛ هیچ فیلترینگ بستهای دیگر اتفاق نخواهد افتاد، بنابراین هسته هر بسته معتبری را که دریافت کند میپذیرد. |
امکان محدود کردن list و flush تنها به یک خانواده آدرس خاص وجود دارد. برای مشاهده فهرست نامهای معتبر خانوادهها، بخش “خانوادههای آدرس (ADDRESS FAMILIES)” در بالا را ببینید.
از نظر طراحی، خروجی دستور list ruleset میتواند به عنوان ورودی nft -f استفاده شود. در عمل، این قابلیت معادل iptables-save و iptables-restore در nft است.
جدولها (TABLES)
{add | create} table [family] table [{ [comment comment ;] [flags flags ;] }]
{delete | destroy | list | flush} table [family] table
list tables [family]
delete table [family] handle handle
destroy table [family] handle handle
جدولها (Tables) ظرفهایی برای زنجیرهها، مجموعهها و اشیاء دارای وضعیت هستند. آنها با خانواده آدرس و نام خود مشخص میشوند. خانواده آدرس باید یکی از موارد ip، ip6، inet، arp، bridge یا netdev باشد. خانواده آدرس inet یک خانواده ساختگی (dummy) است که برای ایجاد جدولهای ترکیبی IPv4/IPv6 استفاده میشود. کلمه کلیدی meta expression nfproto میتواند برای بررسی اینکه بسته در زمینه کدام خانواده (ipv4 یا ipv6) پردازش میشود استفاده شود. هنگامی که هیچ خانواده آدرسی مشخص نشده باشد، بهطور پیشفرض از ip استفاده میشود. تنها تفاوت بین add و create این است که دستور اول در صورتی که جدول مشخصشده از قبل وجود داشته باشد خطایی بازنمیگرداند، در حالی که create یک خطا بازمیگرداند.
جدول 4. فلگهای جدول (Table flags)
| Flag | توضیحات |
| dormant | جدول دیگر ارزیابی نمیشود (زنجیرههای پایه ثبتنشده / unregistered میشوند). |
| owner | جدول تحت مالکیت فرآیند ایجادکننده است. |
| persist | جدول باید پس از پایان فرآیند مالک نیز باقی بماند. |
ایجاد یک
جدول با فلگ
owner سایر
فرآیندها
را از
دستکاری آن
یا
محتویاتش
منع میکند.
بهطور
پیشفرض،
هنگامی که
فرآیند
خاتمه
یابد، جدول
حذف خواهد
شد. تنظیم
فلگ persist از
این اتفاق
جلوگیری
میکند و
جدول یتیم
حاصل یک
مالک جدید
را
میپذیرد؛
به عنوان
مثال یک
دیمن در حال
راهاندازی
مجدد که
جدول را
نگهداری
میکند.
افزودن، تغییر و حذف جدول.
# start nft in interactive mode
nft --interactive
# create a new table.
create table inet mytable
# add a new base chain: get input packets
add chain inet mytable myin { type filter hook input priority filter; }
# add a single counter to the chain
add rule inet mytable myin counter
# disable the table temporarily -- rules are not evaluated anymore
add table inet mytable { flags dormant; }
# make table active again:
add table inet mytable
| add | افزودن یک جدول جدید برای خانواده دادهشده با نام مشخصشده. |
| delete | حذف جدول مشخصشده. |
| destroy | حذف جدول مشخصشده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمیشود. |
| list | فهرست کردن تمام زنجیرهها و قوانین جدول مشخصشده. |
| flush | پاکسازی تمام زنجیرهها و قوانین جدول مشخصشده. |
زنجیرهها (CHAINS)
{add | create} chain [family] table chain [{ type type hook hook [DEVICE] priority priority ; [policy policy ;] [comment comment ;] }]
{delete | destroy | list | flush} chain [family] table chain
list chains [family] [table]
delete chain [family] table handle handle
destroy chain [family] table handle handle
rename chain [family] table chain newname
DEVICE := {device DEVICE_NAME | devices = { DEVICE_LIST }}
DEVICE_LIST := DEVICE_NAME [, DEVICE_LIST]
DEVICE_NAME := string | string*
زنجیرهها ظرفهایی برای قوانین هستند. آنها در دو نوع وجود دارند: زنجیرههای پایه (base chains) و زنجیرههای معمولی (regular chains). یک زنجیره پایه، نقطه ورودی بستهها از پشته شبکه (networking stack) است؛ یک زنجیره معمولی میتواند به عنوان هدف پرش استفاده شود و برای سازماندهی بهتر قوانین به کار میرود. زنجیرههای معمولی میتوانند ناشناس باشند؛ برای جزئیات به مثالهای VERDICT STATEMENT مراجعه کنید.
| add | افزودن یک زنجیره جدید در جدول مشخصشده. هنگامی که مقادیر hook و priority مشخص شده باشند، زنجیره به عنوان یک زنجیره پایه ایجاد شده و به پشته شبکه متصل میشود. |
| create | مشابه دستور add است، اما اگر زنجیره از قبل وجود داشته باشد خطایی بازمیگرداند. |
| delete | حذف زنجیره مشخصشده. زنجیره نباید شامل هیچ قانونی باشد یا به عنوان هدف پرش استفاده شود. |
| destroy | حذف زنجیره مشخصشده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمیشود. زنجیره نباید شامل هیچ قانونی باشد یا به عنوان هدف پرش استفاده شود. |
| rename | تغییر نام زنجیره مشخصشده. |
| list | فهرست کردن تمام قوانین زنجیره مشخصشده. |
| flush | پاکسازی تمام قوانین زنجیره مشخصشده. |
برای زنجیرههای پایه، پارامترهای type، hook و priority الزامی هستند.
جدول 5. انواع زنجیرههای پشتیبانیشده (Supported chain types)
| Type | Families | Hooks | توضیحات |
| filter | all | all | نوع زنجیره استاندارد برای استفاده در مواقع تردید. |
| nat | ip, ip6, inet | prerouting, input, output, postrouting | زنجیرههایی از این نوع، ترجمه آدرس بومی (Native Address Translation) را بر اساس مدخلهای conntrack انجام میدهند. تنها نخستین بسته از یک اتصال عملاً از این زنجیره عبور میکند - قوانین آن معمولاً جزئیات مدخل conntrack ایجادشده را مشخص میکنند (به عنوان مثال گزارههای NAT). |
| route | ip, ip6, inet | output | اگر بستهای از زنجیرهای از این نوع عبور کرده باشد و در آستانه پذیرش (accept) باشد، در صورتی که بخشهای مرتبط سرآیند IP تغییر کرده باشند، یک جستجوی مسیر (route lookup) جدید انجام میشود. این کار امکان پیادهسازی مواردی مانند انتخابکنندههای مسیریابی مبتنی بر پالیسی (policy routing) را در nftables فراهم میکند. |
جدا از موارد خاص نشان داده شده در بالا (به عنوان مثال عدم پشتیبانی نوع nat از قلاب forward یا پشتیبانی نوع route تنها از قلاب output)، سه نکته قابل توجه دیگر نیز وجود دارد:
پارامتر device نام یک رابط شبکه را به عنوان یک رشته میپذیرد، و هنگام افزودن یک زنجیره پایه که ترافیک را روی قلابهای ingress یا egress فیلتر میکند الزامی است. هر زنجیره ingress یا egress تنها ترافیک رابط مشخصشده در پارامتر device را فیلتر خواهد کرد. همچنین میتوان با استفاده از پارامتر devices از همان زنجیره پایه برای چندین دستگاه استفاده کرد.
در هستههای جدیدتر، با تعیین پسوند ستاره (*)، پشتیبانی اولیهای از نویسههای عام (wildcards) در DEVICE_NAME نیز وجود دارد. زنجیره روی تمام رابطهایی که با پیشوند دادهشده مطابقت دارند اعمال خواهد شد. از دستور list hooks برای مشاهده وضعیت فعلی استفاده کنید.
پارامتر priority یک مقدار عدد صحیح علامتدار یا یک نام اولویت استاندارد را میپذیرد که ترتیب پیمایش زنجیرههای دارای مقدار hook یکسان را (صرفنظر از جدولی که به آن تعلق دارند) مشخص میکند. ترتیب صعودی است: برای هر قلاب، زنجیرههای با مقادیر اولویت کمتر قبل از زنجیرههای با مقادیر بالاتر ارزیابی میشوند. ترتیب ارزیابی زنجیرههای با اولویت یکسان نامشخص است.
در زنجیرههای از نوع nat، حد انحصاری پایینی معادل -200 برای مقادیر priority وجود دارد، زیرا conntrack در این اولویت قلاب میشود و NAT به آن نیاز دارد.
مقادیر اولویت استاندارد را میتوان با نامهایی که بهخاطرسپاری آنها آسان است جایگزین کرد. همه نامها در هر خانواده با هر قلاب کاربرد ندارند (به ماتریسهای سازگاری زیر مراجعه کنید) اما مقدار عددی آنها همچنان میتواند برای اولویتبندی زنجیرهها استفاده شود.
این نامها و مقادیر بر اساس اولویتهایی که xtables هنگام ثبت زنجیرههای پیشفرض خود استفاده میکند، تعریف شده و در دسترس قرار گرفتهاند.
بیشتر خانوادهها از مقادیر یکسانی استفاده میکنند، اما bridge از مقادیر متفاوتی نسبت به بقیه استفاده میکند. برای شرح مقادیر و سازگاری به جدولهای زیر مراجعه کنید.
جدول 6. ماتریس سازگاری نامهای اولویت استاندارد، خانواده و قلاب (Standard priority names, family and hook compatibility matrix)
| Name | Value | Families | Hooks |
| raw | -300 | ip, ip6, inet | all |
| mangle | -150 | ip, ip6, inet | all |
| dstnat | -100 | ip, ip6, inet | prerouting |
| filter | 0 | ip, ip6, inet, arp, netdev | all |
| security | 50 | ip, ip6, inet | all |
| srcnat | 100 | ip, ip6, inet | postrouting |
جدول 7. نامهای اولویت استاندارد و سازگاری قلاب برای خانواده bridge (Standard priority names and hook compatibility for the bridge family)
| Name | Value | Hooks |
| dstnat | -300 | prerouting |
| filter | -200 | all |
| out | 100 | output |
| srcnat | 300 | postrouting |
عبارات محاسباتی پایهای (جمع و تفریق) را نیز میتوان با این نامهای استاندارد برای تسهیل اولویتبندی نسبی استفاده کرد، به عنوان مثال mangle - 5 نشاندهنده -155 است. مقادیر تا زمانی که فاصله آنها از مقدار استاندارد بیشتر از ۱۰ نباشد، به همین صورت چاپ خواهند شد.
زنجیرههای پایه همچنین امکان تعیین policy (خطمشی) زنجیره را فراهم میکنند، یعنی اینکه چه اتفاقی برای بستههایی که صراحتاً در قوانین موجود پذیرفته یا رد نشدهاند رخ دهد. مقادیر خطمشی پشتیبانیشده accept (که پیشفرض است) یا drop هستند.
قوانین (RULES)
{add | insert} rule [family] table chain [handle handle | index index] statement ... [comment comment]
replace rule [family] table chain handle handle statement ... [comment comment]
{delete | reset} rule [family] table chain handle handle
destroy rule [family] table chain handle handle
reset rules [family] [table [chain]]
قوانین به زنجیرهها در جدول دادهشده اضافه میشوند. اگر خانواده مشخص نشده باشد، از خانواده ip استفاده میشود. قوانین بر اساس مجموعهای از قواعد دستوری از دو نوع جزء ساخته میشوند: عبارتها (expressions) و گزارهها (statements).
دستورات add و insert از یک مشخصکننده مکان اختیاری پشتیبانی میکنند، که یا یک handle (دسته) است یا index (اندیس، شروع از صفر) یک قانون موجود. در سطح داخلی، مکانهای قوانین همیشه با handle شناسایی میشوند و تبدیل از index در فضای کاربری انجام میگیرد. این موضوع در صورتی که پس از انجام تبدیل، تغییری همزمان در مجموعه قوانین رخ دهد، دو پیامد احتمالی دارد: اگر قانونی قبل از قانون ارجاعشده درج یا حذف شده باشد، اندیس مؤثر قانون ممکن است تغییر کند. اگر قانون ارجاعشده حذف شده باشد، دستور توسط هسته رد میشود دقیقاً مانند اینکه یک handle نامعتبر داده شده باشد.
یک comment یک کلمه منفرد یا یک رشته چندکلمهای درون علامتهای نقلقول دوتایی (") است که میتواند برای یادداشتگذاری درباره قانون اصلی استفاده شود. نکته: اگر از bash برای افزودن قوانین استفاده میکنید، باید علامتهای نقلقول را اسکیپ کنید، به عنوان مثال \"enable ssh for servers\".
| add | افزودن یک قانون جدید که توسط فهرستی از گزارهها توصیف شده است. قانون به انتهای زنجیره دادهشده اضافه میشود مگر اینکه مکانی مشخص شده باشد، که در این صورت قانون پس از قانون مشخصشده درج میگردد. |
| insert | همانند add است با این تفاوت که قانون در ابتدای زنجیره یا قبل از قانون مشخصشده درج میشود. |
| replace | مشابه add است، اما این قانون جایگزین قانون مشخصشده میشود. |
| delete | حذف قانون مشخصشده. |
| destroy | حذف قانون مشخصشده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمیشود. |
| reset | بازنشانی وضعیت موجود در قانون، به عنوان مثال مقادیر گزارههای counter و quota. |
افزودن یک قانون به زنجیره خروجی (output) جدول ip.
nft add rule filter output ip daddr 192.168.0.0/24 accept # 'ip filter' is assumed # same command, slightly more verbose nft add rule ip filter output ip daddr 192.168.0.0/24 accept
حذف قانون از جدول inet.
# nft -a list ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy accept;
ct state established,related accept # handle 4
ip saddr 10.1.1.1 tcp dport ssh accept # handle 5
...
# delete the rule with handle 5
nft delete rule inet filter input handle 5
ارزیابی کلی مجموعه قوانین (OVERALL EVALUATION OF THE RULESET)
این یک خلاصه از نحوه ارزیابی مجموعه قوانین (ruleset) است.
مجموعهها (SETS)
ابزار nftables دو نوع مفهوم مجموعه ارائه میدهد. مجموعههای بینام (Anonymous sets) مجموعههایی هستند که نام مشخصی ندارند. اعضای مجموعه هنگام ایجاد قانونی که مجموعه در آن استفاده میشود، درون آکولاد قرار گرفته و عناصر با کاما از هم جدا میشوند. با حذف آن قانون، مجموعه نیز حذف میشود. آنها قابل بهروزرسانی نیستند؛ به این معنی که پس از اعلان یک مجموعه بینام، دیگر نمیتوان آن را تغییر داد مگر با حذف یا تغییر قانونی که از آن مجموعه بینام استفاده میکند.
استفاده از مجموعههای بینام برای پذیرش زیرشبکهها و درگاههای خاص.
nft add rule filter input ip saddr { 10.0.0.0/8, 192.168.0.0/16 } tcp dport { 22, 443 } accept
مجموعههای نامدار (Named sets) مجموعههایی هستند که ابتدا باید تعریف شوند تا بتوان در قوانین به آنها ارجاع داد. برعکس مجموعههای بینام، عناصر را میتوان در هر زمان به یک مجموعه نامدار اضافه یا از آن حذف کرد. در قوانین با استفاده از پیشوند @ قبل از نام مجموعه به آن ارجاع داده میشود.
استفاده از مجموعههای نامدار برای پذیرش آدرسها و درگاهها.
nft add rule filter input ip saddr @allowed_hosts tcp dport @allowed_ports accept
مجموعههای allowed_hosts و allowed_ports ابتدا باید ایجاد شوند. بخش بعدی نحوه نحو (syntax) مجموعه nft را با جزئیات بیشتری شرح میدهد.
add set [family] table set { type type | typeof expression ; [flags flags ;] [timeout timeout ;] [gc-interval gc-interval ;] [elements = { element[, ...] } ;] [size size ;] [comment comment ;] [policy 'policy ;] [auto-merge ;] }
{delete | destroy | list | flush | reset } set [family] table set
list sets [family] [table]
delete set [family] table handle handle
{add | delete | destroy } element [family] table set { element[, ...] }
مجموعهها نگهدارندههای عنصری از یک نوع داده تعریفشده توسط کاربر هستند؛ آنها با یک نام تعریفشده توسط کاربر به طور یکتا شناسایی شده و به جدولها متصل میشوند. رفتار آنها را میتوان با فلگهایی که در زمان ایجاد مجموعه مشخص میشوند، تنظیم کرد.
برای جزئیات بیشتر به بخش فلگهای مجموعه و نگاشت در زیر مراجعه کنید.
| add | افزودن یک مجموعه جدید در جدول مشخصشده. برای اطلاعات بیشتر درباره نحوه تعیین ویژگیهای یک مجموعه، به جدول مشخصات مجموعه در زیر مراجعه کنید. |
| delete | حذف مجموعه مشخصشده. |
| destroy | حذف مجموعه مشخصشده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمیشود. |
| list | نمایش عناصر موجود در مجموعه مشخصشده. |
| flush | حذف تمامی عناصر از مجموعه مشخصشده. |
| reset | بازنشانی وضعیت در تمامی عناصر موجود، مانند مقادیر عبارتهای شمارنده (counter) و سهمیه (quota). |
Table 8. مشخصات مجموعه (Set specifications)
| کلیدواژه (Keyword) | توضیحات (Description) | نوع (Type) |
| type | نوع داده عناصر مجموعه | string: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark |
| typeof | نوع داده عنصر مجموعه | عبارت برای استخراج نوع داده از آن |
| flags | فلگهای مجموعه | string: constant, dynamic, interval, timeout. برای توصیف ویژگیهای مجموعه استفاده میشود. |
| timeout | مدت زمانی که یک عنصر در مجموعه باقی میماند؛ در صورتی که مجموعه از مسیر بسته (مجموعه قوانین) پر شود، الزامی است | رشته، عدد دهدهی به همراه واحد. واحدها عبارتند از: d, h, m, s |
| gc-interval | فاصله زمانی پاکسازی زباله (garbage collection)؛ تنها زمانی در دسترس است که timeout یا فلگ timeout فعال باشد | رشته، عدد دهدهی به همراه واحد. واحدها عبارتند از: d, h, m, s |
| elements | عناصر موجود در مجموعه | نوع داده مجموعه |
| size | حداکثر تعداد عناصر در مجموعه؛ در صورتی که مجموعه از مسیر بسته (مجموعه قوانین) پر شود، الزامی است | عدد صحیح بدون علامت (۶۴ بیتی) |
| policy | خطمشی مجموعه | string: performance [پیشفرض], memory |
| auto-merge | ادغام خودکار عناصر مجاور/همپوشان مجموعه (تنها برای مجموعههای بازهای) |
گزینه gc-interval روی مهلت زمانی (timeout) عنصر تأثیری ندارد، اما بر آزادسازی حافظه تأثیر میگذارد. یک مجموعه بزرگ که به ندرت عناصری در آن منقضی میشوند میتواند از بازه پاکسازی زباله بالاتر (با تکرار کمتر) برای صرفهجویی در زمان پردازنده استفاده کند، در حالی که مجموعههایی با بهروزرسانیهای فراوان و عناصر کوتاهعمر از بازه کمتر بهرهمند خواهند شد. بازههای کمتر تضمین میکنند که مجموعه زیر حداکثر اندازه خود باقی بماند. از نظر داخلی، یک مدخل منقضیشده تا زمانی که توسط بازیافتکننده حافظه (garbage collector) حذف شود باقی میماند، که این فرآیند همچنین تعداد عناصر مجموعه را کاهش میدهد. این همچنین بدان معناست که در صورت تنظیم بیش از حد بزرگ gc-interval، ممکن است مجموعهای نتواند عناصر بیشتری را بپذیرد، حتی اگر همه عناصر منقضی شده باشند.
گزینه size حد بالای تعداد عناصری را که مجموعه میتواند پشتیبانی کند، تعریف میکند. برای مجموعههایی که از طریق مجموعه قوانین با کلیدواژههای add و update به آنها اضافه میشود الزامی است. ارائه کلیدواژه size برای مجموعههایی که فقط از طریق nft add element به آنها اضافه میشود امکان انتخاب پیادهسازی فشردهتر (با صرفهجویی در حافظه) را فراهم میکند، اما الزامی نیست.
کلیدواژه اختیاری policy میتواند برای درخواست پیادهسازی بهینهتر از نظر حافظه برای مجموعه استفاده شود.
گزینه auto-merge به بخش کاربری nftables دستور میدهد تا محدودههای مجاور و همپوشان را با یکدیگر ادغام کند. مثال: هنگامی که مجموعه شامل محدوده 1.2.3.1-1.2.3.4 باشد، اضافه کردن عنصر 1.2.3.2 هیچ تأثیری ندارد. اضافه کردن 1.2.3.5 محدوده موجود را تغییر میدهد تا 1.2.3.1-1.2.3.5 را پوشش دهد. بدون این فلگ، 1.2.3.2 نمیتواند اضافه شود و 1.2.3.5 به عنوان یک مدخل جدید درج میشود.
برابری یک مقدار با یک مجموعه زمانی برقرار است که مقدار دقیقاً با یک مقدار در مجموعه مطابقت داشته باشد (که برای بازهها به این معنی است که در هر یک از آنها قرار داشته باشد). برای تفاوتهای ظریف بین بررسیهای برابری مجموعهها و ماسکهای بیتی (bitmasks) که از نظر نحوی شبیه به نظر میرسند، به بخش “نوع ماسک بیتی (BITMASK TYPE)” مراجعه کنید.
نگاشتها (MAPS)
add map [family] table map { type type | typeof expression [flags flags ;] [elements = { element[, ...] } ;] [size size ;] [comment comment ;] [policy 'policy ;] }
{delete | destroy | list | flush | reset } map [family] table map
list maps [family] [table]
نگاشتها (Maps) دادهها را بر اساس یک کلید خاص که به عنوان ورودی استفاده میشود، ذخیره میکنند. آنها با یک نام تعریفشده توسط کاربر به طور یکتا شناسایی شده و به جدولها متصل میشوند.
| add | افزودن یک نگاشت جدید در جدول مشخصشده. |
| delete | حذف نگاشت مشخصشده. |
| destroy | حذف نگاشت مشخصشده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمیشود. |
| list | نمایش عناصر موجود در نگاشت مشخصشده. |
| flush | حذف تمامی عناصر از نگاشت مشخصشده. |
| reset | بازنشانی وضعیت در تمامی عناصر موجود، مانند مقادیر عبارتهای شمارنده (counter) و سهمیه (quota). |
Table 9. مشخصات نگاشت (Map specifications)
| کلیدواژه (Keyword) | توضیحات (Description) | نوع (Type) |
| type | نوع داده عناصر نگاشت | string: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark, counter, quota. شمارنده (counter) و سهمیه (quota) نمیتوانند به عنوان کلید استفاده شوند |
| typeof | نوع داده عنصر مجموعه/نگاشت | عبارت برای استخراج نوع داده از آن |
| flags | فلگهای نگاشت | رشته، مشابه فلگهای مجموعه |
| elements | عناصر موجود در نگاشت | نوع داده نگاشت |
| size | حداکثر تعداد عناصر در نگاشت | عدد صحیح بدون علامت (۶۴ بیتی) |
| policy | خطمشی نگاشت | string: performance [پیشفرض], memory |
کاربران میتوانند ویژگیها/قابلیتهایی را که مجموعه/نگاشت باید پشتیبانی کند مشخص کنند. این به هسته اجازه میدهد تا یک نمایش داخلی بهینه را انتخاب کند. اگر یک فلگ لازم مشخص نشده باشد، مجموعه قوانین ممکن است همچنان کار کند، زیرا nftables در صورت امکان استنتاج از مجموعه قوانین، قابلیتها را به طور خودکار فعال میکند. با این حال ممکن است این برای همه موارد کارساز نباشد، بنابراین توصیه میشود تمام قابلیتهای مورد نیاز در تعریف مجموعه/نگاشت به صورت دستی مشخص شوند. همچنین برخی از قابلیتها ناسازگار با یکدیگر (mutually exclusive) هستند؛ به عنوان مثال، امکانپذیر نیست که یک مجموعه هم از بازهها و هم از درج از مسیر بسته پشتیبانی کند.
Table 10. فلگهای مجموعه و نگاشت (Set and Map flags)
| فلگ (Flag) | توضیحات (Description) |
| constant | محتویات مجموعه پس از ایجاد هرگز تغییر نخواهد کرد |
| dynamic | مجموعه باید از بهروزرسانیها از مسیر بسته با کلیدواژههای add، update یا delete پشتیبانی کند. |
| interval | مجموعه باید بتواند بازهها (محدودهها) را ذخیره کند. نمیتواند با فلگ dynamic ترکیب شود. |
| timeout | مجموعه باید از مهلت زمانی عناصر (حذف خودکار عناصر پس از انقضا) پشتیبانی کند. |
عناصر (ELEMENTS)
{add | create | delete | destroy | get | reset } element [family] table set { ELEMENT[, ...] }
ELEMENT := key_expression OPTIONS [: value_expression]
OPTIONS := [timeout TIMESPEC] [expires TIMESPEC] [comment string]
TIMESPEC := [numd][numh][numm][num[s]]
دستورات مربوط به عناصر امکان تغییر محتوای مجموعهها و نگاشتهای نامدار را فراهم میکنند. key_expression معمولاً مقداری مطابق با نوع مجموعه است. استفاده از value_expression در مجموعهها مجاز نیست اما هنگام افزودن به نگاشتها الزامی است، جایی که با بخش داده در تعریف نوع آن مطابقت دارد. هنگام حذف از نگاشتها، ممکن است مشخص شود اما اختیاری است زیرا key_expression عنصر را به طور یکتا مشخص میکند.
دستور create مشابه add است، با این استثنا که هیچیک از عناصر فهرستشده نباید از قبل وجود داشته باشند.
دستور get برای بررسی اینکه آیا یک عنصر در یک مجموعه وجود دارد یا خیر مفید است، که ممکن است در مجموعههای بسیار بزرگ و/یا بازهای ساده نباشد. در مورد اخیر، بازه دربرگیرنده به جای خود عنصر بازگردانده میشود.
دستور reset وضعیت متصل به عنصر(های) دادهشده را بازنشانی میکند، مانند مقادیر عبارتهای شمارنده (counter) و سهمیه (quota).
Table 11. گزینههای عنصر (Element options)
| گزینه (Option) | توضیحات (Description) |
| timeout | مقدار مهلت زمانی برای مجموعهها/نگاشتهای دارای فلگ timeout |
| expires | زمان باقیمانده تا انقضای عنصر دادهشده؛ فقط برای تکثیر مجموعه قوانین (ruleset replication) کاربرد دارد |
| comment | فیلد توضیحات (comment) برای هر عنصر |
جدولهای جریان (FLOWTABLES)
{add | create} flowtable [family] table flowtable { hook hook priority priority ; devices = { DEVICE_LIST } ; }
list flowtables [family] [table]
{delete | destroy | list} flowtable [family] table flowtable
delete flowtable [family] table handle handle
DEVICE_LIST := DEVICE_NAME [, DEVICE_LIST]
DEVICE_NAME := string | string*
جدولهای جریان (Flowtables) به شما این امکان را میدهند که هدایت و فوروارد بستهها را در نرمافزار شتابدهی کنید. مدخلهای جدولهای جریان از طریق یک چندتایی (tuple) نمایش داده میشوند که متشکل از رابط ورودی، آدرس مبدأ و مقصد، درگاه مبدأ و مقصد؛ و پروتکلهای لایه ۳/۴ است. هر مدخل همچنین رابط مقصد و آدرس درگاه (gateway) را کَش میکند – برای بهروزرسانی آدرس لایه پیوند مقصد – تا بستهها را هدایت کند. فیلدهای ttl و hoplimit نیز کاهش مییابند. از این رو، جدولهای جریان یک مسیر جایگزین فراهم میکنند که به بستهها اجازه میدهد مسیر کلاسیک فورواردینگ را دور بزنند. جدولهای جریان در قلاب ingress قرار دارند که قبل از قلاب prerouting واقع شده است. شما میتوانید جریانهایی را که میخواهید تخلیه بار (offload) کنید از طریق عبارت flow از زنجیره forward انتخاب نمایید. جدولهای جریان بر اساس خانواده آدرس و نام آنها شناسایی میشوند. خانواده آدرس باید یکی از ip، ip6 یا inet باشد. خانواده آدرس inet یک خانواده ساختگی است که برای ایجاد جدولهای ترکیبی IPv4/IPv6 استفاده میشود. هنگامی که هیچ خانواده آدرسی مشخص نشده باشد، به طور پیشفرض ip استفاده میشود.
گزینه priority میتواند یک عدد صحیح علامتدار یا filter باشد که نشاندهنده ۰ است. جمع و تفریق میتواند برای تنظیم اولویت نسبی استفاده شود، به عنوان مثال filter + 5 برابر با ۵ است.
با هستههای جدیدتر، با تعیین یک پسوند ستاره پشتیبانی اولیهای برای نویسههای عام (wildcards) در DEVICE_LIST وجود دارد. جدول جریان برای تمامی رابطهای منطبق با پیشوند دادهشده اعمال خواهد شد. از دستور list hooks برای مشاهده وضعیت فعلی استفاده کنید.
| add | افزودن یک جدول جریان جدید برای خانواده دادهشده با نام دادهشده. |
| delete | حذف جدول جریان مشخصشده. |
| destroy | حذف جدول جریان مشخصشده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمیشود. |
| list | فهرست کردن تمامی جدولهای جریان. |
اشیاء وضعیتدار (STATEFUL OBJECTS)
{add | delete | destroy | list | reset} counter [family] table object
{add | delete | destroy | list | reset} quota [family] table object
{add | delete | destroy | list} limit [family] table object
delete counter [family] table handle handle
delete quota [family] table handle handle
delete limit [family] table handle handle
destroy counter [family] table handle handle
destroy quota [family] table handle handle
destroy limit [family] table handle handle
list { counters | limits | quotas } [family] [table]
reset { counters | quotas } [family] [table]
اشیاء وضعیتدار (Stateful objects) به جدولها متصل هستند و با یک نام یکتا شناسایی میشوند. آنها اطلاعات وضعیتدار را از قواعد گروهبندی میکنند؛ برای ارجاع به آنها در قواعد از کلمات کلیدی "type name" استفاده میشود، مانند "counter name".
| add | افزودن یک شیء وضعیتدار جدید در جدول مشخصشده. |
| delete | حذف شیء مشخصشده. |
| destroy | حذف شیء مشخصشده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمیشود. |
| list | نمایش اطلاعات وضعیتداری که شیء نگهداری میکند. |
| reset | فهرست کردن و بازنشانی شیء وضعیتدار (List-and-reset). |
CT HELPER
add ct helper [family] table name { type type protocol protocol ; [l3proto family ;] }
delete ct helper [family] table name
list ct helpers
قابلیت Ct helper برای تعریف هلپرهای ردیابی اتصال (connection tracking helpers) استفاده میشود که سپس میتوان آنها را در ترکیب با عبارت ct helper set به کار برد. گزینههای type و protocol اجباری هستند؛ l3proto بهطور پیشفرض از خانواده جدول مشتق میشود، یعنی در جدول inet هسته تلاش میکند هر دو بکاند هلپر ipv4 و ipv6 را (در صورت پشتیبانی هسته) بارگذاری کند.
جدول 12. مشخصات conntrack helper
| کلمه کلیدی | توضیحات | نوع |
| type | نام نوع هلپر | رشته داخل کوتیشن (مانند "ftp") |
| protocol | پروتکل لایه ۴ هلپر | رشته (مانند ip) |
| l3proto | پروتکل لایه ۳ هلپر | خانواده آدرس (مانند ip) |
| comment | فیلد توضیح اختصاصی ct helper | رشته |
تعریف و تخصیص هلپر ftp.
Unlike iptables, helper assignment needs to be performed after the conntrack
lookup has completed, for example with the default 0 hook priority.
table inet myhelpers {
ct helper ftp-standard {
type "ftp" protocol tcp
}
chain prerouting {
type filter hook prerouting priority filter;
tcp dport 21 ct helper set "ftp-standard"
}
}
CT TIMEOUT
add ct timeout [family] table name { protocol protocol ; policy = { state: value [, ...] } ; [l3proto family ;] }
delete ct timeout [family] table name
list ct timeouts
قابلیت Ct timeout برای بهروزرسانی مقادیر زمان انقضا (timeout) ردیابی اتصال استفاده میشود. سیاستهای Timeout با استفاده از عبارت ct timeout set تخصیص داده میشوند. گزینههای protocol و policy اجباری هستند؛ l3proto بهطور پیشفرض از خانواده جدول مشتق میشود.
جدول 13. مشخصات conntrack timeout
| کلمه کلیدی | توضیحات | نوع |
| protocol | پروتکل لایه ۴ شیء timeout | رشته (مانند ip) |
| state | نام وضعیت اتصال | رشته (مانند "established") |
| value | مقدار زمان انتظار برای وضعیت اتصال | عدد صحیح بدون علامت |
| l3proto | پروتکل لایه ۳ شیء timeout | خانواده آدرس (مانند ip) |
| comment | فیلد توضیح اختصاصی ct timeout | رشته |
نامهای وضعیت اتصال tcp که میتوانند مقدار timeout مشخصی داشته باشند عبارتند از:
close، close_wait، established، fin_wait، last_ack، retrans، syn_recv، syn_sent، time_wait و unack.
میتوانید از sysctl -a |grep net.netfilter.nf_conntrack_tcp_timeout_ برای مشاهده و تغییر مقادیر پیشفرض سراسری سیستم استفاده کنید. عبارت ct timeout امکان پیکربندی تنظیمات مختص جریان را بدون تغییر زمانهای انتظار سراسری فراهم میکند.
به عنوان مثال، پورت tcp شماره 53 میتواند تنظیمات بسیار کمتری نسبت به سایر ترافیکها داشته باشد.
نامهای وضعیت udp که میتوانند مقدار timeout مشخصی داشته باشند عبارتند از replied و unreplied.
تعریف و تخصیص سیاست ct timeout.
table ip filter {
ct timeout customtimeout {
protocol tcp;
l3proto ip
policy = { established: 2m, close: 20s }
}
chain output {
type filter hook output priority filter; policy accept;
ct timeout set "customtimeout"
}
}
آزمایش سیاست timeout بهروزرسانیشده.
% conntrack -E It should display: [UPDATE] tcp 6 120 ESTABLISHED src=172.16.19.128 dst=172.16.19.1 sport=22 dport=41360 [UNREPLIED] src=172.16.19.1 dst=172.16.19.128 sport=41360 dport=22
CT EXPECTATION
add ct expectation [family] table name { protocol protocol ; dport dport ; timeout timeout ; size size ; [l3proto family ;] }
delete ct expectation [family] table name
list ct expectations
قابلیت Ct expectation برای ایجاد انتظارات اتصال (connection expectations) استفاده میشود. انتظارات با استفاده از عبارت ct expectation set تخصیص داده میشوند. گزینههای protocol، dport، timeout و size اجباری هستند؛ l3proto بهطور پیشفرض از خانواده جدول مشتق میشود.
جدول 14. مشخصات conntrack expectation
| کلمه کلیدی | توضیحات | نوع |
| protocol | پروتکل لایه ۴ شیء expectation | رشته (مانند ip) |
| dport | پورت مقصد اتصال مورد انتظار | عدد صحیح بدون علامت |
| timeout | مقدار زمان انتظار برای expectation | عدد صحیح بدون علامت |
| size | مقدار اندازه برای expectation | عدد صحیح بدون علامت |
| l3proto | پروتکل لایه ۳ شیء expectation | خانواده آدرس (مانند ip) |
| comment | فیلد توضیح اختصاصی ct expectation | رشته |
تعریف و تخصیص سیاست ct expectation.
table ip filter {
ct expectation expect {
protocol udp
dport 9876
timeout 2m
size 8
l3proto ip
}
chain input {
type filter hook input priority filter; policy accept;
ct expectation set "expect"
}
}
COUNTER
add counter [family] table name [{ [ packets packets bytes bytes ; ] [ comment comment ; }]
delete counter [family] table name
list counters
جدول 15. مشخصات شمارنده (Counter specifications)
| کلمه کلیدی | توضیحات | نوع |
| packets | تعداد اولیه بستهها | عدد صحیح بدون علامت (۶۴ بیتی) |
| bytes | تعداد اولیه بایتها | عدد صحیح بدون علامت (۶۴ بیتی) |
| comment | فیلد توضیح اختصاصی شمارنده | رشته |
استفاده از شمارندههای نامگذاریشده.
nft add counter filter http nft add rule filter input tcp dport 80 counter name \"http\"
استفاده از شمارندههای نامگذاریشده با نقشهها (maps).
nft add counter filter http
nft add counter filter https
nft add rule filter input counter name tcp dport map { 80 : \"http\", 443 : \"https\" }
QUOTA
add quota [family] table name { [over|until] bytes BYTE_UNIT [ used bytes BYTE_UNIT ] ; [ comment comment ; ] }
BYTE_UNIT := bytes | kbytes | mbytes
delete quota [family] table name
list quotas
جدول 16. مشخصات سهمیه (Quota specifications)
| کلمه کلیدی | توضیحات | نوع |
| quota | محدودیت سهمیه، که به عنوان نام quota استفاده میشود | دو آرگومان، عدد صحیح بدون علامت (۶۴ بیتی) و رشته: bytes، kbytes، mbytes. عبارات "over" و "until" قبل از این آرگومانها قرار میگیرند |
| used | مقدار اولیه سهمیه مصرفشده | دو آرگومان، عدد صحیح بدون علامت (۶۴ بیتی) و رشته: bytes، kbytes، mbytes |
| comment | فیلد توضیح اختصاصی quota | رشته |
استفاده از سهمیههای نامگذاریشده.
nft add quota filter user123 { over 20 mbytes }
nft add rule filter input ip saddr 192.168.10.123 quota name \"user123\"
استفاده از سهمیههای نامگذاریشده با نقشهها (maps).
nft add quota filter user123 { over 20 mbytes }
nft add quota filter user124 { over 20 mbytes }
nft add rule filter input quota name ip saddr map { 192.168.10.123 : \"user123\", 192.168.10.124 : \"user124\" }
عبارتها (EXPRESSIONS)
عبارتها بیانگر مقادیر هستند؛ خواه مقادیر ثابت مانند آدرسهای شبکه، شماره پورتها و غیره باشند، یا دادههای جمعآوریشده از بسته در طول ارزیابی مجموعه قواعد (ruleset). عبارتها را میتوان با استفاده از عبارتهای دودویی، منطقی، رابطهای و انواع دیگر عبارتها ترکیب کرد تا عبارتهای پیچیده یا رابطهای (تطبیق / match) تشکیل شوند. آنها همچنین به عنوان آرگومان برای انواع خاصی از عملیات مانند NAT، نشانهگذاری بسته (packet marking) و غیره استفاده میشوند.
هر عبارت دارای یک نوع داده (data type) است که اندازه، تجزیه و نمایش مقادیر نمادین و سازگاری نوع با سایر عبارتها را تعیین میکند.
دستور DESCRIBE (DESCRIBE COMMAND)
describe expression | data type
دستور describe اطلاعاتی درباره نوع یک عبارت و نوع داده آن نشان میدهد. همچنین میتوان یک نوع داده را مشخص کرد که در این صورت nft اطلاعات بیشتری درباره نوع نمایش خواهد داد.
دستور describe.
$ nft describe tcp flags payload expression, datatype tcp_flag (TCP flag) (basetype bitmask, integer), 8 bits predefined symbolic constants: fin 0x01 syn 0x02 rst 0x04 psh 0x08 ack 0x10 urg 0x20 ecn 0x40 cwr 0x80
انواع داده (DATA TYPES)
انواع داده اندازه، تجزیه و نمایش مقادیر نمادین و سازگاری نوع عبارات را تعیین میکنند. تعدادی نوع داده سراسری وجود دارد، علاوه بر این برخی از انواع عبارت، انواع دادههای بیشتری را تعریف میکنند که مختص همان نوع عبارت است. بیشتر انواع داده اندازه ثابتی دارند، با این حال برخی ممکن است اندازه پویایی داشته باشند، مانند نوع رشته (string). برخی از انواع نیز دارای ثابتهای نمادین از پیش تعریفشده هستند. این موارد را میتوان با استفاده از دستور describe در nft فهرست کرد:
$ nft describe ct_state datatype ct_state (conntrack state) (basetype bitmask, integer), 32 bits pre-defined symbolic constants (in hexadecimal): invalid 0x00000001 new ...
انواع داده ممکن است از انواع مرتبه پایینتر مشتق شوند، برای مثال نوع آدرس IPv4 از نوع عدد صحیح مشتق شده است، به این معنی که یک آدرس IPv4 را میتوان به صورت یک مقدار عدد صحیح نیز مشخص کرد.
در برخی زمینهها (تعاریف set و map)، تعیین صریح یک نوع داده ضروری است. هر نوع دارای نامی است که برای این منظور استفاده میشود.
نوع عدد صحیح (INTEGER TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| عدد صحیح (Integer) | integer | متغیر | - |
نوع عدد صحیح (integer) برای مقادیر عددی استفاده میشود. این نوع میتواند به صورت یک عدد دهدهی (decimal)، هگزادسیمال یا هشتهشتی (octal) مشخص شود. نوع عدد صحیح اندازه ثابتی ندارد، و اندازه آن توسط عبارتی که برای آن استفاده میشود تعیین میگردد.
نوع ماسک بیتی (BITMASK TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| ماسک بیتی (Bitmask) | bitmask | متغیر | integer |
نوع ماسک بیتی (bitmask) برای ماسکهای بیتی استفاده میشود.
در عبارات، بیتهای یک ماسک بیتی را میتوان به صورت bit[,bit]... مشخص کرد که در آن bit مقدار بیت یا در صورت وجود، یک ثابت نمادین از پیش تعریفشده است (برای مثال بیت 0x1 در ct state دارای ثابت نمادین new است).
برابری یک مقدار با چنین ماسک بیتی زمانی برقرار است که مقدار، هر یک از بیتهای تعیینشده ماسک بیتی را داشته باشد (و به صورت اختیاری سایر بیتها را نیز شامل شود).
سینتکس expression value / mask با expression and mask == value یکسان است. برای مثال tcp flags syn,ack / syn,ack,fin,rst با tcp flags and (syn|ack|fin|rst) == syn|ack یکسان است.
توجه داشته باشید که expression bit[,bit]... به طور کلی با expression {bit[,bit]...} یکسان نیست و در مورد یک مجموعه نامگذاریشده (named set) نیز به همین صورت است. اشکال دوم در واقع جستجو در یک مجموعه هستند و تنها زمانی مطابقت دارند که مجموعه دقیقاً شامل یک مقدار منطبق باشد. با این حال، زمانی که همه بیتها از نظر معنایی مانعةالجمع (mutually exclusive) باشند، این دو حالت در عمل یکسان هستند (که تطبیق ماسک بیتی معمولاً سریعتر است).
مثالها: * tcp flags syn,ack بستههایی را مطابقت میدهد که فلگ SYN، فلگ ACK یا هر دو فلگ SYN و ACK در آنها تنظیم شده باشد. سایر فلگها نادیده گرفته میشوند. tcp flags { syn, ack } بستههایی را مطابقت میدهد که فقط فلگ SYN یا فقط فلگ ACK در آنها تنظیم شده باشد. همه فلگهای دیگر باید غیرفعال باشند. * ct state established,related و ct state { established, related } دقیقاً بستههای یکسانی را مطابقت میدهند، زیرا بیتهای ct state همگی مانعةالجمع هستند.
طبق معمول، میتوان از دستور nft describe برای دریافت جزئیات مربوط به یک نوع داده استفاده کرد که برای ماسکهای بیتی، نامهای نمادین و مقادیر بیتها را نمایش میدهد.
نوع رشته (STRING TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| رشته (String) | string | متغیر | - |
نوع رشته (string) برای رشتههای متنی و کاراکتری استفاده میشود. یک رشته با یک نویسه الفبایی (a-zA-Z) آغاز میشود که به دنبال آن صفر یا چند نویسه الفباییعددی یا نویسههای /، -، _ و . قرار میگیرند. علاوه بر این، هر متنی که درون گیومه دوتایی (") قرار گیرد به عنوان رشته شناخته میشود.
تعیین نوع رشته (String specification).
# Interface name filter input iifname eth0 # Weird interface name filter input iifname "(eth0)"
نوع رابط کاربری (INTERFACE TYPE TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| نوع رابط کاربری (Interface type) | iface_type | ۱۶ بیت | integer |
نوع نوع رابط کاربری (interface type type) همراه با عبارت meta iiftype/oiftype استفاده میشود. مقادیر آن با تعاریف مربوطه ARPHRD_* در <linux/if_arp.h> مطابقت دارند.
جدول ۱۷. کلیدواژههای زیر به طور خودکار به یک نوع رابط با مقدار دادهشده تبدیل میشوند:
| کلیدواژه | مقدار |
| ether | 1 |
| ppp | 512 |
| ipip | 768 |
| ipip6 | 769 |
| loopback | 772 |
| sit | 776 |
| ipgre | 778 |
نوع آدرس لایه پیوند (LINK LAYER ADDRESS TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| آدرس لایه پیوند (Link layer address) | lladdr | متغیر | integer |
نوع آدرس
لایه پیوند
(link layer address) برای
آدرسهای
لایه پیوند
استفاده
میشود.
آدرسهای
لایه پیوند
به صورت
تعداد
متغیری از
گروههای
دو رقمی
هگزادسیمال
که با
دونقطه (:) از
هم جدا
شدهاند
مشخص
میشوند.
مشخص کردن آدرس لایه پیوند (Link layer address specification).
# Ethernet destination MAC address filter input ether daddr 20:c9:d0:43:12:d9
نوع آدرس IPV4 (IPV4 ADDRESS TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| آدرس IPv4 | ipv4_addr | ۳۲ بیت | integer |
نوع آدرس IPv4 برای آدرسهای IPv4 استفاده میشود. آدرسها به صورت نشانهگذاری دهدهی نقطهدار (dotted decimal)، هگزادسیمال نقطهدار، هشتهشتی نقطهدار، دهدهی، هگزادسیمال، هشتهشتی یا به عنوان یک نام میزبان (host name) مشخص میشوند. نام میزبان با استفاده از تحلیلگر استاندارد سیستم (resolver) ترجمه خواهد شد.
مشخص کردن آدرس IPv4 (IPv4 address specification).
# dotted decimal notation filter output ip daddr 127.0.0.1 # host name filter output ip daddr localhost
نوع آدرس IPV6 (IPV6 ADDRESS TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| آدرس IPv6 | ipv6_addr | ۱۲۸ بیت | integer |
نوع آدرس IPv6 برای آدرسهای IPv6 استفاده میشود. آدرسها به صورت یک نام میزبان یا به صورت نیمکلمههای (halfwords) هگزادسیمال جدا شده با دونقطه مشخص میشوند. آدرسها ممکن است درون براکتهای مربع ("[]") قرار گیرند تا از شماره پورت متمایز شوند.
مشخص کردن آدرس IPv6 (IPv6 address specification).
# abbreviated loopback address filter output ip6 daddr ::1
مشخص کردن آدرس IPv6 با نشانهگذاری براکت (IPv6 address specification with bracket notation).
# without [] the port number (22) would be parsed as part of the # ipv6 address ip6 nat prerouting tcp dport 2222 dnat to [1ce::d0]:22
نوع بولی (BOOLEAN TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| بولی (Boolean) | boolean | ۱ بیت | integer |
نوع بولی (boolean) یک نوع کمکی نحوی در فضای کاربری (userspace) است. کاربرد آن در سمت راست یک عبارت رابطهای (معمولاً ضمنی) است تا عبارت سمت چپ را به یک بررسی بولی (معمولاً برای بررسی وجود) تبدیل کند.
جدول ۱۸. کلیدواژههای زیر به طور خودکار به یک نوع بولی با مقدار دادهشده تبدیل میشوند:
| کلیدواژه | مقدار |
| exists | 1 |
| missing | 0 |
جدول ۱۹. عباراتی که از مقایسه بولی پشتیبانی میکنند
| عبارت | رفتار |
| fib | بررسی وجود مسیر. |
| exthdr | بررسی وجود هدر افزونه IPv6. |
| tcp option | بررسی وجود هدر گزینه TCP. |
مشخص کردن بولی (Boolean specification).
# match if route exists filter input fib daddr . iif check exists # match only non-fragmented packets in IPv6 traffic filter input exthdr frag missing # match if TCP timestamp option is present filter input tcp option timestamp exists
نوع نوع ICMP (ICMP TYPE TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| نوع ICMP | icmp_type | ۸ بیت | integer |
نوع نوع ICMP برای مشخص کردن آسان فیلد نوع (type) در هدر ICMP استفاده میشود.
جدول ۲۰. کلیدواژههایی که میتوان هنگام تعیین نوع ICMP استفاده کرد:
| کلیدواژه | مقدار |
| echo-reply | 0 |
| destination-unreachable | 3 |
| source-quench | 4 |
| redirect | 5 |
| echo-request | 8 |
| router-advertisement | 9 |
| router-solicitation | 10 |
| time-exceeded | 11 |
| parameter-problem | 12 |
| timestamp-request | 13 |
| timestamp-reply | 14 |
| info-request | 15 |
| info-reply | 16 |
| address-mask-request | 17 |
| address-mask-reply | 18 |
مشخص کردن نوع ICMP (ICMP Type specification).
# match ping packets
filter output icmp type { echo-request, echo-reply }
نوع کد ICMP (ICMP CODE TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| کد ICMP | icmp_code | ۸ بیت | integer |
نوع کد ICMP برای مشخص کردن آسان فیلد کد (code) در هدر ICMP استفاده میشود.
نوع نوع ICMPV6 (ICMPV6 TYPE TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| نوع ICMPv6 | icmpv6_type | ۸ بیت | integer |
نوع نوع ICMPv6 برای مشخص کردن آسان فیلد نوع (type) در هدر ICMPv6 استفاده میشود.
جدول ۲۱. کلیدواژههایی که میتوان هنگام تعیین نوع ICMPv6 استفاده کرد:
| کلیدواژه | مقدار |
| destination-unreachable | 1 |
| packet-too-big | 2 |
| time-exceeded | 3 |
| parameter-problem | 4 |
| echo-request | 128 |
| echo-reply | 129 |
| mld-listener-query | 130 |
| mld-listener-report | 131 |
| mld-listener-done | 132 |
| mld-listener-reduction | 132 |
| nd-router-solicit | 133 |
| nd-router-advert | 134 |
| nd-neighbor-solicit | 135 |
| nd-neighbor-advert | 136 |
| nd-redirect | 137 |
| router-renumbering | 138 |
| ind-neighbor-solicit | 141 |
| ind-neighbor-advert | 142 |
| mld2-listener-report | 143 |
مشخص کردن نوع ICMPv6 (ICMPv6 Type specification).
# match ICMPv6 ping packets
filter output icmpv6 type { echo-request, echo-reply }
نوع کد ICMPV6 (ICMPV6 CODE TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| کد ICMPv6 | icmpv6_code | ۸ بیت | integer |
نوع کد ICMPv6 برای مشخص کردن آسان فیلد کد (code) در هدر ICMPv6 استفاده میشود.
انواع ردگیری اتصال (CONNTRACK TYPES)
جدول ۲۲. نمای کلی انواع مورد استفاده در عبارت و دستور ct
| نام | کلیدواژه | اندازه | نوع پایه |
| حالت ردگیری اتصال (conntrack state) | ct_state | ۴ بایت | bitmask |
| جهت ردگیری اتصال (conntrack direction) | ct_dir | ۸ بیت | integer |
| وضعیت ردگیری اتصال (conntrack status) | ct_status | ۴ بایت | bitmask |
| بیتهای رویداد ردگیری اتصال (conntrack event bits) | ct_event | ۴ بایت | bitmask |
| برچسب ردگیری اتصال (conntrack label) | ct_label | ۱۲۸ بیت | bitmask |
برای هر یک از انواع فوق، کلیدواژههایی برای سهولت استفاده در دسترس هستند:
جدول ۲۳. حالت ردگیری اتصال (ct_state)
| کلیدواژه | مقدار |
| invalid | 1 |
| established | 2 |
| related | 4 |
| new | 8 |
| untracked | 64 |
جدول ۲۴. جهت ردگیری اتصال (ct_dir)
| کلیدواژه | مقدار |
| original | 0 |
| reply | 1 |
جدول ۲۵. وضعیت ردگیری اتصال (ct_status)
| کلیدواژه | مقدار | توضیحات |
| expected | 1 | اتصال مورد انتظار؛ توسط conntrack helper راهاندازی شده است |
| seen-reply | 2 | ردگیری اتصال (conntrack) بستهها را در هر دو جهت دیده است |
| assured | 4 | در صورت پر شدن جدول هش (hash table)، مدخل conntrack حذف نخواهد شد |
| confirmed | 8 | بسته اولیه پردازش شده است |
| snat | 16 | نشانی مبدا اصلی با مقصد پاسخ متفاوت است |
| dnat | 32 | نشانی مقصد اصلی با مبدا پاسخ متفاوت است |
| seq-adjust | 64 | بازنویسی شماره ترتیب tcp به دلیل conntrack helper یا synproxy |
| snat-done | 128 | برای یافتن قاعده منطبق snat/masquerade تلاش شده است |
| dnat-done | 256 | برای یافتن قاعده منطبق dnat/redirect تلاش شده است |
| dying | 512 | اتصال در آستانه حذف شدن است |
| fixed-timeout | 1024 | مدخل حتی در صورت فعال بودن ترافیک منقضی میشود |
| helper | 8192 | اتصال توسط conntrack helper تحت نظارت است |
| offload | 16384 | اتصال به یک جدول جریان (flow table) برونسپاری شده است |
| hw-offload | 32768 | اتصال به سختافزار برونسپاری شده است |
جدول ۲۶. بیتهای رویداد ردگیری اتصال (ct_event)
| کلیدواژه | مقدار |
| new | 1 |
| related | 2 |
| destroy | 4 |
| reply | 8 |
| assured | 16 |
| protoinfo | 32 |
| helper | 64 |
| mark | 128 |
| seqadj | 256 |
| secmark | 512 |
| label | 1024 |
کلیدواژههای ممکن برای نوع برچسب ردگیری اتصال (ct_label) در زمان اجرا از مسیر /etc/connlabel.conf خوانده میشوند.
نوع بسته DCCP (DCCP PKTTYPE TYPE)
| نام | کلیدواژه | اندازه | نوع پایه |
| نوع بسته DCCP | dccp_pkttype | ۴ بیت | integer |
نوع بسته DCCP مقادیر مجاز مختلف فیلد ۴ بیتی مربوطه در هدر DCCP را طبق RFC4340 انتزاع میکند. توجه داشته باشید که مقادیر احتمالی ۱۰-۱۵ رزروشده تلقی میشوند و بنابراین استفاده از آنها مجاز نیست. در تطبیق dccp ابزار iptables، این مقادیر با نام مستعار INVALID شناخته میشوند. در nftables، میتوان به سادگی روی محدوده مقادیر عددی تطبیق انجام داد، یعنی 10-15.
جدول ۲۷. کلیدواژههایی که میتوان هنگام تعیین نوع بسته DCCP استفاده کرد
| کلیدواژه | مقدار |
| request | 0 |
| response | 1 |
| data | 2 |
| ack | 3 |
| dataack | 4 |
| closereq | 5 |
| close | 6 |
| reset | 7 |
| sync | 8 |
| syncack | 9 |
عبارتهای اولیه (PRIMARY EXPRESSIONS)
پایینترین
مرتبه
عبارت، یک
عبارت
اولیه (primary expression)
است که
نشاندهنده
یک مقدار
ثابت یا
دادهای
منفرد از
بار داده (payload)
بسته،
متاداده یا
یک ماژول
حالتمند (stateful)
میباشد.
عبارتهای متاداده (META EXPRESSIONS)
meta {length | nfproto | l4proto | protocol | priority}
[meta] {mark | iif | iifname | iiftype | oif | oifname | oiftype | skuid | skgid | nftrace | rtclassid | ibrname | obrname | pkttype | cpu | iifgroup | oifgroup | cgroup | random | ipsec | iifkind | oifkind | time | hour | day }
یک عبارت متاداده به متادادههای مرتبط با یک بسته اشاره دارد.
دو نوع عبارت متاداده وجود دارد: عبارتهای متاداده مقید (qualified) و نامقید (unqualified). عبارتهای متاداده مقید نیازمند کلمه کلیدی meta قبل از کلید متاداده هستند؛ عبارتهای متاداده نامقید را میتوان مستقیماً با استفاده از کلید متاداده یا بهصورت عبارتهای مقید مشخص کرد. عبارت meta l4proto برای تطبیق با یک پروتکل لایه انتقال مشخص که بخشی از بسته IPv4 یا IPv6 است مفید است. این عبارت همچنین هرگونه سرآیند الحاقی IPv6 موجود در بسته IPv6 را نادیده میگیرد.
عبارتهای meta iif، oif، iifname و oifname برای تطبیق با رابطی که بسته از آن وارد شده یا در حال ارسال از آن است به کار میروند.
عبارتهای iif و oif برای تطبیق بر اساس اندیس رابط (interface index) استفاده میشوند، در حالی که iifname و oifname برای تطبیق بر اساس نام رابط به کار میروند. این دو یکسان نیستند — با فرض قاعده زیر:
filter input meta iif "foo"
این قاعده تنها در صورتی میتواند اضافه شود که رابط "foo" وجود داشته باشد. همچنین، این قاعده حتی اگر نام رابط "foo" به "bar" تغییر یابد همچنان تطبیق داده خواهد شد.
علت این است که در ساختار داخلی از اندیس رابط استفاده میشود. در مورد رابطهایی که بهصورت پویا ایجاد میشوند، مانند رابطهای tun/tap یا رابطهای dialup (به عنوان مثال ppp)، بهتر است از iifname یا oifname استفاده شود.
در این موارد، نام رابط استفاده میشود؛ بنابراین برای افزودن چنین قاعدهای نیازی به وجود رابط نیست، در صورت تغییر نام رابط تطبیق متوقف میشود و در صورت حذف رابط و ساخت مجدد رابطی با همان نام در آینده، مجدداً تطبیق مییابد.
همانند iptables، تطبیق با نویسه عمومی (wildcard) روی پیشوند نام رابط برای تطبیقهای iifname و oifname با افزودن یک نویسه ستاره (*) امکانپذیر است. با این حال توجه داشته باشید که برخلاف iptables، nftables نام رابطهایی را که تنها شامل نویسه عمومی هستند نمیپذیرد - کاربران باید صرفاً از این عبارتهای همیشه منطبق صرفنظر کنند. برای تطبیق با خود نویسه ستاره بهصورت تحتاللفظی، میتوان آن را با بکاسلش (\) اسکیپ کرد.
جدول ۲۸. انواع عبارتهای متاداده (Meta expression types)
| کلمه کلیدی | توضیحات | نوع |
| length | طول بسته بر حسب بایت | integer (32-bit) |
| nfproto | خانواده واقعی پروتکل هوک، تنها در جدول inet کاربرد دارد | integer (32 bit) |
| l4proto | پروتکل لایه ۴، هدرهای الحاقی ipv6 را نادیده میگیرد | integer (8 bit) |
| protocol | مقدار پروتکل EtherType | ether_type |
| priority | اولویت بسته TC | tc_handle |
| mark | نشان بسته (Packet mark) | mark |
| iif | اندیس رابط ورودی | iface_index |
| iifname | نام رابط ورودی | ifname |
| iiftype | نوع رابط ورودی | iface_type |
| oif | اندیس رابط خروجی | iface_index |
| oifname | نام رابط خروجی | ifname |
| oiftype | نوع سختافزاری رابط خروجی | iface_type |
| sdif | اندیس رابط ورودی دستگاه Slave | iface_index |
| sdifname | نام رابط دستگاه Slave | ifname |
| skuid | شناسه کاربر (UID) مرتبط با سوکت مبدا | uid |
| skgid | شناسه گروه (GID) مرتبط با سوکت مبدا | gid |
| rtclassid | قلمرو مسیریابی (Routing realm) | realm |
| ibrname | نام رابط پل (Bridge) ورودی | ifname |
| obrname | نام رابط پل (Bridge) خروجی | ifname |
| pkttype | نوع بسته | pkt_type |
| cpu | شماره پردازنده در حال پردازش بسته | integer (32 bit) |
| iifgroup | گروه دستگاه ورودی | devgroup |
| oifgroup | گروه دستگاه خروجی | devgroup |
| cgroup | شناسه net_cls.classid از گروه کنترل؛ در میزبانهای صرفاً مبتنی بر cgroupv2 بدون ساختار فعال net_cls مقدار صفر میخواند (برای تطبیق روی cgroupv2، عبارت socket cgroupv2 را ببینید) | integer (32 bit) |
| random | عدد شبهتصادفی | integer (32 bit) |
| ipsec | درست (true) اگر بسته با ipsec رمزنگاری شده باشد | boolean (1 bit) |
| iifkind | نوع رابط ورودی | |
| oifkind | نوع رابط خروجی | |
| time | زمان مطلق دریافت بسته | Integer (32 bit) or string |
| day | روز هفته | Integer (8 bit) or string |
| hour | ساعت از شبانهروز | مقدار رشتهای در قالب HH:MM یا HH:MM:SS. مقادیر باید کمتر از 24:00 باشند، هرچند به دلایل فنی، 23:59:60 نیز پذیرفته میشود. |
جدول ۲۹. انواع اختصاصی عبارتهای متاداده (Meta expression specific types)
| نوع | توضیحات |
| iface_index | اندیس رابط (عدد ۳۲ بیتی). میتواند بهصورت عددی یا به عنوان نام یک رابط موجود مشخص شود. |
| ifname | نام رابط (رشته ۱۶ بایتی). نیازی به وجود رابط نیست. |
| uid | شناسه کاربر (عدد ۳۲ بیتی). میتواند بهصورت عددی یا به عنوان نام کاربری مشخص شود. |
| gid | شناسه گروه (عدد ۳۲ بیتی). میتواند بهصورت عددی یا به عنوان نام گروه مشخص شود. |
| realm | قلمرو مسیریابی (Routing Realm - عدد ۳۲ بیتی). میتواند بهصورت عددی یا به عنوان نام نمادین تعریفشده در /etc/iproute2/rt_realms مشخص شود. |
| devgroup_type | گروه دستگاه (عدد ۳۲ بیتی). میتواند بهصورت عددی یا به عنوان نام نمادین تعریفشده در /etc/iproute2/group مشخص شود. |
| pkt_type | نوع بسته: host (مخاطب آن میزبان محلی است)، broadcast (برای همه)، multicast (برای گروه)، other (مخاطب آن میزبانی دیگر است). |
| ifkind | نوع رابط (رشته ۱۶ بایتی). برای مشاهده فهرست، بخش TYPES در ip-link(8) را ببینید. |
| time | یا یک عدد صحیح یا یک تاریخ در قالب ISO. برای مثال: "2019-06-06 17:00". ساعت و ثانیه اختیاری هستند و در صورت تمایل میتوان آنها را حذف کرد. در صورت حذف، نیمهشب در نظر گرفته میشود. سه مقدار زیر معادل خواهند بود: "2019-06-06"، "2019-06-06 00:00" و "2019-06-06 00:00:00". برای تطبیق بازهای از زمان از عبارت بازهای مانند "2019-06-06 10:00"-"2019-06-10 14:00" استفاده کنید. هنگامی که یک عدد صحیح داده میشود، به عنوان یک مهر زمانی یونیکس (UNIX timestamp) در نظر گرفته میشود. |
| day | یا یک روز از هفته ("Monday"، "Tuesday" و غیره)، یا یک عدد صحیح بین 0 و 6. رشتهها بدون حساسیت به حروف بزرگ و کوچک تطبیق داده میشوند و تطابق کامل الزامی نیست (مثلاً "Mon" با "Monday" تطبیق مییابد). هنگامی که یک عدد صحیح داده میشود، 0 برابر یکشنبه (Sunday) و 6 برابر شنبه (Saturday) است. برای تطبیق یک بازه از روزهای هفته از یک عبارت بازهای مانند "Monday"-"Wednesday" استفاده کنید. |
| hour | رشتهای که نشاندهنده یک ساعت در قالب ۲۴ ساعته است. ثانیهها را میتوان به صورت اختیاری مشخص کرد. برای مثال، 17:00 و 17:00:00 معادل خواهند بود. برای تطبیق یک بازه زمانی از یک عبارت بازهای مانند "17:00"-"19:00" استفاده کنید. |
استفاده از عبارتهای متاداده (Using meta expressions).
# عبارت متاداده مقید
filter output meta oif eth0
filter forward meta iifkind { "tun", "veth" }
# عبارت متاداده نامقید
filter output oif eth0
# بسته ورودی تحت پردازش ipsec قرار گرفته است
raw prerouting meta ipsec exists accept
# تطبیق بسته ورودی از 03:00 تا 14:00 به وقت محلی
raw prerouting meta hour "03:00"-"14:00" counter accept
عبارت SOCKET (SOCKET EXPRESSION)
socket {transparent | mark | wildcard}
socket cgroupv2 level NUM
عبارت socket میتواند برای جستجوی یک سوکت TCP/UDP باز موجود و ویژگیهای آن که میتوانند با یک بسته مرتبط شوند، مورد استفاده قرار گیرد. این عبارت به دنبال یک سوکت شنونده متصلشده غیرصفر یا برقرارشده (احتمالاً با یک آدرس غیرمحلی) میگردد. همچنین میتوانید از آن برای تطبیق روی cgroupv2 سوکت در یک سطح والد (ancestor) مشخص استفاده کنید؛ برای مثال اگر سوکت به cgroupv2 با نام a/b تعلق داشته باشد، سطح والد 1 تطبیق را روی cgroup a بررسی میکند و سطح والد 2 تطبیق را روی cgroup b بررسی مینماید.
جدول ۳۰. ویژگیهای سوکت موجود (Available socket attributes)
| نام | توضیحات | نوع |
| transparent | مقدار گزینه سوکت IP_TRANSPARENT در سوکت یافتشده. این مقدار میتواند 0 یا 1 باشد. | boolean (1 bit) |
| mark | مقدار نشان سوکت (SOL_SOCKET, SO_MARK). | mark |
| wildcard | نشان میدهد که آیا سوکت به صورت wildcard متصل شده است یا خیر (مانند 0.0.0.0 یا ::0). | boolean (1 bit) |
| cgroupv2 | نسخه 2 cgroup برای این سوکت (مسیر از /sys/fs/cgroup) | cgroupv2 |
استفاده از عبارت socket (Using socket expression).
# نشانهگذاری بستههای متناظر با یک سوکت شفاف (transparent). عبارت "socket wildcard 0"
# به این معنی است که سوکتهای شنونده متصل به صفر تطبیق داده نمیشوند (که معمولاً
# دقیقاً همان چیزی است که میخواهید).
table inet x {
chain y {
type filter hook prerouting priority mangle; policy accept;
socket transparent 1 socket wildcard 0 mark set 0x00000001 accept
}
}
# ردگیری بستههای متناظر با سوکتی با مقدار نشان 15
table inet x {
chain y {
type filter hook prerouting priority mangle; policy accept;
socket mark 0x0000000f nftrace set 1
}
}
# تنظیم نشان بسته روی نشان سوکت
table inet x {
chain y {
type filter hook prerouting priority mangle; policy accept;
tcp dport 8080 mark set socket mark
}
}
# شمارش بستهها برای cgroupv2 با نام "user.slice" در سطح 1
table inet x {
chain y {
type filter hook input priority filter; policy accept;
socket cgroupv2 level 1 "user.slice" counter
}
}
عبارت OSF (OSF EXPRESSION)
osf [ttl {loose | skip}] {name | version}
عبارت osf انگشتنگاری (fingerprinting) غیرفعال سیستمعامل را انجام میدهد. این عبارت برخی دادهها (مانند Window Size، MSS، گزینهها و ترتیب آنها، DF و غیره) را از بستههایی که بیت SYN آنها تنظیم شده است، مقایسه میکند.
جدول ۳۱. ویژگیهای osf موجود (Available osf attributes)
| نام | توضیحات | نوع |
| ttl | بررسی TTL روی بسته برای تعیین سیستمعامل. | string |
| version | بررسی نسخه سیستمعامل روی بسته. | |
| name | نام امضای سیستمعامل برای تطبیق. تمام امضاها را میتوان در فایل pf.os یافت. از "unknown" برای امضاهای سیستمعاملی که عبارت قادر به تشخیص آنها نبوده استفاده کنید. | string |
مقادیر ttl موجود (Available ttl values).
اگر هیچ ویژگی TTL ارسال نشود، یک مقایسه مستقیم و دقیق بین هدر IP و TTL امضا انجام میشود. این حالت معمولاً برای شبکههای محلی (LAN) کاربرد دارد. * loose: بررسی میکند که آیا TTL هدر IP کمتر از TTL امضا است یا خیر. برای آدرسهای سراسری و مسیریابیپذیر (globally-routable) کار میکند. * skip: اصلاً TTL را مقایسه نمیکند.
استفاده از عبارت osf (Using osf expression).
# پذیرش بستههایی که با امضای دسته سیستمعامل "Linux" بدون مقایسه TTL تطبیق دارند.
table inet x {
chain y {
type filter hook input priority filter; policy accept;
osf ttl skip name "Linux"
}
}
عبارتهای FIB (FIB EXPRESSIONS)
fib FIB_TUPLE FIB_RESULT
FIB_TUPLE := { saddr | daddr} [ . { iif | oif } . mark ]
FIB_RESULT := { oif | oifname | check | type }
یک عبارت fib از پایگاه اطلاعات هدایت بسته (FIB - Forwarding Information Base) برای به دست آوردن اطلاعاتی مانند اندیس رابط خروجی پرسوجو میکند.
نخستین آرگومانهای عبارت fib کلیدهای ورودی هستند که به تابع جستجوی fib ارسال میشوند. یکی از کلیدهای saddr یا daddr اجباری است و همچنین مانعةالجمع (mutually exclusive) هستند.
کلمات کلیدی mark، iif و oif اصلاحکنندههای اختیاری برای تاثیرگذاری بر نتیجه جستجو هستند؛ برای توضیحات، جدول کلمات کلیدی FIB_TUPLE را در زیر ببینید. کلمات کلیدی چندتایی iif و oif نیز مانعةالجمع هستند.
آخرین آرگومان عبارت fib نوع نتیجه مورد نظر است.
گزینه oif درخواست دریافت اندیس رابطی را دارد که برای ارسال بستهها به مبدا بسته (کلید saddr) یا مقصد بسته (کلید daddr) استفاده میشود. اگر هیچ مدخل مسیریابی یافت نشود، اندیس رابط برگرداندهشده 0 خواهد بود.
گزینه oifname مانند oif است، اما به جای آن نام رابط را پر میکند. این ویژگی برای بررسی رابطهای پویا مانند دستگاههای ppp کاربردی است. اگر هیچ مدخلی یافت نشود، یک نام رابط خالی بازگردانده میشود.
گزینه type نوع آدرس مانند تکپخشی (unicast) یا چندپخشی (multicast) را برمیگرداند. فهرست کاملی از انواع آدرس پشتیبانیشده را میتوان با دستور nft describe fib_addrtype مشاهده کرد.
جدول ۳۲. کلمات کلیدی FIB_TUPLE (FIB_TUPLE keywords)
| فلگ | توضیحات |
| daddr | انجام جستجوی عادی مسیر: جستجو در fib برای مسیر به سمت آدرس مقصد بسته. |
| saddr | انجام جستجوی معکوس مسیر: جستجو در fib برای مسیر به سمت آدرس مبدا بسته. |
| mark | در نظر گرفتن نشان بسته (nfmark) هنگام پرسوجو از fib. |
| iif | اگر جستجوی fib مسیری را ارائه داد، بررسی میکند که آیا رابط خروجی آن با رابط ورودی بسته یکسان است یا خیر. |
| oif | اگر جستجوی fib مسیری را ارائه داد، بررسی میکند که آیا رابط خروجی آن با رابط خروجی بسته یکسان است یا خیر. این فلگ تنها همراه با نتیجه type قابل استفاده است. |
جدول ۳۳. کلمات کلیدی FIB_RESULT (FIB_RESULT keywords)
| کلمه کلیدی | توضیحات | نوع نتیجه |
| oif | اندیس رابط خروجی | iface_index |
| check | بررسی رابط خروجی | boolean |
| oifname | نام رابط خروجی | ifname |
| type | نوع آدرس | fib_addrtype (برای مشاهده فهرست، nft describe fib_addrtype را ببینید) |
نتیجه oif و oifname تنها در هوکهای prerouting، input و forward معتبر است. مقدار type را میتوان از هر یک از هوکهای prerouting، input، forward، output و postrouting استعلام کرد.
برای type، وجود کلمه کلیدی iif در اصلاحکنندههای FIB_TUPLE، هوکهای در دسترس را به مواردی محدود میکند که بسته با یک رابط ورودی مرتبط است، یعنی prerouting، input و forward. به همین ترتیب، کلمه کلیدی oif در فهرست اصلاحکنندههای FIB_TUPLE، هوکهای در دسترس را به forward، output و postrouting محدود میسازد.
استفاده از عبارتهای fib (Using fib expressions).
# انداختن (drop) بستههای فاقد مسیر معکوس
filter prerouting fib saddr . iif oif missing drop
در این مثال، عبارت 'saddr . iif' به دنبال مسیری به سمت *آدرس مبدا* بسته میگردد و نتایج منطبق را
به رابطی که بسته از آن وارد شده محدود میکند، سپس اندیس رابط خروجی را از نتیجه مسیر fib به دست آمده
ذخیره مینماید.
اگر هیچ مسیری برای ترکیب آدرس مبدا/رابط ورودی یافت نشود، اندیس رابط خروجی صفر خواهد بود.
بنابراین، این قاعده تمام بستههایی را که مسیر معکوس سختگیرانه (strict reverse path) ندارند حذف میکند
(بسته پاسخ فرضی از طریق همان رابطی ارسال خواهد شد که بسته آزمایششده از آن دریافت شده است).
اگر فقط از 'saddr oif' به عنوان کلید ورودی استفاده شود، آنگاه این قاعده فقط بستههایی را حذف میکند که fib
نتواند مسیری برای آنها پیدا کند. در بیشتر پیکربندیها این قاعده هرگز بستهای را حذف نخواهد کرد زیرا مسیر پیشفرض برگردانده میشود.
# انداختن بستهها در صورتی که آدرس IP مقصد روی رابط ورودی پیکربندی نشده باشد
filter prerouting fib daddr . iif type != { local, broadcast, multicast } drop
این دستور از fib بر اساس آدرس مقصد بستههای جاری و رابط ورودی پرسوجو میکند.
اگر بسته به یک آدرس unicast ارسال شود که روی رابط متفاوتی پیکربندی شده است، بسته دور انداخته میشود
چرا که چنین آدرسی از نوع 'unicast' دستهبندی خواهد شد.
بدون اصلاحکننده 'iif'، هر آدرس پیکربندیشده روی ماشین محلی به عنوان 'local' در نظر گرفته میشود و آدرسهای unicast
که روی هیچ رابطی پیکربندی نشدهاند، نوع 'unicast' را برمیگردانند.
# انجام جستجو در یک جدول خاص 'blackhole' (مقدار 0xdead، نیازمند ip rule مناسب است)
filter prerouting meta mark set 0xdead fib daddr . mark type vmap { blackhole : drop, prohibit : jump prohibited, unreachable : drop }
عبارتهای مسیریابی (ROUTING EXPRESSIONS)
rt [ip | ip6] {classid | nexthop | mtu | ipsec}
یک عبارت مسیریابی (routing expression) به دادههای مسیریابی مرتبط با یک بسته اشاره دارد.
جدول ۳۴. انواع عبارتهای مسیریابی (Routing expression types)
| کلمه کلیدی | توضیحات | نوع |
| classid | قلمرو مسیریابی (Routing realm) | realm |
| nexthop | گام بعدی مسیریابی (Routing nexthop) | ipv4_addr/ipv6_addr |
| mtu | حداکثر اندازه سگمنت (MSS) پروتکل TCP برای مسیر | integer (16 bit) |
| ipsec | مسیردهی از طریق تونل یا ترنسپورت ipsec | boolean |
جدول ۳۵. انواع اختصاصی عبارتهای مسیریابی (Routing expression specific types)
| نوع | توضیحات |
| realm | قلمرو مسیریابی (Routing Realm - عدد ۳۲ بیتی). میتواند بهصورت عددی یا به عنوان نام نمادین تعریفشده در /etc/iproute2/rt_realms مشخص شود. |
استفاده از عبارتهای مسیریابی (Using routing expressions).
# عبارت rt مستقل از خانواده IP filter output rt classid 10 # عبارتهای rt وابسته به خانواده IP ip filter output rt nexthop 192.168.0.1 ip6 filter output rt nexthop fd00::1 inet filter output rt ip nexthop 192.168.0.1 inet filter output rt ip6 nexthop fd00::1 # بسته خروجی با ipsec کپسولهسازی/رمزگذاری خواهد شد filter output rt ipsec exists
عبارتهای IPSEC (IPSEC EXPRESSIONS)
ipsec {in | out} [ spnum NUM ] {reqid | spi}
ipsec {in | out} [ spnum NUM ] {ip | ip6} {saddr | daddr}
یک عبارت ipsec به دادههای ipsec مرتبط با یک بسته اشاره دارد.
کلمه کلیدی in یا out باید برای مشخص کردن اینکه آیا عبارت سیاستهای ورودی را بررسی کند یا خروجی، به کار رود. کلمه کلیدی in میتواند در هوکهای prerouting، input و forward استفاده شود. کلمه کلیدی out برای هوکهای forward، output و postrouting به کار میرود. کلمه کلیدی اختیاری spnum میتواند برای تطبیق با یک وضعیت (state) خاص در یک زنجیره استفاده شود و مقدار پیشفرض آن 0 است.
جدول ۳۶. انواع عبارتهای Ipsec (Ipsec expression types)
| کلمه کلیدی | توضیحات | نوع |
| reqid | شناسه درخواست (Request ID) | integer (32 bit) |
| spi | شاخص پارامتر امنیتی (Security Parameter Index) | integer (32 bit) |
| saddr | آدرس مبدا تونل | ipv4_addr/ipv6_addr |
| daddr | آدرس مقصد تونل | ipv4_addr/ipv6_addr |
نکته: هنگام استفاده از xfrm_interface، این عبارت در هوک output قابل استفاده نیست چرا که بسته ساده بدون پیوست بودن اطلاعات IPsec از آن عبور میکند - به جای آن از زنجیرهای در هوک postrouting استفاده کنید.
عبارت NUMGEN (NUMGEN EXPRESSION)
numgen {inc | random} mod NUM [ offset NUM ]
یک تولیدکننده عدد ایجاد میکند. کلمات کلیدی inc یا random حالت عملیاتی آن را کنترل میکنند: در حالت inc، آخرین مقدار بازگرداندهشده صرفاً افزایش مییابد (increment). در حالت random، یک عدد تصادفی جدید بازگردانده میشود. مقدار پس از کلمه کلیدی mod یک مرز بالا (بخوانید: پیمانه یا modulus) را مشخص میکند که اعداد بازگرداندهشده هرگز به آن نمیرسند. کلمه کلیدی اختیاری offset امکان افزایش مقدار بازگرداندهشده با یک آفست ثابت را فراهم میکند.
یک مورد استفاده رایج برای numgen متعادلسازی بار (load-balancing) است:
استفاده از عبارت numgen (Using numgen expression).
# روش نوبتگردشی (round-robin) بین 192.168.10.100 و 192.168.20.200:
add rule nat prerouting dnat to numgen inc mod 2 map \
{ 0 : 192.168.10.100, 1 : 192.168.20.200 }
# مبتنی بر احتمال با بایاس فرد با استفاده از بازهها:
add rule nat prerouting dnat to numgen random mod 10 map \
{ 0-2 : 192.168.10.100, 3-9 : 192.168.20.200 }
عبارتهای هش (HASH EXPRESSIONS)
jhash {ip saddr | ip6 daddr | tcp dport | udp sport | ether saddr} [. ...] mod NUM [ seed NUM ] [ offset NUM ]
symhash mod NUM [ offset NUM ]
از یک تابع درهمسازی (هش) برای تولید یک عدد استفاده میکند. توابع موجود عبارتند از jhash، معروف به Jenkins Hash، و symhash، برای هش متقارن (Symmetric Hash). تابع jhash نیازمند یک عبارت برای تعیین پارامترهای سرآیند بسته جهت اعمال درهمسازی است و الحاق (concatenation) نیز امکانپذیر میباشد. مقدار پس از کلمه کلیدی mod یک مرز بالا (بخوانید: پیمانه یا modulus) را مشخص میکند که اعداد بازگرداندهشده هرگز به آن نمیرسند. کلمه کلیدی اختیاری seed برای تعیین یک مقدار اولیه به عنوان بذر (seed) در تابع درهمسازی استفاده میشود. کلمه کلیدی اختیاری offset امکان افزایش مقدار بازگرداندهشده با یک آفست ثابت را فراهم میکند.
یک مورد استفاده رایج برای jhash و symhash متعادلسازی بار (load-balancing) است:
استفاده از عبارتهای هش (Using hash expressions).
# متعادلسازی بار بر اساس ip مبدا بین ۲ آدرس ip:
add rule nat prerouting dnat to jhash ip saddr mod 2 map \
{ 0 : 192.168.10.100, 1 : 192.168.20.200 }
# متعادلسازی بار متقارن بین ۲ آدرس ip:
add rule nat prerouting dnat to symhash mod 2 map \
{ 0 : 192.168.10.100, 1 : 192.168.20.200 }
عبارتهای بار مفید (PAYLOAD EXPRESSIONS)
عبارتهای بار مفید به دادههای موجود در بار مفید (payload) بسته اشاره دارند.
عبارت هدر اترنت (ETHERNET HEADER EXPRESSION)
ether {daddr | saddr | type}
Table 37. انواع عبارت هدر اترنت (Ethernet header expression types)
| کلیدواژه | توضیحات | نوع |
| daddr | نشانی MAC مقصد | ether_addr |
| saddr | نشانی MAC مبدا | ether_addr |
| type | EtherType | ether_type |
عبارت هدر VLAN (VLAN HEADER EXPRESSION)
vlan {id | dei | pcp | type}
عبارت vlan برای تطبیق روی فیلدهای هدر vlan استفاده میشود. این عبارت در خانوادههای ip، ip6 و inet کار نخواهد کرد، مگر اینکه رابط vlan با تنظیم reorder_hdr off پیکربندی شده باشد. مقدار پیشفرض reorder_hdr on است که به صورت خودکار تگ vlan را از بسته حذف میکند. برای اطلاعات بیشتر به ip-link(8) مراجعه کنید. برای این خانوادهها، تطبیق نام رابط vlan با استفاده از عبارتهای meta iif یا meta iifname آسانتر است.
Table 38. عبارت هدر VLAN (VLAN header expression)
| کلیدواژه | توضیحات | نوع |
| id | شناسه VLAN (VID) | integer (12 bit) |
| dei | نشانگر واجد شرایط حذف (Drop Eligible Indicator) | integer (1 bit) |
| pcp | نقطه کد اولویت (Priority code point) | integer (3 bit) |
| type | EtherType | ether_type |
عبارت هدر ARP (ARP HEADER EXPRESSION)
arp {htype | ptype | hlen | plen | operation | saddr { ip | ether } | daddr { ip | ether }
Table 39. عبارت هدر ARP (ARP header expression)
| کلیدواژه | توضیحات | نوع |
| htype | نوع سختافزار ARP | integer (16 bit) |
| ptype | EtherType | ether_type |
| hlen | طول نشانی سختافزاری | integer (8 bit) |
| plen | طول نشانی پروتکل | integer (8 bit) |
| operation | عملیات | arp_op |
| saddr ether | نشانی اترنت فرستنده | ether_addr |
| daddr ether | نشانی اترنت مقصد | ether_addr |
| saddr ip | نشانی IPv4 فرستنده | ipv4_addr |
| daddr ip | نشانی IPv4 مقصد | ipv4_addr |
عبارت هدر IPV4 (IPV4 HEADER EXPRESSION)
ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
Table 40. عبارت هدر IPv4 (IPv4 header expression)
| کلیدواژه | توضیحات | نوع |
| version | نسخه هدر IP (۴) | integer (4 bit) |
| hdrlength | طول هدر IP شامل گزینهها | integer (4 bit) FIXME scaling |
| dscp | نقطه کد خدمات تفکیکشده (Differentiated Services Code Point) | dscp |
| ecn | اعلان صریح ازدحام (Explicit Congestion Notification) | ecn |
| length | طول کل بسته | integer (16 bit) |
| id | شناسه IP | integer (16 bit) |
| frag-off | آفست قطعه (Fragment offset) | integer (16 bit) |
| ttl | طول عمر (TTL) | integer (8 bit) |
| protocol | پروتکل لایه بالاتر | inet_proto |
| checksum | چکسام هدر IP | integer (16 bit) |
| saddr | نشانی مبدا | ipv4_addr |
| daddr | نشانی مقصد | ipv4_addr |
هنگام
تطبیق روی
ip length مراقب
باشید: هسته
لینوکس
ممکن است
چندین بسته
را در یک
بسته بزرگ
تجمیع کند
که از MTU
بزرگتر
باشد. علاوه
بر این، اگر
حداکثر
اندازه GRO/GSO
بزرگتر از
۶۵۵۳۵ باشد
(به ip-link(8) و
بهویژه gro_ipv4_max_size
و gso_ipv4_max_size مراجعه
کنید)، ممکن
است ip length برای
چنین
بستههای
بزرگی (jumbo packets)
برابر با ۰
باشد. عبارت
meta length به شما
امکان
میدهد طول
بسته را
شامل
اندازه هدر IP
تطبیق
دهید.
عبارت هدر ICMP (ICMP HEADER EXPRESSION)
icmp {type | code | checksum | id | sequence | gateway | mtu}
این عبارت به فیلدهای هدر ICMP اشاره دارد. هنگام استفاده از آن در خانوادههای inet، bridge یا netdev، باعث ایجاد یک وابستگی ضمنی به IPv4 میشود. برای تطبیق روی موارد غیرمعمول مانند ICMP روی IPv6، باید یک تطبیق صریح meta protocol ip6 به قاعده اضافه شود.
Table 41. عبارت هدر ICMP (ICMP header expression)
| کلیدواژه | توضیحات | نوع |
| type | فیلد نوع ICMP | icmp_type |
| code | فیلد کد ICMP | integer (8 bit) |
| checksum | فیلد چکسام ICMP | integer (16 bit) |
| id | شناسه درخواست/پاسخ اکو | integer (16 bit) |
| sequence | شماره توالی درخواست/پاسخ اکو | integer (16 bit) |
| gateway | گیتوی هدایتهای مجدد | integer (32 bit) |
| mtu | مقدار MTU در کشف MTU مسیر | integer (16 bit) |
عبارت هدر IGMP (IGMP HEADER EXPRESSION)
igmp {type | mrt | checksum | group}
این عبارت به فیلدهای هدر IGMP اشاره دارد. هنگام استفاده از آن در خانوادههای inet، bridge یا netdev، باعث ایجاد یک وابستگی ضمنی به IPv4 میشود. برای تطبیق روی موارد غیرمعمول مانند IGMP روی IPv6، باید یک تطبیق صریح meta protocol ip6 به قاعده اضافه شود.
Table 42. عبارت هدر IGMP (IGMP header expression)
| کلیدواژه | توضیحات | نوع |
| type | فیلد نوع IGMP | igmp_type |
| mrt | فیلد حداکثر زمان پاسخ IGMP | integer (8 bit) |
| checksum | فیلد چکسام IGMP | integer (16 bit) |
| group | نشانی گروه | integer (32 bit) |
عبارت هدر IPV6 (IPV6 HEADER EXPRESSION)
ip6 {version | dscp | ecn | flowlabel | length | nexthdr | hoplimit | saddr | daddr}
این عبارت به فیلدهای هدر IPv6 اشاره دارد. هنگام استفاده از ip6 nexthdr احتیاط کنید؛ این مقدار تنها به هدر بعدی اشاره دارد، به این معنی که ip6 nexthdr tcp فقط در صورتی مطابقت خواهد داشت که بسته IPv6 فاقد هرگونه هدر افزونه (extension header) باشد. بستههایی که قطعهقطعه شدهاند یا برای نمونه شامل هدرهای افزونه مسیریابی هستند، مطابقت داده نخواهند شد. اگر میخواهید هدر انتقال واقعی را مطابقت دهید و هدرهای افزونه اضافی را نادیده بگیرید، لطفاً بهجای آن از meta l4proto استفاده کنید.
Table 43. عبارت هدر IPv6 (IPv6 header expression)
| کلیدواژه | توضیحات | نوع |
| version | نسخه هدر IP (۶) | integer (4 bit) |
| dscp | نقطه کد خدمات تفکیکشده (Differentiated Services Code Point) | dscp |
| ecn | اعلان صریح ازدحام (Explicit Congestion Notification) | ecn |
| flowlabel | برچسب جریان (Flow label) | integer (20 bit) |
| length | طول بار مفید (Payload length) | integer (16 bit) |
| nexthdr | پروتکل هدر بعدی (Nexthdr protocol) | inet_proto |
| hoplimit | محدودیت پرش (Hop limit) | integer (8 bit) |
| saddr | نشانی مبدا | ipv6_addr |
| daddr | نشانی مقصد | ipv6_addr |
هنگام
تطبیق روی
ip6 length مراقب
باشید: هسته
لینوکس
ممکن است
چندین بسته
را در یک
بسته بزرگ
تجمیع کند
که از MTU
بزرگتر
باشد. علاوه
بر این، اگر
حداکثر
اندازه GRO/GSO
بزرگتر از
۶۵۵۳۵ باشد
(به ip-link(8) و
بهویژه gro_max_size
و gso_max_size مراجعه
کنید)، ممکن
است ip6 length برای
چنین
بستههای
بزرگی (jumbo packets)
برابر با ۰
باشد. عبارت
meta length به شما
امکان
میدهد طول
بسته را
شامل
اندازه هدر
IPv6 تطبیق
دهید.
استفاده از عبارتهای هدر ip6.
# تطبیق در صورتی که اولین هدر افزونه نشاندهنده یک قطعه باشد ip6 nexthdr ipv6-frag
عبارت هدر ICMPV6 (ICMPV6 HEADER EXPRESSION)
icmpv6 {type | code | checksum | parameter-problem | packet-too-big | id | sequence | max-delay | taddr | daddr}
این عبارت به فیلدهای هدر ICMPv6 اشاره دارد. هنگام استفاده از آن در خانوادههای inet، bridge یا netdev، باعث ایجاد یک وابستگی ضمنی به IPv6 میشود. برای تطبیق روی موارد غیرمعمول مانند ICMPv6 روی IPv4، باید یک تطبیق صریح meta protocol ip به قاعده اضافه شود.
Table 44. عبارت هدر ICMPv6 (ICMPv6 header expression)
| کلیدواژه | توضیحات | نوع |
| type | فیلد نوع ICMPv6 | icmpv6_type |
| code | فیلد کد ICMPv6 | integer (8 bit) |
| checksum | فیلد چکسام ICMPv6 | integer (16 bit) |
| parameter-problem | اشارهگر به مشکل | integer (32 bit) |
| packet-too-big | مقدار MTU فراتر از حد مجاز (oversized MTU) | integer (32 bit) |
| id | شناسه درخواست/پاسخ اکو | integer (16 bit) |
| sequence | شماره توالی درخواست/پاسخ اکو | integer (16 bit) |
| max-delay | حداکثر تاخیر پاسخ در پرسوجوهای MLD | integer (16 bit) |
| taddr | نشانی هدف در درخواست/اعلان همسایه، هدایت مجدد یا MLD | ipv6_addr |
| daddr | نشانی مقصد هدایت مجدد | ipv6_addr |
عبارت هدر TCP (TCP HEADER EXPRESSION)
tcp {sport | dport | sequence | ackseq | doff | reserved | flags | window | checksum | urgptr}
Table 45. عبارت هدر TCP (TCP header expression)
| کلیدواژه | توضیحات | نوع |
| sport | پورت مبدا | inet_service |
| dport | پورت مقصد | inet_service |
| sequence | شماره توالی | integer (32 bit) |
| ackseq | شماره تایید دریافت (Acknowledgement number) | integer (32 bit) |
| doff | آفست داده (Data offset) | integer (4 bit) FIXME scaling |
| reserved | ناحیه رزروشده | integer (4 bit) |
| flags | فلگهای TCP | tcp_flag |
| window | اندازه پنجره (Window) | integer (16 bit) |
| checksum | چکسام | integer (16 bit) |
| urgptr | اشارهگر فوری (Urgent pointer) | integer (16 bit) |
udp {sport | dport | length | checksum}
Table 46. عبارت هدر UDP (UDP header expression)
| کلیدواژه | توضیحات | نوع |
| sport | پورت مبدا | inet_service |
| dport | پورت مقصد | inet_service |
| length | طول کل بسته | integer (16 bit) |
| checksum | چکسام | integer (16 bit) |
عبارت هدر UDP-LITE (UDP-LITE HEADER EXPRESSION)
udplite {sport | dport | checksum}
Table 47. عبارت هدر UDP-Lite (UDP-Lite header expression)
| کلیدواژه | توضیحات | نوع |
| sport | پورت مبدا | inet_service |
| dport | پورت مقصد | inet_service |
| checksum | چکسام | integer (16 bit) |
عبارت هدر SCTP (SCTP HEADER EXPRESSION)
sctp {sport | dport | vtag | checksum}
sctp chunk CHUNK [ FIELD ]
CHUNK := data | init | init-ack | sack | heartbeat |
heartbeat-ack | abort | shutdown | shutdown-ack | error |
cookie-echo | cookie-ack | ecne | cwr | shutdown-complete
| asconf-ack | forward-tsn | asconf
FIELD := COMMON_FIELD | DATA_FIELD | INIT_FIELD | INIT_ACK_FIELD |
SACK_FIELD | SHUTDOWN_FIELD | ECNE_FIELD | CWR_FIELD |
ASCONF_ACK_FIELD | FORWARD_TSN_FIELD | ASCONF_FIELD
COMMON_FIELD := type | flags | length
DATA_FIELD := tsn | stream | ssn | ppid
INIT_FIELD := init-tag | a-rwnd | num-outbound-streams |
num-inbound-streams | initial-tsn
INIT_ACK_FIELD := INIT_FIELD
SACK_FIELD := cum-tsn-ack | a-rwnd | num-gap-ack-blocks |
num-dup-tsns
SHUTDOWN_FIELD := cum-tsn-ack
ECNE_FIELD := lowest-tsn
CWR_FIELD := lowest-tsn
ASCONF_ACK_FIELD := seqno
FORWARD_TSN_FIELD := new-cum-tsn
ASCONF_FIELD := seqno
Table 48. عبارت هدر SCTP (SCTP header expression)
| کلیدواژه | توضیحات | نوع |
| sport | پورت مبدا | inet_service |
| dport | پورت مقصد | inet_service |
| vtag | تگ اعتبارسنجی (Verification Tag) | integer (32 bit) |
| checksum | چکسام | integer (32 bit) |
| chunk | جستجوی chunk در بسته | بدون FIELD، مقدار بولی نشاندهنده وجود |
Table 49. فیلدهای chunk پروتکل SCTP (SCTP chunk fields)
| نام | عرض به بیت | Chunk | توضیحات |
| type | 8 | all | کاربردی ندارد، توسط نوع chunk تعریف میشود |
| flags | 8 | all | معناشناسی بر اساس هر chunk تعریف میشود |
| length | 16 | all | طول این chunk به بایت، بدون احتساب padding |
| tsn | 32 | data | شماره توالی انتقال (Transmission Sequence Number) |
| stream | 16 | data | شناسه جریان (Stream identifier) |
| ssn | 16 | data | شماره توالی جریان (Stream sequence number) |
| ppid | 32 | data | شناسه پروتکل بار مفید (Payload protocol identifier) |
| init-tag | 32 | init, init-ack | تگ آغاز (Initiate tag) |
| a-rwnd | 32 | init, init-ack, sack | اعتبار پنجره دریافت اعلامشده (Advertised receiver window credit) |
| num-outbound-streams | 16 | init, init-ack | تعداد جریانهای خروجی |
| num-inbound-streams | 16 | init, init-ack | تعداد جریانهای ورودی |
| initial-tsn | 32 | init, init-ack | شماره توالی انتقال اولیه (Initial transmit sequence number) |
| cum-tsn-ack | 32 | sack, shutdown | شماره توالی انتقال تجمعی تاییدشده (Cumulative TSN acknowledged) |
| num-gap-ack-blocks | 16 | sack | تعداد بلوکهای Gap Ack گنجاندهشده |
| num-dup-tsns | 16 | sack | تعداد شمارههای توالی انتقال تکراری دریافت شده |
| lowest-tsn | 32 | ecne, cwr | پایینترین شماره توالی انتقال |
| seqno | 32 | asconf-ack, asconf | شماره توالی (Sequence number) |
| new-cum-tsn | 32 | forward-tsn | شماره توالی انتقال تجمعی جدید |
عبارت هدر DCCP (DCCP HEADER EXPRESSION)
dccp {sport | dport | type}
Table 50. عبارت هدر DCCP (DCCP header expression)
| کلیدواژه | توضیحات | نوع |
| sport | پورت مبدا | inet_service |
| dport | پورت مقصد | inet_service |
| type | نوع بسته | dccp_pkttype |
عبارت هدر احراز هویت (AUTHENTICATION HEADER EXPRESSION)
ah {nexthdr | hdrlength | reserved | spi | sequence}
Table 51. عبارت هدر AH (AH header expression)
| کلیدواژه | توضیحات | نوع |
| nexthdr | پروتکل هدر بعدی | inet_proto |
| hdrlength | طول هدر AH | integer (8 bit) |
| reserved | ناحیه رزروشده | integer (16 bit) |
| spi | شاخص پارامتر امنیتی (Security Parameter Index) | integer (32 bit) |
| sequence | شماره توالی | integer (32 bit) |
عبارت هدر بار مفید امنیتی رمزگذاریشده (ENCRYPTED SECURITY PAYLOAD HEADER EXPRESSION)
esp {spi | sequence}
Table 52. عبارت هدر ESP (ESP header expression)
| کلیدواژه | توضیحات | نوع |
| spi | شاخص پارامتر امنیتی (Security Parameter Index) | integer (32 bit) |
| sequence | شماره توالی | integer (32 bit) |
عبارت هدر IPCOMP (IPCOMP HEADER EXPRESSION)
comp {nexthdr | flags | cpi}
Table 53. عبارت هدر IPComp (IPComp header expression)
| کلیدواژه | توضیحات | نوع |
| nexthdr | پروتکل هدر بعدی | inet_proto |
| flags | فلگها | bitmask |
| cpi | شاخص پارامتر فشردهسازی (compression Parameter Index) | integer (16 bit) |
عبارت هدر GRE (GRE HEADER EXPRESSION)
gre {flags | version | protocol}
gre ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
gre ip6 {version | dscp | ecn | flowlabel | length | nexthdr | hoplimit | saddr | daddr}
عبارت gre برای تطبیق روی فیلدهای هدر gre استفاده میشود. این عبارت همچنین امکان تطبیق روی بسته IPv4 یا IPv6 درون هدر gre را فراهم میکند.
Table 54. عبارت هدر GRE (GRE header expression)
| کلیدواژه | توضیحات | نوع |
| flags | فلگهای checksum، routing، key، sequence و strict source route | integer (5 bit) |
| version | فیلد نسخه gre؛ مقدار 0 برای GRE و مقدار 1 برای PPTP | integer (3 bit) |
| protocol | نوع EtherType بسته کپسولهشده | integer (16 bit) |
تطبیق نشانی مقصد IPv4 داخلی کپسولهشده در gre.
netdev filter ingress gre ip daddr 9.9.9.9 counter
عبارت هدر GENEVE (GENEVE HEADER EXPRESSION)
geneve {vni | flags}
geneve ether {daddr | saddr | type}
geneve vlan {id | dei | pcp | type}
geneve ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
geneve ip6 {version | dscp | ecn | flowlabel | length | nexthdr | hoplimit | saddr | daddr}
geneve tcp {sport | dport | sequence | ackseq | doff | reserved | flags | window | checksum | urgptr}
geneve udp {sport | dport | length | checksum}
عبارت geneve برای تطبیق روی فیلدهای هدر geneve استفاده میشود. هدر geneve یک فریم اترنت را درون یک بسته udp کپسوله میکند. این عبارت مستلزم آن است که تطبیق را به بستههای udp محدود کنید (معمولاً در پورت 6081 طبق پورتهای اختصاصیافته IANA).
Table 55. عبارت هدر GENEVE (GENEVE header expression)
| کلیدواژه | توضیحات | نوع |
| protocol | نوع EtherType بسته کپسولهشده | integer (16 bit) |
| vni | شناسه شبکه مجازی (Virtual Network ID - VNI) | integer (24 bit) |
تطبیق پورت مقصد TCP داخلی کپسولهشده در geneve.
netdev filter ingress udp dport 4789 geneve tcp dport 80 counter
عبارت هدر GRETAP (GRETAP HEADER EXPRESSION)
gretap {vni | flags}
gretap ether {daddr | saddr | type}
gretap vlan {id | dei | pcp | type}
gretap ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
gretap ip6 {version | dscp | ecn | flowlabel | length | nexthdr | hoplimit | saddr | daddr}
gretap tcp {sport | dport | sequence | ackseq | doff | reserved | flags | window | checksum | urgptr}
gretap udp {sport | dport | length | checksum}
عبارت gretap برای تطبیق روی فریم اترنت کپسولهشده درون هدر gre استفاده میشود. از عبارت gre برای تطبیق روی فیلدهای هدر gre استفاده کنید.
تطبیق پورت مقصد TCP داخلی کپسولهشده در gretap.
netdev filter ingress gretap tcp dport 80 counter
عبارت هدر VXLAN (VXLAN HEADER EXPRESSION)
vxlan {vni | flags}
vxlan ether {daddr | saddr | type}
vxlan vlan {id | dei | pcp | type}
vxlan ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
vxlan ip6 {version | dscp | ecn | flowlabel | length | nexthdr | hoplimit | saddr | daddr}
vxlan tcp {sport | dport | sequence | ackseq | doff | reserved | flags | window | checksum | urgptr}
vxlan udp {sport | dport | length | checksum}
عبارت vxlan برای تطبیق روی فیلدهای هدر vxlan استفاده میشود. هدر vxlan یک فریم اترنت را درون یک بسته udp کپسوله میکند. این عبارت مستلزم آن است که تطبیق را به بستههای udp محدود کنید (معمولاً در پورت 4789 طبق پورتهای اختصاصیافته IANA).
Table 56. عبارت هدر VXLAN (VXLAN header expression)
| کلیدواژه | توضیحات | نوع |
| flags | فلگهای vxlan | integer (8 bit) |
| vni | شناسه شبکه مجازی (Virtual Network ID - VNI) | integer (24 bit) |
تطبیق پورت مقصد TCP داخلی کپسولهشده در vxlan.
netdev filter ingress udp dport 4789 vxlan tcp dport 80 counter
عبارت بار مفید خام (RAW PAYLOAD EXPRESSION)
@base,offset,length
عبارت بار مفید خام (Raw payload) دستور بارگذاری length بیت با شروع از offset بیت را میدهد. بیت 0 به اولین بیت اشاره دارد — در زبان برنامهنویسی C، این به بالاترین بیت (topmost bit)، یعنی 0x80 در مورد یک هشتبایتی اشاره میکند. این عبارات برای تطبیق هدرهایی که هنوز عبارت الگوی خوانا برای انسان ندارند مفید هستند. توجه داشته باشید که nft وابستگیهایی را برای عبارتهای بار مفید خام اضافه نمیکند. اگر به عنوان مثال بخواهید فیلدهای پروتکل یک هدر انتقال با شماره پروتکل 5 را مطابقت دهید، باید بستههایی را که هدر انتقال متفاوتی دارند به صورت دستی مستثنی کنید، برای مثال با استفاده از meta l4proto 5 قبل از عبارت خام.
Table 57. پایههای پروتکل بار مفید پشتیبانیشده (Supported payload protocol bases)
| پایه (Base) | توضیحات |
| ll | لایه پیوند (Link layer)، برای مثال هدر اترنت |
| nh | هدر شبکه (Network header)، برای مثال IPv4 یا IPv6 |
| th | هدر انتقال (Transport Header)، برای مثال TCP |
| ih | هدر داخلی / بار مفید (Inner Header / Payload)، یعنی بعد از هدر سطح انتقال L4 |
تطبیق پورت مقصد هم برای UDP و هم TCP.
inet filter input meta l4proto {tcp, udp} @th,16,16 { 53, 80 }
عبارت بالا را میتوان به این صورت نیز نوشت
inet filter input meta l4proto {tcp, udp} th dport { 53, 80 }
این روش راحتتر است، اما مانند نشانهگذاری عبارت خام، هیچ وابستگی ایجاد یا بررسی نمیشود. این مسئولیت کاربر است که تطبیق را به آن دسته از انواع هدر که مفهوم پورت دارند محدود کند. در غیر این صورت، قواعدی که از عبارتهای خام استفاده میکنند به اشتباه با بستههای نامربوط تطبیق داده میشوند؛ به عنوان مثال فیلد SPI بستههای ESP را به اشتباه به عنوان یک پورت تفسیر میکنند.
بازنویسی نشانی سختافزاری هدف بسته arp در صورتی که نشانی پروتکل هدف با یک نشانی دادهشده مطابقت داشته باشد.
input meta iifname enp2s0 arp ptype 0x0800 arp htype 1 arp hlen 6 arp plen 4 @nh,192,32 0xc0a88f10 @nh,144,48 set 0x112233445566 accept
عبارتهای هدر افزونه (EXTENSION HEADER EXPRESSIONS)
عبارتهای هدر افزونه به دادههای موجود در هدرهای پروتکل با اندازه متغیر، مانند هدرهای افزونه IPv6، گزینههای TCP و گزینههای IPv4 اشاره دارند.
در حال حاضر nftables از تطبیق (یافتن) یک هدر افزونه مشخص در IPv6، گزینه TCP یا گزینه IPv4 پشتیبانی میکند.
hbh {nexthdr | hdrlength}
frag {nexthdr | frag-off | more-fragments | id}
rt {nexthdr | hdrlength | type | seg-left}
dst {nexthdr | hdrlength}
mh {nexthdr | hdrlength | checksum | type}
srh {flags | tag | sid | seg-left}
tcp option {eol | nop | maxseg | window | sack-perm | sack | sack0 | sack1 | sack2 | sack3 | timestamp | mptcp } tcp_option_field
ip option { lsrr | ra | rr | ssrr } ip_option_field
نحوهای زیر فقط در یک عبارت رابطهای با نوع بولی در سمت راست، تنها برای بررسی وجود هدر معتبر هستند:
exthdr {hbh | frag | rt | dst | mh}
tcp option {eol | nop | maxseg | window | sack-perm | sack | sack0 | sack1 | sack2 | sack3 | timestamp | mptcp }
ip option { lsrr | ra | rr | ssrr }
dccp option dccp_option_type
Table 58. هدرهای افزونه IPv6 (IPv6 extension headers)
| کلیدواژه | توضیحات |
| hbh | گامبهگام (Hop by Hop) |
| rt | هدر مسیریابی (Routing Header) |
| frag | هدر قطعهبندی (Fragmentation header) |
| dst | گزینههای مقصد (dst options) |
| mh | هدر تحرک/پویایی (Mobility Header) |
| srh | هدر مسیریابی قطعه (Segment Routing Header) |
Table 59. گزینههای TCP (TCP Options)
| کلیدواژه | توضیحات | فیلدهای گزینه TCP |
| eol | پایان لیست گزینهها (End of option list) | - |
| nop | گزینه لایهگذاری ۱ بایتی TCP Nop | - |
| maxseg | حداکثر اندازه سگمنت TCP (TCP Maximum Segment Size) | length, size |
| window | مقیاسبندی پنجره TCP (TCP Window Scaling) | length, count |
| sack-perm | مجوز تأیید دریافت انتخابی TCP (TCP SACK permitted) | length |
| sack | تأیید دریافت انتخابی TCP (نام مستعار بلوک ۰) | length, left, right |
| sack0 | تأیید دریافت انتخابی TCP (بلوک ۰) | length, left, right |
| sack1 | تأیید دریافت انتخابی TCP (بلوک ۱) | length, left, right |
| sack2 | تأیید دریافت انتخابی TCP (بلوک ۲) | length, left, right |
| sack3 | تأیید دریافت انتخابی TCP (بلوک ۳) | length, left, right |
| timestamp | برچسبهای زمانی TCP (TCP Timestamps) | length, tsval, tsecr |
| mptcp | پروتکل TCP چندمسیری (Multipath TCP) | subtype |
انواع داده را میتوان با دستور nft describe tcp option keyword [ fieldname ] پرسوجو کرد.
تطبیق گزینه TCP همچنین از نحو عبارت خام برای دسترسی به گزینههای اختیاری و دلخواه پشتیبانی میکند:
tcp option
tcp option @number,offset,length
Table 60. گزینههای IP (IP Options)
| کلیدواژه | توضیحات | فیلدهای گزینه IP |
| lsrr | مسیریابی مبدا آزاد (Loose Source Route) | length, ptr, addr |
| ra | هشدار مسیریاب (Router Alert) | length, value |
| rr | ثبت مسیر (Record Route) | length, ptr, addr |
| ssrr | مسیریابی مبدا دقیق (Strict Source Route) | length, ptr, addr |
یافتن گزینههای TCP (finding TCP options).
filter input tcp option sack-perm exists counter
تطبیق گزینههای TCP (matching TCP options).
filter input tcp option maxseg size lt 536
تطبیق هدرهای افزونه IPv6 (matching IPv6 exthdr).
ip6 filter input frag more-fragments 1 counter
یافتن گزینه IP (finding IP option).
filter input ip option lsrr exists counter
یافتن گزینه DCCP (finding DCCP option).
filter input dccp option 40 exists counter
عبارتهای ردگیری اتصال (CONNTRACK EXPRESSIONS)
عبارتهای ردگیری اتصال به متادادههای مدخل ردگیری اتصال مرتبط با یک بسته اشاره دارند.
سه نوع عبارت ردگیری اتصال (conntrack) وجود دارد. برخی از عبارتهای conntrack نیازمند مشخص کردن جهت جریان پیش از کلید conntrack هستند، در حالی که برخی دیگر باید مستقیماً استفاده شوند زیرا مستقل از جهت میباشند. کلیدواژههای packets، bytes و avgpkt میتوانند با جهت یا بدون جهت استفاده شوند. اگر جهت درج نشود، مجموع جهتهای اصلی (original) و پاسخ (reply) بازگردانده میشود. همین موضوع در مورد zone نیز صدق میکند؛ اگر جهت مشخص شده باشد، zone تنها در صورتی تطبیق داده میشود که شناسه zone به جهت مشخصشده وابسته باشد.
ct {state | direction | status | mark | expiration | helper | label | count | id}
ct [original | reply] {l3proto | protocol | bytes | packets | avgpkt | zone}
ct {original | reply} {proto-src | proto-dst}
ct {original | reply} {ip | ip6} {saddr | daddr}
انواع اختصاصی conntrack در این جدول، در زیربخش CONNTRACK TYPES در بالا توضیح داده شدهاند.
Table 61. عبارتهای ردگیری اتصال (Conntrack expressions)
| کلیدواژه | توضیحات | نوع |
| state | وضعیت اتصال | ct_state |
| direction | جهت بسته نسبت به اتصال | ct_dir |
| status | وضعیت اتصال | ct_status |
| mark | علامت (mark) اتصال | mark |
| expiration | زمان انقضای اتصال | time |
| helper | برنامه کمکی (Helper) مرتبط با اتصال | string |
| label | بیت برچسب ردگیری اتصال یا نام نمادین تعریفشده در connlabel.conf در مسیر include مربوط به nftables | ct_label |
| l3proto | پروتکل لایه ۳ اتصال | nf_proto |
| saddr | نشانی مبدا اتصال برای جهت مشخصشده | ipv4_addr/ipv6_addr |
| daddr | نشانی مقصد اتصال برای جهت مشخصشده | ipv4_addr/ipv6_addr |
| protocol | پروتکل لایه ۴ اتصال برای جهت مشخصشده | inet_proto |
| proto-src | مبدا پروتکل لایه ۴ برای جهت مشخصشده | integer (16 bit) |
| proto-dst | مقصد پروتکل لایه ۴ برای جهت مشخصشده | integer (16 bit) |
| packets | تعداد بستههای دیدهشده در جهت مشخصشده یا مجموع اصلی و پاسخ | integer (64 bit) |
| bytes | تعداد بایتهای دیدهشده؛ توضیحات کلیدواژه packets را ببینید | integer (64 bit) |
| avgpkt | میانگین بایت در هر بسته؛ توضیحات کلیدواژه packets را ببینید | integer (64 bit) |
| zone | ناحیه ردگیری اتصال (conntrack zone) | integer (16 bit) |
| count | تعداد اتصالات فعلی | integer (32 bit) |
| id | شناسه اتصال | ct_id |
محدود کردن تعداد اتصالات موازی به یک سرور (restrict the number of parallel connections to a server).
nft add set filter ssh_flood '{ type ipv4_addr; flags dynamic; }'
nft add rule filter input ct state new tcp dport 22 add @ssh_flood '{ ip saddr ct count over 2 }' reject
دستورها و گزارهها (STATEMENTS)
گزارهها نشاندهنده اقداماتی هستند که باید انجام شوند. آنها میتوانند جریان کنترل را تغییر دهند (بازگشت، پرش به زنجیرهای دیگر، پذیرش یا دور انداختن بسته) یا میتوانند اقداماتی مانند ثبت گزارش وقایع، رد کردن بسته و غیره را انجام دهند.
گزارهها به دو نوع وجود دارند. گزارههای پایانی ارزیابی قانون فعلی را بدون قید و شرط پایان میدهند، در حالی که گزارههای غیرپایانی یا صرفاً بهصورت شرطی و یا هرگز ارزیابی قانون فعلی را پایان نمیدهند؛ به عبارت دیگر، از دیدگاه ارزیابی قوانین، آنها منفعل هستند. در یک قانون میتواند تعداد دلخواهی گزاره غیرپایانی وجود داشته باشد، اما تنها یک گزاره پایانی منفرد به عنوان آخرین گزاره مجاز است.
گزارههای حکم (VERDICT STATEMENTS)
گزارههای حکم، جریان کنترل را در مجموعه قوانین تغییر داده و تصمیمات خطمشی را برای بستهها صادر میکنند.
{accept | drop | continue | return}
{jump | goto} CHAIN
CHAIN := chain_name | { statement ... }
حکمهای accept و drop احکام مطلق هستند — آنها ارزیابی زنجیره را متوقف میکنند، گویی بسته با همان تصمیم خطمشی معادل به انتهای زنجیره پایه رسیده است. برای جزئیات بیشتر به بخش “ارزیابی کلی مجموعه قوانین (OVERALL EVALUATION OF THE RULESET)” مراجعه کنید.
| accept | پایان زودهنگام ارزیابی. ارزیابی در زنجیره پایه بعدی با اولویت بالاتر یا احتمالاً برابر از همان قلاب (hook) یا در اولین زنجیره پایه یک قلاب بعدی (در صورت وجود) ادامه مییابد. این بدان معناست که بسته همچنان میتواند در زنجیره پایه دیگری و همچنین در هر زنجیره فراخوانیشده از آن دور انداخته شود. به عنوان مثال، یک حکم accept در یک زنجیره از قلاب forward همچنان به شما امکان میدهد بسته را در یک زنجیره پایه دیگر از قلاب forward (یا زنجیرهای که از آن فراخوانی شده) با شماره اولویت بالاتر یا در زنجیرهای متصل به قلاب postrouting دور بیندازید (drop کنید). |
| drop | بسته را بلافاصله دور انداخته و ارزیابی مجموعه قوانین را خاتمه میدهد. هیچ ارزیابی دیگری صورت نمیگیرد. لغو یا بازنویسی حکم drop امکانپذیر نیست. |
| jump CHAIN | موقعیت فعلی را در پشته فراخوانی (call stack) زنجیرهها ذخیره کرده و ارزیابی را در اولین قانون CHAIN ادامه میدهد. هنگامی که به انتهای CHAIN برسد، یک حکم ضمنی return صادر میشود. هرگاه یک حکم مطلق در CHAIN صادر شود (یا به صورت ضمنی توسط یک گزاره شبهحکم اعمال گردد)، ارزیابی همانطور که در بالا توضیح داده شد خاتمه مییابد. |
| goto CHAIN | مشابه jump است، با این تفاوت که موقعیت فعلی در پشته فراخوانی زنجیرهها ذخیره نمیشود. |
| return | ارزیابی زنجیره فعلی را پایان داده، آخرین موقعیت اضافهشده را از پشته فراخوانی زنجیرهها برمیدارد (pop میکند) و ارزیابی را پس از آن موقعیت ادامه میدهد. هنگامی که موقعیتی در پشته برای برداشتن وجود نداشته باشد (حالتی که زنجیره فعلی یا زنجیره پایه باشد یا یک زنجیره معمولی که صرفاً از طریق حکمهای goto به آن رسیده باشند)، ارزیابی زنجیره پایه فعلی (و هر زنجیره معمولی فراخوانیشده از آن) را با استفاده از خطمشی زنجیره پایه به عنوان حکم ضمنی خاتمه میدهد. |
| continue | ارزیابی را با قانون بعدی ادامه میدهد. این رفتار پیشفرض در حالتی است که قانونی هیچ حکمی صادر نکند. |
یک جایگزین برای مشخص کردن نام یک زنجیره معمولی و موجود در CHAIN، تعیین یک زنجیره ناشناس (anonymous chain) به صورت موردی (ad-hoc) است. همانند مجموعههای ناشناس، نمیتوان از قانون دیگری به آن ارجاع داد و همراه با قانونی که شامل آن است حذف خواهد شد.
تمام موارد فوق به طور مشابه برای گزارههایی که متضمن یک حکم هستند نیز صدق میکند: گزارههای redirect، dnat، snat و masquerade در پایان اقدامات مربوط به خود، در داخل یک حکم accept صادر میکنند. گزارههای reject و synproxy در پایان اقدامات مربوط به خود، در داخل یک حکم drop صادر میکنند. بنابراین این گزارهها مانند حکمهای ضمنی خود عمل میکنند، اما با اثرات جانبی (side effects).
استفاده از گزارههای حکم:
# process packets from eth0 and the internal network in from_lan
# chain, drop all packets from eth0 with different source addresses.
filter input iif eth0 ip saddr 192.168.0.0/24 jump from_lan
filter input iif eth0 drop
# jump and goto statements support anonymous chain creation
filter input iif eth0 jump { ip saddr 192.168.0.0/24 drop ; udp dport domain drop; }
گزاره بار مفید (PAYLOAD STATEMENT)
payload_expression set value
گزاره بار مفید محتوای بسته را تغییر میدهد. به عنوان مثال میتوان از آن برای تنظیم فیلد سرآیند DSCP (diffserv) در ip یا برچسبهای جریان (flow labels) در ipv6 استفاده کرد.
مسیریابی برخی بستهها به جای پل زدن:
# redirect tcp:http from 192.160.0.0/16 to local machine for routing instead of bridging # assumes 00:11:22:33:44:55 is local MAC address. bridge input meta iif eth0 ip saddr 192.168.0.0/16 tcp dport 80 meta pkttype set host ether daddr set 00:11:22:33:44:55
تنظیم فیلد سرآیند DSCP در IPv4:
ip forward ip dscp set 42
گزاره هدر افزونه (EXTENSION HEADER STATEMENT)
extension_header_expression set value
گزاره سرآیند افزونه، محتوای بسته را در سرآیندهای با اندازه متغیر تغییر میدهد. در حال حاضر میتوان از این گزاره برای تغییر حداکثر اندازه قطعه (TCP Maximum Segment Size یا TCP MSS) در بستهها، مشابه هدف TCPMSS در iptables استفاده کرد.
تغییر TCP MSS:
tcp flags syn tcp option maxseg size set 1360 # set a size based on route information: tcp flags syn tcp option maxseg size set rt mtu
همچنین میتوانید گزینههای tcp را از طریق کلمه کلیدی reset حذف کنید.
حذف گزینه tcp:
tcp flags syn reset tcp option sack-perm
گزاره گزارش وقایع (LOG STATEMENT)
log [prefix quoted_string] [level syslog-level] [flags log-flags] log group nflog_group [prefix quoted_string] [queue-threshold value] [snaplen size] log level audit
گزاره log ثبت گزارش وقایع بستههای منطبق را فعال میکند. هنگامی که از این گزاره در یک قانون استفاده میشود، هسته لینوکس برخی از اطلاعات تمام بستههای منطبق (مانند فیلدهای سرآیند) را از طریق گزارش هسته (که میتوان آن را با dmesg(1) یا در syslog خواند) چاپ میکند.
در شکل دوم فراخوانی (اگر nflog_group مشخص شده باشد)، هسته لینوکس بسته را به nfnetlink_log منتقل میکند که گزارش را از طریق یک سوکت netlink به گروه مشخصشده ارسال مینماید. یک فرایند فضای کاربری میتواند در این گروه عضو شود تا گزارشها را دریافت کند؛ برای دیمون ثبت گزارش فضای کاربری Netfilter به راهنمای ulogd(8) و در صورتی که مایل به توسعه یک برنامه سفارشی جهت پردازش گزارشهای خود هستید، برای جزئیات به مستندات libnetfilter_log مراجعه کنید.
در شکل سوم فراخوانی (اگر level audit مشخص شده باشد)، هسته لینوکس پیامی را با قالب مناسب برای خواندن با auditd در بافر audit مینویسد. بنابراین هیچ گزینه قالببندی دیگری (مانند prefix یا flags) در این حالت مجاز نیست.
این یک گزاره غیرپایانی است، بنابراین ارزیابی قانون پس از ثبت گزارش بسته ادامه مییابد.
Table 62. گزینههای گزاره log (log statement options)
| کلمه کلیدی | توضیحات | نوع |
| prefix | پیشوند پیام گزارش | رشته نقلقولشده (quoted string) |
| level | سطح گزارشگیری در Syslog | رشته: emerg, alert, crit, err, warn [پیشفرض], notice, info, debug, audit |
| group | گروه NFLOG برای ارسال پیامها به آن | عدد صحیح بدون علامت (۱۶ بیتی) |
| snaplen | طول بار داده بسته برای گنجاندن در پیام netlink | عدد صحیح بدون علامت (۳۲ بیتی) |
| queue-threshold | تعداد بستهها برای صفبندی در هسته پیش از ارسال آنها به فضای کاربری | عدد صحیح بدون علامت (۳۲ بیتی) |
Table 63. فلگهای لاگ (log-flags)
| فلگ | توضیحات |
| tcp sequence | ثبت گزارش شمارههای توالی TCP. |
| tcp options | ثبت گزارش گزینهها از سرآیند بسته TCP. |
| ip options | ثبت گزارش گزینهها از سرآیند بسته IP/IPv6. |
| skuid | ثبت گزارش شناسه کاربر (userid) فرایندی که بسته را تولید کرده است. |
| ether | رمزگشایی نشانیهای MAC و پروتکل. |
| all | فعالسازی تمام فلگهای گزارش فهرستشده در بالا. |
استفاده از گزاره log:
# log the UID which generated the packet and ip options ip filter output log flags skuid flags ip options # log the tcp sequence numbers and tcp options from the TCP packet ip filter output log flags tcp sequence,options # enable all supported log flags ip6 filter output log flags all
گزاره رد بسته (REJECT STATEMENT)
reject [ with REJECT_WITH ]
REJECT_WITH := icmp icmp_reject_code |
icmpv6 icmpv6_reject_code |
icmpx icmpx_reject_code |
tcp reset
یک گزاره reject تلاش میکند در پاسخ به بسته منطبقشده یک بسته خطا ارسال کند و سپس در داخل یک حکم drop صادر مینماید. بنابراین این یک گزاره پایانی با تمام پیامدهای مربوط به آن است (به بخشهای “ارزیابی کلی مجموعه قوانین (OVERALL EVALUATION OF THE RULESET)” و “گزارههای حکم (VERDICT STATEMENTS)” مراجعه کنید). این گزاره فقط در زنجیرههای پایهای که از قلابهای prerouting، input، forward یا output استفاده میکنند، و زنجیرههای معمولی که صرفاً از آن زنجیرهها فراخوانی میشوند، معتبر است.
Table 64. کلمات کلیدی قابل استفاده برای رد بسته هنگام تعیین کد ICMP (Keywords may be used to reject when specifying the ICMP code)
| کلمه کلیدی | مقدار |
| net-unreachable | 0 |
| host-unreachable | 1 |
| prot-unreachable | 2 |
| port-unreachable | 3 |
| frag-needed | 4 |
| net-prohibited | 9 |
| host-prohibited | 10 |
| admin-prohibited | 13 |
Table 65. کلمات کلیدی قابل استفاده برای رد بسته هنگام تعیین کد ICMPv6 (keywords may be used to reject when specifying the ICMPv6 code)
| کلمه کلیدی | مقدار |
| no-route | 0 |
| admin-prohibited | 1 |
| addr-unreachable | 3 |
| port-unreachable | 4 |
| policy-fail | 5 |
| reject-route | 6 |
انتزاع نوع کد ICMPvX مجموعهای از مقادیر است که بین انواع کدهای ICMP و ICMPv6 همپوشانی دارند تا از خانواده inet مورد استفاده قرار گیرند.
Table 66. کلمات کلیدی قابل استفاده هنگام تعیین کد ICMPvX (keywords may be used when specifying the ICMPvX code)
| کلمه کلیدی | مقدار |
| no-route | 0 |
| port-unreachable | 1 |
| host-unreachable | 2 |
| admin-prohibited | 3 |
کد پیشفرض و متداول ICMP برای رد کردن، port-unreachable است.
توجه داشته باشید که در خانواده bridge، گزاره reject فقط در زنجیرههای پایهای مجاز است که به قلابهای input یا prerouting متصل شده باشند.
گزاره شمارنده (COUNTER STATEMENT)
گزاره شمارنده تعداد دفعات تطبیق بستهها را به همراه تعداد بایتها تنظیم میکند.
counter packets number bytes number
counter { packets number | bytes number }
گزاره ردگیری اتصال (CONNTRACK STATEMENT)
از گزاره conntrack میتوان برای تنظیم نشان ردگیری اتصال (conntrack mark) و برچسبهای ردگیری اتصال (conntrack labels) استفاده کرد.
ct {mark | event | label | zone} set value
گزاره ct متادادههای مرتبط با یک اتصال را تنظیم میکند. شناسه ناحیه (zone id) باید پیش از انجام جستجوی ردگیری اتصال اختصاص داده شود، یعنی این کار باید در prerouting و احتمالاً output (اگر بستههای تولیدشده به صورت محلی باید در ناحیه مجزایی قرار گیرند) با اولویت قلاب raw (-300) انجام شود.
برخلاف iptables که در آن انتساب کمکی (helper) در جدول raw انجام میشود، در اینجا helper باید پس از پیدا شدن یک مدخل conntrack منتسب شود؛ به این معنی که با اولویتهای قلاب مساوی یا قبل از -200 کار نخواهد کرد.
Table 67. انواع گزارههای Conntrack (Conntrack statement types)
| کلمه کلیدی | توضیحات | مقدار |
| event | بیتهای رویداد conntrack | ماسک بیتی، عدد صحیح (۳۲ بیتی) |
| helper | نام شیء کمکی ct جهت انتساب به اتصال | رشته نقلقولشده (quoted string) |
| mark | نشان ردگیری اتصال (Connection tracking mark) | mark |
| label | برچسب ردگیری اتصال (Connection tracking label) | label |
| zone | ناحیه conntrack | عدد صحیح (۱۶ بیتی) |
ذخیره nfmark بسته در conntrack:
ct mark set meta mark
تنظیم ناحیه نگاشتشده از طریق رابط:
table inet raw {
chain prerouting {
type filter hook prerouting priority raw;
ct zone set iif map { "eth1" : 1, "veth1" : 2 }
}
chain output {
type filter hook output priority raw;
ct zone set oif map { "eth1" : 1, "veth1" : 2 }
}
}
محدود کردن رویدادهای گزارششده توسط ctnetlink:
ct event set new,related,destroy
گزاره عدم ردگیری (NOTRACK STATEMENT)
گزاره notrack امکان غیرفعال کردن ردگیری اتصال را برای بستههای مشخصی فراهم میکند.
notrack
توجه داشته باشید که برای موثر بودن این گزاره، باید قبل از رخ دادن جستجوی conntrack روی بستهها اعمال شود. بنابراین، باید در زنجیرهای با قلاب prerouting یا output و اولویت قلاب -300 (raw) یا کمتر قرار گیرد.
برای یک نمونه استفاده، به گزاره SYNPROXY (SYNPROXY STATEMENT) مراجعه کنید.
گزاره متاداده (META STATEMENT)
یک گزاره متاداده مقدار یک عبارت متاداده را تنظیم میکند. فیلدهای متاداده موجود عبارتند از: priority، mark، pkttype، nftrace.
meta {mark | priority | pkttype | nftrace | broute} set value
یک گزاره متاداده، متادادههای مرتبط با یک بسته را تنظیم میکند.
Table 68. انواع گزارههای متاداده (Meta statement types)
| کلمه کلیدی | توضیحات | مقدار |
| priority | اولویت بسته در TC | tc_handle |
| mark | نشان بسته (Packet mark) | mark |
| pkttype | نوع بسته | pkt_type |
| nftrace | روشن/خاموش کردن ردگیری بسته در مجموعه قوانین. برای مشاهده ردگیریها از دستور monitor trace استفاده کنید | 0, 1 |
| broute | روشن/خاموش کردن broute. بستهها به جای پل زدن (bridging)، مسیریابی میشوند | 0, 1 |
گزاره محدودیت نرخ (LIMIT STATEMENT)
limit rate [over] packet_number / TIME_UNIT [burst packet_number packets] limit rate [over] byte_number BYTE_UNIT / TIME_UNIT [burst byte_number BYTE_UNIT] TIME_UNIT := second | minute | hour | day BYTE_UNIT := bytes | kbytes | mbytes
گزاره محدودیت نرخ با استفاده از فیلتر سطل ژتون (token bucket filter) بستهها را با نرخی محدود مطابقت میدهد. قانونی که از این گزاره استفاده میکند تا زمانی که به این حد نرسیده باشد تطبیق داده خواهد شد. میتوان از آن در ترکیب با گزاره log برای ایجاد ثبت گزارش با نرخ محدود استفاده کرد. کلمه کلیدی اختیاری over باعث میشود در نرخهای بالاتر از مقدار مشخصشده تطبیق داده شود.
مقدار burst بر اندازه سطل، یعنی تحمل نوسان (jitter tolerance) تأثیر میگذارد. در حالت limit مبتنی بر بسته، سطل دقیقاً به اندازه burst بسته را نگهداری میکند که به طور پیشفرض پنج بسته است. اگر burst بسته را مشخص کنید، باید مقداری غیر صفر باشد. در حالت limit مبتنی بر بایت، حداقل اندازه سطل برابر با مقدار بایت نرخ ارائهشده است و مقدار burst به آن اضافه میشود که به طور پیشفرض صفر بایت است.
Table 69. مقادیر گزاره limit (limit statement values)
| مقدار | توضیحات | نوع |
| packet_number | تعداد بستهها | عدد صحیح بدون علامت (۳۲ بیتی) |
| byte_number | تعداد بایتها | عدد صحیح بدون علامت (۳۲ بیتی) |
گزارههای NAT (NAT STATEMENTS)
snat [[ip | ip6] [ prefix ] to] TARGET_SPEC [FLAGS] dnat [[ip | ip6] [ prefix ] to] TARGET_SPEC [FLAGS] masquerade [to :PORT_SPEC] [FLAGS] redirect [to :PORT_SPEC] [FLAGS] TARGET_SPEC := ADDR_SPEC | [ADDR_SPEC] :PORT_SPEC ADDR_SPEC := address | address - address PORT_SPEC := port | port - port FLAGS := FLAG [, FLAGS] FLAG := persistent | random | fully-random
گزارههای nat تنها از نوعهای زنجیره nat معتبر هستند.
گزارههای snat و masquerade مشخص میکنند که آدرس/پورت مبدا بسته باید تغییر یابد. در حالی که snat فقط در زنجیرههای postrouting و input معتبر است، masquerade تنها در postrouting معنا دارد. گزارههای dnat و redirect فقط در زنجیرههای prerouting و output معتبر هستند و مشخص میکنند که آدرس/پورت مقصد بسته باید تغییر یابد. شما همچنین میتوانید از زنجیرههای غیرپایه که از زنجیرههای پایه با نوع زنجیره nat فراخوانی میشوند استفاده کنید. تمامی بستههای بعدی در این اتصال نیز دستکاری (mangle) خواهند شد و بررسی قوانین متوقف خواهد شد.
گزاره masquerade شکل خاصی از snat است که همواره از آدرس IP رابط خروجی برای ترجمه استفاده میکند. این گزاره بهویژه در دروازهها (gateways) با آدرسهای IP پویا (عمومی) کاربرد دارد.
گزاره redirect شکل خاصی از dnat است که همواره آدرس مقصد را به آدرس میزبان محلی ترجمه میکند. این گزاره برای رهگیری ترافیک عبوری از یک مسیریاب و هدایت آن به یک دیمن محلی در حال اجرا، مثلاً هنگام ساخت پروکسی شفاف (transparent proxy) یا دروازه لایه کاربرد (application-layer gateway) بسیار مفید است.
برای TARGET_SPEC، میتوان آدرسها، پورتها، یا هر دو را مشخص کرد. اگر هیچ آدرس یا پورتی مشخص نشود، فیلد مربوطه در سرآیند بسته بدون تغییر باقی میماند.
هنگام استفاده در خانواده inet (موجود از هسته ۵.۲)، گزارههای dnat و snat در صورت ارائه آدرس نیازمند استفاده از کلمات کلیدی ip و ip6 هستند، به مثالهای زیر نگاه کنید.
پیش از هسته ۴.۱۸، گزارههای nat نیازمند حضور هر دو زنجیره پایه prerouting و postrouting بودند، زیرا در غیر این صورت بستهها در مسیر بازگشت توسط netfilter دیده نمیشدند و بنابراین هیچ ترجمه معکوسی انجام نمیگرفت.
کلمه کلیدی اختیاری prefix امکان نگاشت n آدرس مبدا به n آدرس مقصد را فراهم میکند. به مثالهای پیشرفته NAT در زیر نگاه کنید.
اگر address برای dnat یک آدرس لوپبک IPv4 باشد (یعنی 127.0.0.0/8)، متغیر sysctl با نام "net.ipv4.conf.*.route_localnet" برای رابط ورودی باید روی ۱ تنظیم شود. در غیر این صورت بستهها توسط کد مسیریابی به عنوان "martians" دور انداخته خواهند شد.
جدول ۷۰. مقادیر گزاره NAT (NAT statement values)
| عبارت | توضیحات | نوع |
| address | مشخص میکند که آدرس مبدا/مقصد بسته باید تغییر داده شود. میتوانید یک نگاشت را برای مرتبط کردن فهرستی از تاپلهای متشکل از کلید عبارت دلخواه با مقدار آدرس مشخص کنید. | ipv4_addr, ipv6_addr, e.g. abcd::1234, or you can use a mapping, e.g. meta mark map { 10 : 192.168.1.2, 20 : 192.168.1.3 } |
| port | مشخص میکند که پورت مبدا/مقصد بسته باید تغییر داده شود. | شماره پورت (۱۶ بیتی) |
جدول ۷۱. فلگهای گزاره NAT (NAT statement flags)
| فلگ | توضیحات |
| persistent | برای هر اتصال، آدرس مبدا/مقصد یکسانی را به یک کلاینت اختصاص میدهد. |
| random | در هسته ۵.۰ و جدیدتر این فلگ مشابه fully-random است. در هستههای قدیمیتر نگاشت پورت با استفاده از یک ترکیب هش MD5 دانهبندیشده (seeded) با استفاده از آدرس مبدا و مقصد و پورت مقصد تصادفی خواهد شد. |
| fully-random | در صورت استفاده، نگاشت پورت بر اساس یک الگوریتم شبهتصادفی ۳۲ بیتی تولید میشود. |
استفاده از گزارههای NAT.
# ایجاد یک پیکربندی جدول/زنجیره مناسب برای تمام مثالهای بعدی
add table nat
add chain nat prerouting { type nat hook prerouting priority dstnat; }
add chain nat postrouting { type nat hook postrouting priority srcnat; }
# ترجمه آدرسهای مبدا تمام بستههای خروجی از طریق eth0 به آدرس 1.2.3.4
add rule nat postrouting oif eth0 snat to 1.2.3.4
# تغییر مسیر تمام ترافیک ورودی از طریق eth0 به آدرس مقصد 192.168.1.120
add rule nat prerouting iif eth0 dnat to 192.168.1.120
# ترجمه آدرسهای مبدا تمام بستههای خروجی از طریق eth0 به هر آنچه که
# بستههای تولیدشده محلی به عنوان مبدا برای رسیدن به همان مقصد استفاده میکردند
add rule nat postrouting oif eth0 masquerade
# تغییر مسیر ترافیک ورودی TCP برای پورت 22 به پورت 2222
add rule nat prerouting tcp dport 22 redirect to :2222
# خانواده inet:
# مدیریت ip dnat:
add rule inet nat prerouting dnat ip to 10.0.2.99
# مدیریت ip6 dnat:
add rule inet nat prerouting dnat ip6 to fe80::dead
# این دستور هر دو نوع ipv4 و ipv6 را masquerade میکند:
add rule inet nat postrouting meta oif ppp0 masquerade
مثالهای پیشرفته NAT.
# نگاشت پیشوندهای یک شبکه به شبکه دیگر، برای نمونه 10.141.11.4 به 192.168.2.4،
# 10.141.11.5 به 192.168.2.5 دستکاری میشود و غیره.
add rule nat postrouting snat ip prefix to ip saddr map { 10.141.11.0/24 : 192.168.2.0/24 }
# نگاشت ترکیب آدرس مبدا و پورت مبدا به مجموعهای از آدرسها و پورتهای مقصد:
add rule nat postrouting dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }
# مثال بالا عبارت NAT زیر را تولید میکند:
#
# [ nat dnat ip addr_min reg 1 addr_max reg 10 proto_min reg 9 proto_max reg 11 ]
#
# که انتظار دریافت تاپل زیر را دارد:
# آدرس IP (حداقل)، پورت مبدا (حداقل)، آدرس IP (حداکثر)، پورت مبدا (حداکثر)
# که از نگاشت به دست آید. آدرسها و پورتهای ارائهشده شامل حدود (inclusive) هستند.
# این کار با نگاشتهای نامگذاریشده و همچنین در ترکیب با زنجیرهبندیها و بازهها نیز کار میکند:
table ip nat {
map ipportmap {
typeof ip saddr : interval ip daddr . tcp dport
flags interval
elements = { 192.168.1.2 : 10.141.10.1-10.141.10.3 . 8888-8999, 192.168.2.0/24 : 10.141.11.5-10.141.11.20 . 8888-8999 }
}
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
ip protocol tcp dnat ip to ip saddr map @ipportmap
}
}
@ipportmap پیشوندهای شبکه را به بازهای از میزبانها و پورتها نگاشت میکند.
مقصد جدید از بازه ارائهشده توسط عنصر نگاشت گرفته میشود.
برای پورت مقصد نیز به همین صورت است.
به استفاده از کلمه کلیدی "interval" در توصیف typeof توجه کنید.
این مورد لازم است تا nftables بداند که باید دو برابر فضای ذخیرهسازی
برای هر جفت کلید-مقدار در نگاشت درخواست کند.
": ipv4_addr . inet_service" امکان مرتبط کردن یک آدرس و یک پورت را با هر کلید فراهم میکرد.
اما در این حالت، برای هر کلید باید دو آدرس و دو پورت
(مقادیر حداقل و حداکثر برای هر دو) ذخیره شوند.
گزاره TPROXY (TPROXY STATEMENT)
گزاره Tproxy بسته را بدون تغییر دادن سرآیند بسته به هر نحوی، به یک سوکت محلی تغییر مسیر میدهد. در صورت نبود هر یک از آرگومانها، دادههای بسته ورودی به عنوان پارامتر استفاده میشود. تطبیق Tproxy نیازمند قاعده دیگری است که اطمینان حاصل کند سرآیند پروتکل انتقال مشخص شده است.
tproxy to address:port
tproxy to {address | :port}
این نحو میتواند در جدولهای ip/ip6 که در آنها پروتکل لایه شبکه مشخص است استفاده شود. میتوان آدرس IP یا پورت را مشخص کرد، اما دستکم یکی از آنها الزامی است.
tproxy {ip | ip6} to address[:port]
tproxy to :port
این نحو میتواند در جدولهای inet استفاده شود. پارامتر ip/ip6 خانوادهای را که قاعده با آن تطبیق خواهد یافت مشخص میکند. پارامتر address باید از همین خانواده باشد. هنگامی که فقط port تعریف شده است، خانواده آدرس نباید مشخص شود. در این حالت، قاعده با هر دو خانواده تطبیق خواهد یافت.
جدول ۷۲. مشخصههای tproxy (tproxy attributes)
| نام | توضیحات |
| address | آدرس IP که سوکت شنونده با گزینه IP_TRANSPARENT به آن مقید (bind) شده است. |
| port | پورتی که سوکت شنونده با گزینه IP_TRANSPARENT به آن مقید (bind) شده است. |
مجموعه قوانین نمونه برای گزاره tproxy.
table ip x {
chain y {
type filter hook prerouting priority mangle; policy accept;
tcp dport ntp tproxy to 1.1.1.1 accept
udp dport ssh tproxy to :2222 accept
}
}
table ip6 x {
chain y {
type filter hook prerouting priority mangle; policy accept;
tcp dport ntp tproxy to [dead::beef] accept
udp dport ssh tproxy to :2222 accept
}
}
table inet x {
chain y {
type filter hook prerouting priority mangle; policy accept;
tcp dport 321 tproxy to :22 accept
tcp dport 99 tproxy ip to 1.1.1.1:999 accept
udp dport 155 tproxy ip6 to [dead::beef]:smux accept
}
}
توجه داشته باشید که گزاره tproxy غیرپایانی (non-terminal) است تا امکان پردازشهای بعدی بستهها فراهم شود. این کار اجازه میدهد بستهها برای اشکالزدایی لاگ شوند و همچنین علامت (mark) آنها برای اطمینان از تحویل محلی بستهها از طریق قوانین مسیریابی مبتنی بر سیاست (policy routing) بهروزرسانی شود.
مجموعه قوانین نمونه برای گزاره tproxy همراه با ثبت گزارش (logging) و علامتگذاری متاداده.
table inet x {
chain y {
type filter hook prerouting priority mangle; policy accept;
udp dport 9999 goto {
tproxy to :1234 log prefix "packet tproxied: " meta mark set 1 accept
log prefix "no socket on port 1234 or not transparent?: " drop
}
}
}
از آنجا که سرآیند بستهها بدون تغییر باقی میماند، ممکن است بستهها به جای تحویل محلی هدایت (forward) شوند. همانطور که در بالا اشاره شد، با افزودن قوانین مسیریابی مبتنی بر سیاست و علامتگذاری بسته میتوان از این امر جلوگیری کرد.
قوانین نمونه مسیریابی مبتنی بر سیاست برای تغییر مسیر محلی.
ip rule add fwmark 1 lookup 100 ip route add local 0.0.0.0/0 dev lo table 100
این یک تغییر در رفتار نسبت به هدف قدیمی TPROXY در iptables است که پایانی (terminal) بود. برای پایان دادن به پردازش بسته پس از گزاره tproxy، به خاطر داشته باشید که مانند مثال بالا یک حکم (verdict) صادر کنید.
گزاره SYNPROXY (SYNPROXY STATEMENT)
این گزاره دستتکانی سهمرحلهای TCP (TCP three-way-handshake) را به صورت موازی در بافت netfilter پردازش میکند تا از سیستم محلی یا سیستمهای پسین (backend) محافظت نماید. این گزاره به ردیابی اتصال (connection tracking) نیاز دارد زیرا شمارههای ترتیب (sequence numbers) باید ترجمه شوند.
synproxy [mss mss_value] [wscale wscale_value] [SYNPROXY_FLAGS]
جدول ۷۳. مشخصههای گزاره synproxy (synproxy statement attributes)
| نام | توضیحات |
| mss | حداکثر اندازه قطعه (Maximum segment size) اعلامشده به کلاینتها. این مقدار باید با سیستم پسین مطابقت داشته باشد. |
| wscale | مقیاس پنجره (Window scale) اعلامشده به کلاینتها. این مقدار باید با سیستم پسین مطابقت داشته باشد. |
جدول ۷۴. فلگهای گزاره synproxy (synproxy statement flags)
| فلگ | توضیحات |
| sack-perm | ارسال گزینه تایید انتخابی (selective acknowledgement) کلاینت به سیستم پسین (در صورت عدم وجود غیرفعال خواهد شد). |
| timestamp | ارسال گزینه برچسب زمان (timestamp) کلاینت به سیستم پسین (در صورت عدم وجود غیرفعال خواهد شد؛ همچنین برای تایید انتخابی و مقیاسپذیری پنجره مورد نیاز است). |
مجموعه قوانین نمونه برای گزاره synproxy.
تعیین گزینههای tcp استفادهشده توسط سیستم پسین، از یک سیستم خارجی
tcpdump -pni eth0 -c 1 'tcp[tcpflags] == (tcp-syn|tcp-ack) && port 80' &
telnet 192.0.2.42 80
18:57:24.693307 IP 192.0.2.42.80 > 192.0.2.43.48757:
Flags [S.], seq 360414582, ack 788841994, win 14480,
options [mss 1460,sackOK,
TS val 1409056151 ecr 9690221,
nop,wscale 9],
length 0
خاموش کردن حالت tcp_loose، تا conntrack بستههای خارج از جریان را به عنوان وضعیت INVALID علامتگذاری کند.
echo 0 > /proc/sys/net/netfilter/nf_conntrack_tcp_loose
ردیابینشده کردن (untracked) بستههای SYN.
table ip x {
chain y {
type filter hook prerouting priority raw; policy accept;
tcp flags syn notrack
}
}
گرفتن وضعیتهای UNTRACKED (بستههای SYN) و INVALID (بستههای 3WHS ACK) و ارسال
آنها به SYNPROXY. این قاعده به بستههای SYN با syncookies از نوع SYN+ACK پاسخ میدهد،
برای پاسخ معتبر کلاینت (بستههای 3WHS ACK) وضعیت ESTABLISHED ایجاد میکند و کوکیهای
نادرست را دور میاندازد. ترکیب فلگهایی که در طول 3WHS انتظار نمیروند تطبیق
نخواهند یافت و ادامه مییابند (مانند SYN+FIN، SYN+ACK). در نهایت، دور انداختن بستههای
نامعتبر؛ اینها بستههای خارج از جریانی خواهند بود که با SYNPROXY تطبیق داده نشدهاند.
table ip x {
chain z {
type filter hook input priority filter; policy accept;
ct state invalid, untracked synproxy mss 1460 wscale 9 timestamp sack-perm
ct state invalid drop
}
}
گزاره جریان (FLOW STATEMENT)
یک گزاره flow به ما امکان میدهد جریانهایی را که میخواهیم هدایت آنها از طریق میانبُر زدن (bypass) پشته شبکه لایه ۳ تسریع شود، انتخاب کنیم. شما باید نام flowtable را که میخواهید این جریان به آن واگذار (offload) شود مشخص کنید.
flow add @flowtable
گزاره صف (QUEUE STATEMENT)
این گزاره بسته را با استفاده از گرداننده nfnetlink_queue به فضای کاربری (userspace) منتقل میکند. بسته در صفی قرار میگیرد که با شماره صف ۱۶ بیتی آن مشخص شده است. فضای کاربری میتواند بسته را در صورت تمایل بازرسی کرده و به صورت اختیاری تغییر دهد. فضای کاربری باید یک حکم drop یا accept صادر کند. در صورت accept، پردازش از قلاب زنجیره پایه بعدی از سر گرفته میشود، نه از قاعده پس از حکم queue. برای جزئیات به مستندات libnetfilter_queue مراجعه کنید.
queue [flags QUEUE_FLAGS] [to queue_number] queue [flags QUEUE_FLAGS] [to queue_number_from - queue_number_to] queue [flags QUEUE_FLAGS] [to QUEUE_EXPRESSION ] QUEUE_FLAGS := QUEUE_FLAG [, QUEUE_FLAGS] QUEUE_FLAG := bypass | fanout QUEUE_EXPRESSION := numgen | hash | symhash | MAP STATEMENT
عبارت QUEUE_EXPRESSION میتواند برای محاسبه شماره صف در زمان اجرا با استفاده از عبارتهای hash یا numgen به کار رود. همچنین به شما امکان میدهد با استفاده از گزاره map، شماره صفهای ثابتی را بر اساس ورودیهای خارجی مانند آدرس ip مبدا یا نام رابطها اختصاص دهید.
جدول ۷۵. مقادیر گزاره queue (queue statement values)
| مقدار | توضیحات | نوع |
| queue_number | شماره صف را تنظیم میکند، مقدار پیشفرض 0 است. | unsigned integer (16 bit) |
| queue_number_from | صف اولیه در بازه را در صورت استفاده از fanout تنظیم میکند. | unsigned integer (16 bit) |
| queue_number_to | صف پایانی در بازه را در صورت استفاده از fanout تنظیم میکند. | unsigned integer (16 bit) |
جدول ۷۶. فلگهای گزاره queue (queue statement flags)
| فلگ | توضیحات |
| bypass | اگر برنامه کاربردی فضای کاربری نتواند عقبنشینی کند (پاسخ دهد)، اجازه عبور به بستهها داده میشود. پیش از استفاده از این فلگ، توصیههای تنظیم عملکرد را در مستندات libnetfilter_queue مطالعه کنید. |
| fanout | توزیع بستهها بین چندین صف مختلف. |
گزاره تکثیر بسته (DUP STATEMENT)
گزاره dup برای تکثیر یک بسته و ارسال نسخه کپیشده به مقصدی متفاوت استفاده میشود.
dup to device dup to address device device
جدول ۷۷. مقادیر گزاره Dup (Dup statement values)
| عبارت | توضیحات | نوع |
| address | مشخص میکند که نسخه کپی بسته باید به یک دروازه (gateway) جدید ارسال شود. | ipv4_addr, ipv6_addr, e.g. abcd::1234, or you can use a mapping, e.g. ip saddr map { 192.168.1.2 : 10.1.1.1 } |
| device | مشخص میکند که نسخه کپی باید از طریق device انتقال یابد. | string |
استفاده از گزاره dup.
# ارسال به ماشینی با آدرس ip برابر 10.2.3.4 روی eth0
ip filter forward dup to 10.2.3.4 device "eth0"
# کپی فریم خام به یک رابط دیگر
netdev ingress dup to "eth0"
dup to "eth0"
# ترکیب با نگاشت آدرس مقصد به دروازهها
dup to ip daddr map { 192.168.7.1 : "eth0", 192.168.7.2 : "eth1" }
گزاره هدایت بسته (FWD STATEMENT)
گزاره fwd برای تغییر مسیر یک بسته خام به رابطی دیگر استفاده میشود. این گزاره تنها در قلابهای ingress و egress خانواده netdev در دسترس است. این گزاره مشابه گزاره dup است با این تفاوت که هیچ کپیای ساخته نمیشود.
همچنین میتوانید آدرس هاپ بعدی (next hop) و دستگاهی را که بسته باید به آن هدایت شود مشخص کنید. این کار با انتقال بسته از طریق لایه همسایه، آدرس MAC مبدا و مقصد بسته را بهروزرسانی میکند. این کار همچنین فیلد ttl بسته IP را کاهش میدهد. این ویژگی روشی برای دور زدن مؤثر مسیر هدایت سنتی فراهم کرده و در نتیجه از جستجوی fib (پایگاه اطلاعات هدایت - forwarding information base) صرفنظر میکند.
fwd to device fwd [ip | ip6] to address device device
استفاده از گزاره fwd.
# تغییر مسیر بسته خام به دستگاه netdev ingress fwd to "eth0" # هدایت بسته به هاپ بعدی 192.168.200.1 از طریق دستگاه eth0 netdev ingress ether saddr set fwd ip to 192.168.200.1 device "eth0"
گزاره مجموعه (SET STATEMENT)
گزاره set برای افزودن یا بهروزرسانی پویای عناصر در یک مجموعه (set) از مسیر عبور بسته استفاده میشود. مجموعه setname باید از قبل در جدول مشخصشده وجود داشته باشد و باید با یکی از فلگهای dynamic یا timeout یا هر دو ایجاد شده باشد. اگر عبارت گزاره set شامل یک شیء حالتمند (stateful object) باشد، فلگ dynamic الزامی است. اگر مجموعه با یک انقضای زمانی (timeout) ایجاد شده باشد، فلگ timeout بهصورت تلویحی در نظر گرفته میشود و در صورتی که گزاره set به جای افزودن عناصر آنها را بهروزرسانی کند، این فلگ الزامی است. علاوه بر این، این مجموعهها باید هم حداکثر اندازه مجموعه را مشخص کنند (برای جلوگیری از اتمام حافظه) و هم عناصر آنها چه از طریق تعریف مجموعه و چه از طریق گزارهای که آنها را اضافه یا بهروزرسانی میکند دارای انقضای زمانی باشند (تا تعداد آنها به طور نامحدود رشد نکند). گزاره set میتواند برای نمونه جهت ایجاد لیستهای سیاه پویا (dynamic blacklists) به کار رود.
بهروزرسانیهای پویا همچنین در نگاشتها (maps) پشتیبانی میشوند. در این حالت، قاعده add یا update باید هم کلید و هم عنصر دادهای (مقدار) را که با : از هم جدا شدهاند ارائه دهد.
{add | update} @setname { expression [timeout timeout] [comment string] }
مثال برای لیست سیاه ساده.
# تعریف یک مجموعه، مقید به جدول "filter"، در خانواده "ip".
# انقضای زمانی و اندازه اجباری هستند زیرا ما عناصر را از مسیر بسته اضافه خواهیم کرد.
# مدخلها پس از یک دقیقه منقضی میشوند و در صورت تداوم شرایط محدودیت
# ممکن است دوباره اضافه شوند.
nft add set ip filter blackhole \
"{ type ipv4_addr; flags dynamic; timeout 1m; size 65536; }"
# تعریف یک مجموعه برای ذخیره محدودیت به ازای هر saddr.
# این باید از blackhole جدا باشد زیرا زمان انقضا متفاوت است
nft add set ip filter flood \
"{ type ipv4_addr; flags dynamic; timeout 10s; size 128000; }"
# افزودن رابط داخلی به لیست سفید.
nft add rule ip filter input meta iifname "internal" accept
# دور انداختن بستههای دریافتی از آدرسهای ip لیست سیاه.
nft add rule ip filter input ip saddr @blackhole counter drop
# افزودن آدرسهای ip مبدا به لیست سیاه در صورتی که بیش از ۱۰ درخواست اتصال tcp
# در ثانیه و به ازای هر آدرس ip رخ دهد.
nft add rule ip filter input tcp flags syn tcp dport ssh \
add @flood { ip saddr limit rate over 10/second } \
add @blackhole { ip saddr } \
drop
# بازرسی وضعیت مجموعهها.
nft list set ip filter flood
nft list set ip filter blackhole
# افزودن دستی دو آدرس به blackhole.
nft add element filter blackhole { 10.2.3.4, 10.23.1.42 }
گزاره نگاشت (MAP STATEMENT)
گزاره map برای جستجوی دادهها بر اساس یک کلید ورودی مشخص استفاده میشود.
expression map { MAP_ELEMENTS }
MAP_ELEMENTS := MAP_ELEMENT [, MAP_ELEMENTS]
MAP_ELEMENT := key : value
مقدار key مقداری است که توسط expression بازگردانده میشود.
استفاده از گزاره map.
# انتخاب هدف DNAT بر اساس TCP dport:
# اتصالها به پورت 80 به 192.168.1.100 هدایت میشوند،
# اتصالها به پورت 8888 به 192.168.1.101 هدایت میشوند
nft add rule ip nat prerouting dnat tcp dport map { 80 : 192.168.1.100, 8888 : 192.168.1.101 }
# SNAT بر اساس آدرس مبدا:
# بستههای شبکه 192.168.1.0/24 طوری به نظر میرسند که گویی از 10.0.0.1 ارسال شدهاند،
# بستههای شبکه 192.168.2.0/24 طوری به نظر میرسند که گویی از 10.0.0.2 ارسال شدهاند
nft add rule ip nat postrouting snat to ip saddr map { 192.168.1.0/24 : 10.0.0.1, 192.168.2.0/24 : 10.0.0.2 }
گزاره نگاشت حکم (VMAP STATEMENT)
گزاره نگاشت حکم (vmap) مشابه گزاره map عمل میکند، اما حاوی احکام (verdicts) به عنوان مقادیر است.
expression vmap { VMAP_ELEMENTS }
VMAP_ELEMENTS := VMAP_ELEMENT [, VMAP_ELEMENTS]
VMAP_ELEMENT := key : verdict
استفاده از گزاره vmap.
# پرش به زنجیرههای مختلف بسته به نوع پروتکل لایه ۴:
nft add rule ip filter input ip protocol vmap { tcp : jump tcp-chain, udp : jump udp-chain , icmp : jump icmp-chain }
گزاره XT (XT STATEMENT)
این یک گزاره xt را از رابط سازگاری xtables نشان میدهد. در صورتی که ترجمه در دسترس نباشد یا کامل نباشد، این گزاره به عنوان یک راهکار جایگزین (fallback) عمل میکند.
xt TYPE NAME TYPE := match | target | watcher
مشاهده این گزاره بدین معناست که مجموعه قوانین (یا بخشهایی از آن) توسط iptables-nft ایجاد شده است و برای مدیریت آن باید از همان ابزار استفاده شود.
هشدار: nftables این گزارهها را بازیابی نخواهد کرد.
دستورهای اضافی (ADDITIONAL COMMANDS)
اینها برخی دستورات اضافی موجود در nft هستند.
فهرست هوکها (LIST HOOKS)
این دستور فهرستی از توابعی را که برای خانواده پروتکل مشخصشده ثبت شدهاند نمایش میدهد، از جمله توابعی که به طور ضمنی توسط ماژولهای هسته مانند nf_conntrack ثبت شدهاند.
list hooks [family] list hooks netdev [ device DEVICE_NAME ]
دستور list hooks برای نمایش هر آنچه که روی سیستم فعال است کافی است. هوکها در خانواده netdev به یک دستگاه شبکه وابستهاند. اگر هیچ نام دستگاهی داده نشود، nft تمامی دستگاههای شبکه را در فضای نام شبکه فعلی پرسوجو خواهد کرد. نمونه استفاده:
فهرست کردن تمام هوکهای فعال netfilter در پشته ip یا ip6.
% nft list hooks inet
family ip {
hook prerouting {
-0000000400 ipv4_conntrack_defrag [nf_defrag_ipv4]
-0000000200 ipv4_conntrack_in [nf_conntrack]
-0000000100 nf_nat_ipv4_pre_routing [nf_nat]
}
hook input {
0000000000 chain inet filter input [nf_tables]
+0000000100 nf_nat_ipv4_local_in [nf_nat]
[..]
خروجی بالا میزبانی را نشان میدهد که nat، conntrack و یکپارچهسازی مجدد بستههای ipv4 (packet defragmentation) در آن فعال است. برای هر مکان هوک در خانواده پرسوجوشده، فهرستی از هوکهای فعال با استفاده از فرمت
priority identifier [module_name]
نمایش داده خواهد شد.
مقدار priority ترتیبی را که هوکها فراخوانی میشوند تعیین میکند. این فهرست مرتب شده است و کمترین عدد ابتدا اجرا میشود.
مقدار اولویت هوکهای ثبتشده توسط هسته قابل تغییر نیست. برای زنجیرههای پایه ثبتشده توسط nftables، این مقدار با مقدار priority مشخصشده در تعریف زنجیره پایه مطابقت دارد.
پس از مقدار عددی، اطلاعات مربوط به هوک نشان داده میشود. برای زنجیرههای پایه تعریفشده در nftables، این اطلاعات شامل خانواده جدول، نام جدول و نام زنجیره پایه است. برای هوکهای ناشی از ماژولهای هسته، به جای آن از نام تابع استفاده میشود.
اگر یک module name داده شود، هوک توسط ماژول هستهای با این نام ثبت شده است. میتوانید از دستور modinfo module name برای کسب اطلاعات بیشتر در مورد ماژول استفاده کنید.
این قابلیت نیازمند هستهای است که گزینه CONFIG_NETFILTER_NETLINK_HOOK در آن به صورت ماژول یا توکار (builtin) فعال شده باشد. این ماژول nfnetlink_hook نام دارد.
پایش و نظارت (MONITOR)
دستور monitor به شما امکان میدهد به رویدادهای Netlink تولیدشده توسط زیرسیستم nf_tables گوش دهید. این رویدادها یا مربوط به ایجاد و حذف اشیاء هستند یا مربوط به بستههایی که meta nftrace برای آنها فعال شده است. هنگام وقوع آنها، nft رویدادهای پایششده را در قالب JSON یا قالب بومی nft در خروجی استاندارد (stdout) چاپ میکند.
monitor [new | destroy] MONITOR_OBJECT monitor trace MONITOR_OBJECT := tables | chains | sets | rules | elements | ruleset
برای فیلتر کردن رویدادهای مربوط به یک شیء خاص، از یکی از کلمات کلیدی در MONITOR_OBJECT استفاده کنید.
برای فیلتر کردن رویدادهای مربوط به یک اقدام خاص، از کلمه کلیدی new یا destroy استفاده کنید.
شکل دوم فراخوانی هیچ گزینه دیگری نمیپذیرد و منحصراً رویدادهای تولیدشده برای بستههایی را که nftrace برای آنها فعال است چاپ میکند.
برای پایان دادن به عملیات پایش، کلیدهای ^C را فشار دهید.
گوش دادن به تمام رویدادها، گزارش در قالب بومی nft.
% nft monitor
گوش دادن به قوانین حذفشده، گزارش در قالب JSON.
% nft -j monitor destroy rules
گوش دادن به زنجیرههای جدید و حذفشده، در قالب بومی nft.
% nft monitor chains
گوش دادن به رویدادهای مجموعه قوانین مانند جدول، زنجیره، قانون، مجموعه، شمارندهها و سهمیهها، در قالب بومی nft.
% nft monitor ruleset
ردیابی بستههای ورودی از میزبان 10.0.0.1.
% nft add rule filter input ip saddr 10.0.0.1 meta nftrace set 1 % nft monitor trace
گزارش خطا (ERROR REPORTING)
هنگامی که خطایی شناسایی میشود، nft خط(های) حاوی خطا و موقعیت بخشهای دارای خطا در جریان ورودی را نشان میدهد و بخشهای خطادار را با علامتهای هشتک (^) مشخص میکند. اگر خطا ناشی از ترکیب دو عبارت یا گزاره باشد، بخشی که محدودیتهای نقضشده را اعمال میکند با علامت مد (~) مشخص میشود.
برای خطاهای بازگرداندهشده توسط هسته، nft نمیتواند تشخیص دهد کدام بخشهای ورودی باعث ایجاد خطا شدهاند و کل دستور علامتگذاری میشود.
خطای ناشی از یک عبارت نادرست منفرد.
<cmdline>:1:19-22: Error: Interface does not exist
filter output oif eth0
^^^^
خطای ناشی از ترکیب نامعتبر دو عبارت.
<cmdline>:1:28-36: Error: Right hand side of relational expression (==) must be constant
filter output tcp dport == tcp dport
~~ ^^^^^^^^^
خطای بازگرداندهشده توسط هسته.
<cmdline>:0:0-23: Error: Could not process rule: Operation not permitted filter output oif wlan0 ^^^^^^^^^^^^^^^^^^^^^^^
وضعیت خروج (EXIT STATUS)
در صورت موفقیت، nft با وضعیت خروج ۰ خارج میشود. خطاهای نامشخص باعث خروج با وضعیت ۱، خطاهای تخصیص حافظه با وضعیت ۲ و ناتوانی در باز کردن سوکت Netlink با وضعیت ۳ میشوند.
همچنین ببینید (SEE ALSO)
libnftables(3), libnftables-json(5), iptables(8), ip6tables(8), arptables(8), ebtables(8), ip(8), tc(8)
یک ویکی رسمی در نشانی زیر موجود است: https://wiki.nftables.org
نویسندگان (AUTHORS)
پروژه nftables توسط Patrick McHardy و Pablo Neira Ayuso و همراه با مشارکتکنندگان بسیار دیگری از جامعه Netfilter نوشته شده است.
کپیرایت (COPYRIGHT)
کپیرایت © 2008-2014 Patrick McHardy <kaber@trash.net> کپیرایت © 2013-2018 Pablo Neira Ayuso <pablo@netfilter.org>
پروژه nftables یک نرمافزار آزاد است؛ شما میتوانید آن را تحت شرایط نسخه ۲ از مجوز عمومی همگانی گنو (GNU General Public License) که توسط بنیاد نرمافزارهای آزاد منتشر شده است، بازتوزیع کرده و/یا تغییر دهید.
این مستندات تحت شرایط مجوز کریتیو کامنز انتساب-اشتراکهمانند ۴.۰ (CC BY-SA 4.0) مجوزدهی شده است: http://creativecommons.org/licenses/by-sa/4.0.
| 09/01/2026 |