NFT(8)   NFT(8)

nft - ابزار خط فرمان مدیریت فایروال و فیلترینگ بسته‌های nftables

nft [ -nNscaeSupyjtT ] [ -I directory ] [ -f filename | -i | cmd ...]
nft -h
nft -v

دستور nft ابزار خط فرمانی است که برای راه‌اندازی، نگهداری و بازرسی قوانین فیلترینگ بسته‌ها و دسته‌بندی آن‌ها در هسته لینوکس، در چارچوب nftables استفاده می‌شود. زیرسیستم هسته لینوکس با نام nf_tables شناخته می‌شود و عبارت ‘nf’ مخفف Netfilter است.

این دستور گزینه‌های مختلفی را می‌پذیرد که برای درک بهتر مفهوم و کاربردشان در اینجا به صورت گروه‌بندی‌شده مستند شده‌اند. می‌توانید با اجرای nft --help اطلاعات مربوط به گزینه‌ها را دریافت کنید.

گزینه‌های عمومی:

-h, --help

نمایش پیام راهنما و تمام گزینه‌ها.

-v, --version

نمایش نسخه.

-V

نمایش اطلاعات کامل نسخه، از جمله پیکربندی زمان کامپایل.

گزینه‌های مدیریت ورودی مجموعه قوانین که نحوه بارگذاری مجموعه‌های قوانین را مشخص می‌کنند:

-f, --file filename

خواندن ورودی از filename. اگر filename برابر با - باشد، از stdin خوانده می‌شود. مسیر شاخه منتهی به این فایل به ابتدای فهرست شاخه‌هایی که برای فایل‌های الحاقی (include) جستجو می‌شوند اضافه می‌گردد (نگاه کنید به -I/--includepath).

-D, --define name=value

تعریف یک متغیر. این گزینه را تنها می‌توانید با -f ترکیب کنید.

-i, --interactive

خواندن ورودی از یک واسط تعاملی خط فرمان readline. برای خروج می‌توانید از quit یا نشانگر EOF (که معمولاً CTRL-D است) استفاده کنید.

-I, --includepath directory

افزودن شاخه directory به فهرست شاخه‌های مورد جستجو برای فایل‌های الحاقی (include). این گزینه را می‌توان چندین بار مشخص کرد.

-c, --check

بررسی درستی و اعتبار دستورات بدون اعمال واقعی تغییرات.

-o, --optimize

بهینه‌سازی مجموعه قوانین شما. می‌توانید این گزینه را با -c ترکیب کنید تا بهینه‌سازی‌های پیشنهادی را بررسی نمایید.

قالب‌بندی خروجی فهرست مجموعه قوانین که خروجی دستور list ruleset را تغییر می‌دهد:

-a, --handle

نمایش هندل (handle) اشیاء در خروجی.

-s, --stateless

صرف‌نظر کردن از اطلاعات وضعیت‌مند قوانین و اشیاء وضعیت‌مند در خروجی.

-t, --terse

حذف محتوای مجموعه‌ها (sets) از خروجی.

-S, --service

ترجمه پورت‌ها به نام سرویس‌ها بر اساس تعاریف موجود در etc/services/.

-N, --reversedns

ترجمه آدرس IP به نام‌ها از طریق جستجوی معکوس DNS. این کار ممکن است سرعت نمایش فهرست را به دلیل ایجاد ترافیک شبکه کاهش دهد.

-u, --guid

ترجمه مقادیر عددی UID/GID به نام‌ها بر اساس تعاریف etc/passwd/ و etc/group/.

-n, --numeric

چاپ خروجی کاملاً عددی.

-y, --numeric-priority

نمایش اولویت زنجیره پایه (base chain) به صورت عددی.

-p, --numeric-protocol

نمایش پروتکل لایه ۴ به صورت عددی.

-T, --numeric-time

نمایش مقادیر زمان، روز و ساعت در قالب عددی.

قالب‌بندی خروجی دستور:

-e, --echo

هنگام درج موارد در مجموعه قوانین با استفاده از دستورات add، insert یا replace، اعلان‌ها را درست مانند nft monitor چاپ می‌کند.

-j, --json

قالب‌بندی خروجی در قالب JSON. برای توضیحات ساختار (schema)، به libnftables-json(5) مراجعه کنید.

-d, --debug level

فعال کردن خروجی اشکال‌زدایی (دیباگ). سطح اشکال‌زدایی می‌تواند هر یک از مقادیر scanner، parser، eval، netlink، mnl، proto-ctx، segtree، all باشد. می‌توانید چند سطح را با علامت , از هم جدا کرده و با یکدیگر ترکیب کنید، به عنوان مثال -d eval,mnl.

ورودی به صورت خط به خط تجزیه می‌شود. هنگامی که آخرین نویسه یک خط، درست قبل از نویسه خط جدید، یک بک‌اسلش بدون نقل‌قول (\) باشد، خط بعدی به عنوان ادامه خط در نظر گرفته می‌شود. چند دستور در یک خط را می‌توان با استفاده از نقطه-ویرگول (;) از هم جدا کرد.

علامت هش (#) آغازگر یک توضیح (comment) است. تمام نویسه‌های بعدی در همان خط نادیده گرفته می‌شوند.

شناسه‌ها با یک نویسه الفبایی (a-z,A-Z) شروع می‌شوند که پس از آن صفر یا چند نویسه الفبایی-عددی (a-z,A-Z,0-9) و نویسه‌های اسلش (/)، بک‌اسلش (\)، زیرخط (_) و نقطه (.) قرار می‌گیرند. شناسه‌هایی که از نویسه‌های دیگری استفاده می‌کنند یا با یک کلمه کلیدی تداخل دارند باید داخل نقل‌قول دوگانه (") قرار گیرند.

include filename

سایر فایل‌ها را می‌توان با استفاده از دستور include الحاق کرد. شاخه‌هایی که برای فایل‌های الحاقی جستجو می‌شوند را می‌توان با گزینه -I/--includepath مشخص کرد. می‌توانید این رفتار را با پیشوند دادن ‘./’ به مسیر خود برای اجبار به الحاق فایل‌های واقع در شاخه کاری جاری (یعنی مسیر نسبی) یا با / برای موقعیت فایل بیان‌شده به صورت مسیر مطلق بازنویسی (override) کنید.

اگر -I/--includepath مشخص نشده باشد، nft به شاخه پیش‌فرضی که در زمان کامپایل تعیین شده تکیه می‌کند. می‌توانید این شاخه پیش‌فرض را از طریق گزینه -h/--help به دست آورید.

دستورات الحاق (include) از نمادهای وایلدکارت معمول پوسته (,?,[]) پشتیبانی می‌کنند. اگر از نمادهای وایلدکارت در دستور include استفاده شود، تطبیق نیافتن هیچ فایلی خطا محسوب نمی‌شود. این ویژگی اجازه می‌دهد شاخه‌های الحاقی بالقوه خالی برای دستوراتی مانند include "/etc/firewall/rules/" وجود داشته باشد. موارد منطبق بر اساس ترتیب ترتیبی لوکال C بارگذاری می‌شوند. فایل‌هایی که با نقطه (.) شروع می‌شوند با دستورات include مطابقت داده نمی‌شوند.

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

خانواده‌های آدرس نوع بسته‌هایی را که پردازش می‌شوند تعیین می‌کنند. برای هر خانواده آدرس، هسته شامل قلاب‌هایی (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 یا هر دو نوع را مدیریت می‌کنند. آن‌ها شامل پنج قلاب در مراحل مختلف پردازش بسته در پشته شبکه هستند.

جدول ۱. قلاب‌های خانواده آدرس IPv4/IPv6/Inet

قلاب (Hook) توضیحات
prerouting تمام بسته‌های ورودی به سیستم توسط قلاب prerouting پردازش می‌شوند. این قلاب قبل از فرآیند مسیریابی فراخوانی می‌شود و برای فیلتر کردن زودهنگام یا تغییر ویژگی‌های بسته که بر مسیریابی تأثیر می‌گذارند استفاده می‌شود.
input بسته‌های تحویل داده شده به سیستم محلی توسط قلاب input پردازش می‌شوند.
forward بسته‌های هدایت‌شده به یک میزبان دیگر توسط قلاب forward پردازش می‌شوند.
output بسته‌های ارسال‌شده توسط فرآیندهای محلی توسط قلاب output پردازش می‌شوند.
postrouting تمام بسته‌های خروجی از سیستم توسط قلاب postrouting پردازش می‌شوند.
ingress تمام بسته‌های ورودی به سیستم توسط این قلاب پردازش می‌شوند. این قلاب قبل از گرداننده‌های پروتکل لایه ۳ (و بنابراین قبل از قلاب prerouting) فراخوانی می‌شود و می‌تواند برای فیلتر کردن و اعمال سیاست (policing) استفاده شود. قلاب Ingress فقط برای خانواده Inet در دسترس است (از هسته لینوکس ۵.۱۰ به بعد).

خانواده آدرس ARP بسته‌های ARP دریافتی و ارسالی توسط سیستم را مدیریت می‌کند. این خانواده معمولاً برای دستکاری (mangle) بسته‌های ARP به منظور خوشه‌بندی (clustering) استفاده می‌شود.

جدول ۲. قلاب‌های خانواده آدرس ARP

قلاب (Hook) توضیحات
input بسته‌های تحویل داده شده به سیستم محلی توسط قلاب input پردازش می‌شوند.
output بسته‌های ارسال‌شده توسط سیستم محلی توسط قلاب output پردازش می‌شوند.

خانواده آدرس bridge بسته‌های اترنت عبوری از دستگاه‌های پل (bridge) را مدیریت می‌کند.

فهرست قلاب‌های پشتیبانی‌شده دقیقاً مشابه خانواده‌های آدرس IPv4/IPv6/Inet در بالا است.

خانواده آدرس 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 نخواهد شد.

{list | flush} ruleset [family]

کلمه کلیدی ruleset برای مشخص کردن کل مجموعه جدول‌ها، زنجیره‌ها و غیره که در حال حاضر در هسته وجود دارند استفاده می‌شود. دستورات ruleset زیر در دسترس هستند:

list چاپ مجموعه قوانین در قالبی خوانا برای انسان.
flush پاک کردن کل مجموعه قوانین. توجه داشته باشید که برخلاف iptables، این کار تمام جدول‌ها و هر آنچه درون آن‌هاست را حذف می‌کند و عملاً منجر به یک مجموعه قوانین خالی می‌شود؛ هیچ فیلترینگ بسته‌ای دیگر اتفاق نخواهد افتاد، بنابراین هسته هر بسته معتبری را که دریافت کند می‌پذیرد.

امکان محدود کردن list و flush تنها به یک خانواده آدرس خاص وجود دارد. برای مشاهده فهرست نام‌های معتبر خانواده‌ها، بخش “خانواده‌های آدرس (ADDRESS FAMILIES)” در بالا را ببینید.

از نظر طراحی، خروجی دستور list ruleset می‌تواند به عنوان ورودی nft -f استفاده شود. در عمل، این قابلیت معادل iptables-save و iptables-restore در nft است.

{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 پاکسازی تمام زنجیره‌ها و قوانین جدول مشخص‌شده.

{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)، سه نکته قابل توجه دیگر نیز وجود دارد:

•خانواده netdev صرفاً از دو ترکیب پشتیبانی می‌کند، یعنی نوع filter با قلاب ingress و نوع filter با قلاب egress. زنجیره‌های پایه در این خانواده همچنین نیازمند حضور پارامتر DEVICE هستند زیرا فقط به ازای هر رابط شبکه وجود دارند.
•خانواده arp تنها از قلاب‌های input و output پشتیبانی می‌کند، که هر دو در زنجیره‌هایی از نوع filter هستند.
•خانواده inet همچنین از قلاب ingress (از هسته لینوکس 5.10 به بعد) پشتیبانی می‌کند تا بسته‌های IPv4 و IPv6 را در همان مکان قلاب ingress مربوط به netdev فیلتر کند. این قلاب inet به شما امکان می‌دهد مجموعه‌ها و نگاشت‌ها را بین قلاب‌های معمول prerouting، input، forward، output، postrouting و این قلاب ingress به اشتراک بگذارید.

پارامتر 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 هستند.

{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

این یک خلاصه از نحوه ارزیابی مجموعه قوانین (ruleset) است.

•حتی اگر یک بسته توسط مجموعه قوانین پذیرفته (accept) شود، ممکن است همچنان از طریق روش‌های دیگر دور انداخته شود؛ به عنوان مثال، لینوکس به طور کلی انواع مختلف ICMP را نادیده می‌گیرد و گزینه‌های sysctl مانند net.ipv{4,6}.conf.*.forwarding یا net.ipv4.conf.*.rp_filter. وجود دارند.
•جدول‌ها صرفاً مفهومی در nftables برای ساختاردهی به مجموعه قوانین هستند. آن‌ها نقشی در ارزیابی مجموعه قوانین ندارند.
•بسته‌ها از پشته شبکه عبور می‌کنند و در قلاب‌های (hooks) مختلف (به بخش “خانواده‌های آدرس (ADDRESS FAMILIES)” در بالا برای فهرست قلاب‌ها به ازای هر خانواده آدرس مراجعه کنید) توسط هر زنجیره پایه‌ای (base chain) که به این قلاب‌ها متصل است ارزیابی می‌شوند.
•زنجیره‌های پایه می‌توانند زنجیره‌های معمولی را (از طریق jump و goto) فراخوانی کنند. زنجیره‌های معمولی می‌توانند زنجیره‌های معمولی دیگر را فراخوانی کنند. ارزیابی در زنجیره فراخوانی‌شده ادامه می‌یابد. زنجیره‌های مقیم در یک جدول متفاوت را نمی‌توان فراخوانی کرد.
•برای هر قلاب، زنجیره‌های متصل بر اساس اولویتشان (priorities) ارزیابی می‌شوند. زنجیره‌های با مقدار اولویت کمتر قبل از زنجیره‌های با مقدار بالاتر ارزیابی می‌شوند. ترتیب زنجیره‌هایی با مقدار اولویت یکسان نامشخص است.
•یک حکم (verdict) accept (شامل یک حکم ضمنی از طریق خط‌مشی زنجیره پایه) به ارزیابی زنجیره پایه فعلی پایان می‌دهد. فرقی نمی‌کند که حکم accept در خود زنجیره پایه صادر شده باشد یا در یک زنجیره معمولی که از زنجیره پایه فراخوانی شده است. بسته به زنجیره پایه بعدی پیش می‌رود. بنابراین، یک بسته در نهایت پذیرفته می‌شود اگر و تنها اگر هیچ قانون (مطابق) یا خط‌مشی زنجیره پایه‌ای حکم drop صادر نکند. همه این‌ها برای عبارت‌های شبه‌حکم که متضمن accept هستند، مانند عبارت‌های NAT، نیز صدق می‌کند.
•یک حکم drop (شامل یک حکم ضمنی از طریق خط‌مشی زنجیره پایه) فوراً به ارزیابی کل مجموعه قوانین پایان می‌دهد. هیچ زنجیره دیگری از هیچ قلابی بررسی نخواهد شد. بنابراین امکان‌پذیر نیست که یک حکم drop در زنجیره‌ای بعدی به یک accept تغییر کند. این مورد همچنین برای سایر عبارت‌های پایانی که متضمن drop هستند، مانند reject نیز صدق می‌کند. بدین ترتیب، اگر هر زنجیره پایه از drop به عنوان خط‌مشی خود استفاده کند، همان زنجیره پایه (یا یک زنجیره معمولی که مستقیماً یا غیرمستقیم توسط آن فراخوانی شده) باید حداقل شامل یک قانون مطابقت‌دار accept باشد، در غیر این صورت بسته دور انداخته (drop) خواهد شد.
•با توجه به معناشناسی accept/drop و تنها با در نظر گرفتن تصمیم نهایی درباره اینکه آیا یک بسته پذیرفته یا دور انداخته می‌شود، ترتیب زنجیره‌های پایه مختلف در هر قلاب بر اساس اولویت‌هایشان تنها تا جایی اهمیت دارد که هر یک از آن‌ها بسته یا متاداده آن را تغییر دهد و این امر بر احکام صادرشده توسط زنجیره‌ها تأثیر بگذارد – به جز این، ترتیب نباید اهمیتی داشته باشد (به جز در عملکرد و سایر اثرات جانبی). این همچنین بدان معناست که میان‌بر زدن در تصمیم نهایی فقط از طریق احکام drop (یا به عبارتی عبارت‌های شبه‌حکمی که متضمن drop هستند، مانند reject) امکان‌پذیر است.
•یک حکم jump باعث می‌شود موقعیت فعلی در پشته فراخوانی زنجیره‌ها ذخیره شود و ارزیابی در ابتدای زنجیره معمولی فراخوانی‌شده ادامه یابد. زنجیره‌های فراخوانی‌شده باید از همان جدول باشند و نمی‌توانند زنجیره پایه باشند. هنگامی که به پایان زنجیره فراخوانی‌شده می‌رسد، یک حکم ضمنی return صادر می‌شود. سایر احکام (یا عبارت‌های شبه‌حکم) همان‌طور که در بالا و پایین توضیح داده شده پردازش می‌شوند.
•یک حکم goto مشابه jump است، با این تفاوت که موقعیت فعلی در پشته فراخوانی زنجیره‌ها ذخیره نمی‌شود.
•یک حکم return به ارزیابی زنجیره فعلی پایان می‌دهد، آخرین موقعیت اضافه‌شده را از پشته فراخوانی زنجیره‌ها برمی‌دارد (pop می‌کند) و باعث می‌شود ارزیابی پس از آن موقعیت ادامه یابد. هنگامی که هیچ موقعیتی برای برداشتن وجود ندارد (که در حالتی اتفاق می‌افتد که زنجیره فعلی یا زنجیره پایه باشد یا یک زنجیره معمولی که صرفاً از طریق احکام goto به آن رسیده شده باشد)، ارزیابی زنجیره پایه فعلی (و هر زنجیره معمولی فراخوانی‌شده از آن) با استفاده از خط‌مشی زنجیره پایه به عنوان حکم ضمنی پایان می‌یابد.
•مثال‌هایی برای jump/goto/return:
•base {jump}→ regular-1 {jump}→ regular-2 در پایان regular-2 یا زمانی که یک return در آن صادر شود، ارزیابی پس از موقعیت jump در regular-1 ادامه می‌یابد. در پایان regular-1 یا زمانی که یک return در آن صادر شود، ارزیابی پس از موقعیت jump در base ادامه می‌یابد.
•base {jump}→ regular-1 {goto}→ regular-2 در پایان regular-2 یا زمانی که یک return در آن صادر شود، ارزیابی پس از موقعیت jump در base ادامه می‌یابد.
•base {jump}→ regular-1 {jump}→ regular-2 {goto}→ regular-3 در پایان regular-3 یا زمانی که یک return در آن صادر شود، ارزیابی پس از موقعیت jump در regular-1 ادامه می‌یابد. در پایان regular-1 یا زمانی که یک return در آن صادر شود، ارزیابی پس از موقعیت jump در base ادامه می‌یابد.
•base {jump}→ regular-1 {goto}→ regular-2 {goto}→ regular-3 در پایان regular-3 یا زمانی که یک return در آن صادر شود، ارزیابی پس از موقعیت jump در base ادامه می‌یابد.
•احکام (یعنی: accept, drop, jump, goto, return و continue) و همچنین عبارت‌هایی که متضمن یک حکم هستند (مانند reject یا عبارت‌های NAT) نیز به ارزیابی هرگونه عبارت بعدی در قوانین مربوطه خود پایان می‌دهند (یا به هنگام بارگذاری چنین قوانینی باعث ایجاد خطا می‌شوند). به عنوان مثال در ... counter accept عبارت counter پردازش می‌شود، اما در ... accept counter پردازش نمی‌شود. این موضوع در مورد عبارت comment که همیشه ارزیابی می‌شود، صدق نمی‌کند.

ابزار 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)” مراجعه کنید.

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 مجموعه باید از مهلت زمانی عناصر (حذف خودکار عناصر پس از انقضا) پشتیبانی کند.

{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) برای هر عنصر

{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 فهرست کردن تمامی جدول‌های جریان.

{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).

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"
  }
}

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

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"
        }
}

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\" }

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\" }

عبارت‌ها بیانگر مقادیر هستند؛ خواه مقادیر ثابت مانند آدرس‌های شبکه، شماره پورت‌ها و غیره باشند، یا داده‌های جمع‌آوری‌شده از بسته در طول ارزیابی مجموعه قواعد (ruleset). عبارت‌ها را می‌توان با استفاده از عبارت‌های دودویی، منطقی، رابطه‌ای و انواع دیگر عبارت‌ها ترکیب کرد تا عبارت‌های پیچیده یا رابطه‌ای (تطبیق / match) تشکیل شوند. آن‌ها همچنین به عنوان آرگومان برای انواع خاصی از عملیات مانند NAT، نشانه‌گذاری بسته (packet marking) و غیره استفاده می‌شوند.

هر عبارت دارای یک نوع داده (data type) است که اندازه، تجزیه و نمایش مقادیر نمادین و سازگاری نوع با سایر عبارت‌ها را تعیین می‌کند.

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

انواع داده اندازه، تجزیه و نمایش مقادیر نمادین و سازگاری نوع عبارات را تعیین می‌کنند. تعدادی نوع داده سراسری وجود دارد، علاوه بر این برخی از انواع عبارت، انواع داده‌های بیشتری را تعریف می‌کنند که مختص همان نوع عبارت است. بیشتر انواع داده اندازه ثابتی دارند، با این حال برخی ممکن است اندازه پویایی داشته باشند، مانند نوع رشته (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) integer متغیر -

نوع عدد صحیح (integer) برای مقادیر عددی استفاده می‌شود. این نوع می‌تواند به صورت یک عدد ده‌دهی (decimal)، هگزادسیمال یا هشت‌هشتی (octal) مشخص شود. نوع عدد صحیح اندازه ثابتی ندارد، و اندازه آن توسط عبارتی که برای آن استفاده می‌شود تعیین می‌گردد.

نام کلیدواژه اندازه نوع پایه
ماسک بیتی (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) string متغیر -

نوع رشته (string) برای رشته‌های متنی و کاراکتری استفاده می‌شود. یک رشته با یک نویسه الفبایی (a-zA-Z) آغاز می‌شود که به دنبال آن صفر یا چند نویسه الفبایی‌عددی یا نویسه‌های /، -، _ و . قرار می‌گیرند. علاوه بر این، هر متنی که درون گیومه دوتایی (") قرار گیرد به عنوان رشته شناخته می‌شود.

تعیین نوع رشته (String specification).

# Interface name
filter input iifname eth0
# Weird interface name
filter input iifname "(eth0)"

نام کلیدواژه اندازه نوع پایه
نوع رابط کاربری (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) 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_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_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) 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 ۸ بیت 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 ۸ بیت integer

نوع کد ICMP برای مشخص کردن آسان فیلد کد (code) در هدر ICMP استفاده می‌شود.

نام کلیدواژه اندازه نوع پایه
نوع 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 ۸ بیت integer

نوع کد ICMPv6 برای مشخص کردن آسان فیلد کد (code) در هدر ICMPv6 استفاده می‌شود.

جدول ۲۲. نمای کلی انواع مورد استفاده در عبارت و دستور 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 ۴ بیت 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 expression) است که نشان‌دهنده یک مقدار ثابت یا داده‌ای منفرد از بار داده (payload) بسته، متاداده یا یک ماژول حالت‌مند (stateful) می‌باشد.

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 {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 [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_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 }

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 {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 {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 }

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) بسته اشاره دارند.

ether {daddr | saddr | type}

Table 37. انواع عبارت هدر اترنت (Ethernet header expression types)

کلیدواژه توضیحات نوع
daddr نشانی MAC مقصد ether_addr
saddr نشانی MAC مبدا ether_addr
type EtherType ether_type

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 {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

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 {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 {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)

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 {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 {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)

udplite {sport | dport | checksum}

Table 47. عبارت هدر UDP-Lite (UDP-Lite header expression)

کلیدواژه توضیحات نوع
sport پورت مبدا inet_service
dport پورت مقصد inet_service
checksum چک‌سام integer (16 bit)

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 {sport | dport | type}

Table 50. عبارت هدر DCCP (DCCP header expression)

کلیدواژه توضیحات نوع
sport پورت مبدا inet_service
dport پورت مقصد inet_service
type نوع بسته dccp_pkttype

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)

esp {spi | sequence}

Table 52. عبارت هدر ESP (ESP header expression)

کلیدواژه توضیحات نوع
spi شاخص پارامتر امنیتی (Security Parameter Index) integer (32 bit)
sequence شماره توالی integer (32 bit)

comp {nexthdr | flags | cpi}

Table 53. عبارت هدر IPComp (IPComp header expression)

کلیدواژه توضیحات نوع
nexthdr پروتکل هدر بعدی inet_proto
flags فلگ‌ها bitmask
cpi شاخص پارامتر فشرده‌سازی (compression Parameter Index) integer (16 bit)

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 {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 {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 {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

@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

عبارت‌های هدر افزونه به داده‌های موجود در هدرهای پروتکل با اندازه متغیر، مانند هدرهای افزونه 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) وجود دارد. برخی از عبارت‌های 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

گزاره‌ها نشان‌دهنده اقداماتی هستند که باید انجام شوند. آن‌ها می‌توانند جریان کنترل را تغییر دهند (بازگشت، پرش به زنجیره‌ای دیگر، پذیرش یا دور انداختن بسته) یا می‌توانند اقداماتی مانند ثبت گزارش وقایع، رد کردن بسته و غیره را انجام دهند.

گزاره‌ها به دو نوع وجود دارند. گزاره‌های پایانی ارزیابی قانون فعلی را بدون قید و شرط پایان می‌دهند، در حالی که گزاره‌های غیرپایانی یا صرفاً به‌صورت شرطی و یا هرگز ارزیابی قانون فعلی را پایان نمی‌دهند؛ به عبارت دیگر، از دیدگاه ارزیابی قوانین، آن‌ها منفعل هستند. در یک قانون می‌تواند تعداد دلخواهی گزاره غیرپایانی وجود داشته باشد، اما تنها یک گزاره پایانی منفرد به عنوان آخرین گزاره مجاز است.

گزاره‌های حکم، جریان کنترل را در مجموعه قوانین تغییر داده و تصمیمات خط‌مشی را برای بسته‌ها صادر می‌کنند.

{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_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_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 [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 [ 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 packets number bytes number
counter { packets number | bytes number }

از گزاره 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 امکان غیرفعال کردن ردگیری اتصال را برای بسته‌های مشخصی فراهم می‌کند.

notrack

توجه داشته باشید که برای موثر بودن این گزاره، باید قبل از رخ دادن جستجوی conntrack روی بسته‌ها اعمال شود. بنابراین، باید در زنجیره‌ای با قلاب prerouting یا output و اولویت قلاب -300 (raw) یا کمتر قرار گیرد.

برای یک نمونه استفاده، به گزاره SYNPROXY (SYNPROXY 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 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 تعداد بایت‌ها عدد صحیح بدون علامت (۳۲ بیتی)

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 نیازمند قاعده دیگری است که اطمینان حاصل کند سرآیند پروتکل انتقال مشخص شده است.

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) صادر کنید.

این گزاره دست‌تکانی سه‌مرحله‌ای 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 به ما امکان می‌دهد جریان‌هایی را که می‌خواهیم هدایت آن‌ها از طریق میان‌بُر زدن (bypass) پشته شبکه لایه ۳ تسریع شود، انتخاب کنیم. شما باید نام flowtable را که می‌خواهید این جریان به آن واگذار (offload) شود مشخص کنید.

flow add @flowtable

این گزاره بسته را با استفاده از گرداننده 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 برای تکثیر یک بسته و ارسال نسخه کپی‌شده به مقصدی متفاوت استفاده می‌شود.

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 برای تغییر مسیر یک بسته خام به رابطی دیگر استفاده می‌شود. این گزاره تنها در قلاب‌های 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 برای افزودن یا به‌روزرسانی پویای عناصر در یک مجموعه (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 برای جستجوی داده‌ها بر اساس یک کلید ورودی مشخص استفاده می‌شود.

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) مشابه‌ گزاره 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 را از رابط سازگاری xtables نشان می‌دهد. در صورتی که ترجمه در دسترس نباشد یا کامل نباشد، این گزاره به عنوان یک راهکار جایگزین (fallback) عمل می‌کند.

xt TYPE NAME
TYPE := match | target | watcher

مشاهده این گزاره بدین معناست که مجموعه قوانین (یا بخش‌هایی از آن) توسط iptables-nft ایجاد شده است و برای مدیریت آن باید از همان ابزار استفاده شود.

هشدار: nftables این گزاره‌ها را بازیابی نخواهد کرد.

این‌ها برخی دستورات اضافی موجود در nft هستند.

این دستور فهرستی از توابعی را که برای خانواده پروتکل مشخص‌شده ثبت شده‌اند نمایش می‌دهد، از جمله توابعی که به طور ضمنی توسط ماژول‌های هسته مانند 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 به شما امکان می‌دهد به رویدادهای 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

هنگامی که خطایی شناسایی می‌شود، 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
^^^^^^^^^^^^^^^^^^^^^^^

در صورت موفقیت، nft با وضعیت خروج ۰ خارج می‌شود. خطاهای نامشخص باعث خروج با وضعیت ۱، خطاهای تخصیص حافظه با وضعیت ۲ و ناتوانی در باز کردن سوکت Netlink با وضعیت ۳ می‌شوند.

libnftables(3), libnftables-json(5), iptables(8), ip6tables(8), arptables(8), ebtables(8), ip(8), tc(8)

یک ویکی رسمی در نشانی زیر موجود است: https://wiki.nftables.org

پروژه nftables توسط Patrick McHardy و Pablo Neira Ayuso و همراه با مشارکت‌کنندگان بسیار دیگری از جامعه Netfilter نوشته شده است.

کپی‌رایت © 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