'\" t .\" Title: nft .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: 09/01/2026 .\" Manual: \ \& .\" Source: \ \& .\" Language: Persian .\" .TH "NFT" "8" "09/01/2026" "\ \&" "\ \&" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "نام (NAME)" nft \- ابزار خط فرمان مدیریت فایروال و فیلترینگ بسته‌های nftables .SH "خلاصه دستور (SYNOPSIS)" .sp .nf \fBnft\fR [ \fB\-nNscaeSupyjtT\fR ] [ \fB\-I\fR \fIdirectory\fR ] [ \fB\-f\fR \fIfilename\fR | \fB\-i\fR | \fIcmd\fR \&...] \fBnft\fR \fB\-h\fR \fBnft\fR \fB\-v\fR .fi .SH "توضیحات (DESCRIPTION)" .sp دستور nft ابزار خط فرمانی است که برای راه‌اندازی، نگهداری و بازرسی قوانین فیلترینگ بسته‌ها و دسته‌بندی آن‌ها در هسته لینوکس، در چارچوب nftables استفاده می‌شود\&. زیرسیستم هسته لینوکس با نام nf_tables شناخته می‌شود و عبارت \(oqnf\(cq مخفف Netfilter است\&. .SH "گزینه‌ها (OPTIONS)" .sp این دستور گزینه‌های مختلفی را می‌پذیرد که برای درک بهتر مفهوم و کاربردشان در اینجا به صورت گروه‌بندی‌شده مستند شده‌اند\&. می‌توانید با اجرای \fBnft \-\-help\fR اطلاعات مربوط به گزینه‌ها را دریافت کنید\&. .PP \fBگزینه‌های عمومی:\fR .PP \fB\-h\fR, \fB\-\-help\fR .RS 4 نمایش پیام راهنما و تمام گزینه‌ها\&. .RE .PP \fB\-v\fR, \fB\-\-version\fR .RS 4 نمایش نسخه\&. .RE .PP \fB\-V\fR .RS 4 نمایش اطلاعات کامل نسخه، از جمله پیکربندی زمان کامپایل\&. .RE .PP \fBگزینه‌های مدیریت ورودی مجموعه قوانین که نحوه بارگذاری مجموعه‌های قوانین را مشخص می‌کنند:\fR .PP \fB\-f\fR, \fB\-\-file \fR\fB\fIfilename\fR\fR .RS 4 خواندن ورودی از \fIfilename\fR\&. اگر \fIfilename\fR برابر با \- باشد، از stdin خوانده می‌شود\&. مسیر شاخه منتهی به این فایل به ابتدای فهرست شاخه‌هایی که برای فایل‌های الحاقی (include) جستجو می‌شوند اضافه می‌گردد (نگاه کنید به \fB\-I/\-\-includepath\fR)\&. .RE .PP \fB\-D\fR, \fB\-\-define \fR\fB\fIname=value\fR\fR .RS 4 تعریف یک متغیر\&. این گزینه را تنها می‌توانید با \fI\-f\fR ترکیب کنید\&. .RE .PP \fB\-i\fR, \fB\-\-interactive\fR .RS 4 خواندن ورودی از یک واسط تعاملی خط فرمان readline\&. برای خروج می‌توانید از quit یا نشانگر EOF (که معمولاً CTRL\-D است) استفاده کنید\&. .RE .PP \fB\-I\fR, \fB\-\-includepath directory\fR .RS 4 افزودن شاخه \fIdirectory\fR به فهرست شاخه‌های مورد جستجو برای فایل‌های الحاقی (include)\&. این گزینه را می‌توان چندین بار مشخص کرد\&. .RE .PP \fB\-c\fR, \fB\-\-check\fR .RS 4 بررسی درستی و اعتبار دستورات بدون اعمال واقعی تغییرات\&. .RE .PP \fB\-o\fR, \fB\-\-optimize\fR .RS 4 بهینه‌سازی مجموعه قوانین شما\&. می‌توانید این گزینه را با \fI\-c\fR ترکیب کنید تا بهینه‌سازی‌های پیشنهادی را بررسی نمایید\&. .RE .PP \fBقالب‌بندی خروجی فهرست مجموعه قوانین که خروجی دستور list ruleset را تغییر می‌دهد:\fR .PP \fB\-a\fR, \fB\-\-handle\fR .RS 4 نمایش هندل (handle) اشیاء در خروجی\&. .RE .PP \fB\-s\fR, \fB\-\-stateless\fR .RS 4 صرف‌نظر کردن از اطلاعات وضعیت‌مند قوانین و اشیاء وضعیت‌مند در خروجی\&. .RE .PP \fB\-t\fR, \fB\-\-terse\fR .RS 4 حذف محتوای مجموعه‌ها (sets) از خروجی\&. .RE .PP \fB\-S\fR, \fB\-\-service\fR .RS 4 ترجمه پورت‌ها به نام سرویس‌ها بر اساس تعاریف موجود در etc/services/\&. .RE .PP \fB\-N\fR, \fB\-\-reversedns\fR .RS 4 ترجمه آدرس IP به نام‌ها از طریق جستجوی معکوس DNS\&. این کار ممکن است سرعت نمایش فهرست را به دلیل ایجاد ترافیک شبکه کاهش دهد\&. .RE .PP \fB\-u\fR, \fB\-\-guid\fR .RS 4 ترجمه مقادیر عددی UID/GID به نام‌ها بر اساس تعاریف etc/passwd/ و etc/group/\&. .RE .PP \fB\-n\fR, \fB\-\-numeric\fR .RS 4 چاپ خروجی کاملاً عددی\&. .RE .PP \fB\-y\fR, \fB\-\-numeric\-priority\fR .RS 4 نمایش اولویت زنجیره پایه (base chain) به صورت عددی\&. .RE .PP \fB\-p\fR, \fB\-\-numeric\-protocol\fR .RS 4 نمایش پروتکل لایه ۴ به صورت عددی\&. .RE .PP \fB\-T\fR, \fB\-\-numeric\-time\fR .RS 4 نمایش مقادیر زمان، روز و ساعت در قالب عددی\&. .RE .PP \fBقالب‌بندی خروجی دستور:\fR .PP \fB\-e\fR, \fB\-\-echo\fR .RS 4 هنگام درج موارد در مجموعه قوانین با استفاده از دستورات \fBadd\fR، \fBinsert\fR یا \fBreplace\fR، اعلان‌ها را درست مانند \fBnft monitor\fR چاپ می‌کند\&. .RE .PP \fB\-j\fR, \fB\-\-json\fR .RS 4 قالب‌بندی خروجی در قالب JSON\&. برای توضیحات ساختار (schema)، به libnftables\-json(5) مراجعه کنید\&. .RE .PP \fB\-d\fR, \fB\-\-debug\fR \fIlevel\fR .RS 4 فعال کردن خروجی اشکال‌زدایی (دیباگ)\&. سطح اشکال‌زدایی می‌تواند هر یک از مقادیر \fBscanner\fR، \fBparser\fR، \fBeval\fR، \fBnetlink\fR، \fBmnl\fR، \fBproto\-ctx\fR، \fBsegtree\fR، \fBall\fR باشد\&. می‌توانید چند سطح را با علامت \fI,\fR از هم جدا کرده و با یکدیگر ترکیب کنید، به عنوان مثال \fI\-d eval,mnl\fR\&. .RE .SH "قالب‌های فایل ورودی (INPUT FILE FORMATS)" .SS "قواعد واژگانی (LEXICAL CONVENTIONS)" .sp ورودی به صورت خط به خط تجزیه می‌شود\&. هنگامی که آخرین نویسه یک خط، درست قبل از نویسه خط جدید، یک بک‌اسلش بدون نقل‌قول (\e) باشد، خط بعدی به عنوان ادامه خط در نظر گرفته می‌شود\&. چند دستور در یک خط را می‌توان با استفاده از نقطه-ویرگول (;) از هم جدا کرد\&. .sp علامت هش (#) آغازگر یک توضیح (comment) است\&. تمام نویسه‌های بعدی در همان خط نادیده گرفته می‌شوند\&. .sp شناسه‌ها با یک نویسه الفبایی (a\-z,A\-Z) شروع می‌شوند که پس از آن صفر یا چند نویسه الفبایی-عددی (a\-z,A\-Z,0\-9) و نویسه‌های اسلش (/)، بک‌اسلش (\e)، زیرخط (_) و نقطه (\&.) قرار می‌گیرند\&. شناسه‌هایی که از نویسه‌های دیگری استفاده می‌کنند یا با یک کلمه کلیدی تداخل دارند باید داخل نقل‌قول دوگانه (") قرار گیرند\&. .SS "فایل‌های الحاقی (INCLUDE FILES)" .sp .if n \{\ .RS 4 .\} .nf \fBinclude\fR \fIfilename\fR .fi .if n \{\ .RE .\} .sp سایر فایل‌ها را می‌توان با استفاده از دستور \fBinclude\fR الحاق کرد\&. شاخه‌هایی که برای فایل‌های الحاقی جستجو می‌شوند را می‌توان با گزینه \fB\-I\fR/\fB\-\-includepath\fR مشخص کرد\&. می‌توانید این رفتار را با پیشوند دادن \(oq\&./\(cq به مسیر خود برای اجبار به الحاق فایل‌های واقع در شاخه کاری جاری (یعنی مسیر نسبی) یا با / برای موقعیت فایل بیان‌شده به صورت مسیر مطلق بازنویسی (override) کنید\&. .sp اگر \fB\-I\fR/\fB\-\-includepath\fR مشخص نشده باشد، nft به شاخه پیش‌فرضی که در زمان کامپایل تعیین شده تکیه می‌کند\&. می‌توانید این شاخه پیش‌فرض را از طریق گزینه \fB\-h\fR/\fB\-\-help\fR به دست آورید\&. .sp دستورات الحاق (include) از نمادهای وایلدکارت معمول پوسته (\fB,?,[]) پشتیبانی می‌کنند\&. اگر از نمادهای وایلدکارت در دستور include استفاده شود، تطبیق نیافتن هیچ فایلی خطا محسوب نمی‌شود\&. این ویژگی اجازه می‌دهد شاخه‌های الحاقی بالقوه خالی برای دستوراتی مانند \fR\fB\fBinclude "/etc/firewall/rules/\fR\fR\fB"\fR وجود داشته باشد\&. موارد منطبق بر اساس ترتیب ترتیبی لوکال C بارگذاری می‌شوند\&. فایل‌هایی که با نقطه (\&.) شروع می‌شوند با دستورات include مطابقت داده نمی‌شوند\&. .SS "متغیرهای نمادین (SYMBOLIC VARIABLES)" .sp .if n \{\ .RS 4 .\} .nf \fBdefine\fR \fIvariable\fR \fB=\fR \fIexpr\fR \fBundefine\fR \fIvariable\fR \fBredefine\fR \fIvariable\fR \fB=\fR \fIexpr\fR \fB$variable\fR .fi .if n \{\ .RE .\} .sp متغیرهای نمادین را می‌توان با استفاده از دستور \fBdefine\fR تعریف کرد\&. ارجاع به متغیرها از نوع عبارت (expression) بوده و می‌توان از آن‌ها برای مقداردهی اولیه متغیرهای دیگر استفاده کرد\&. حوزه اثر (scope) یک تعریف، بلوک جاری و تمام بلوک‌های درون آن است\&. متغیرهای نمادین را می‌توان با استفاده از دستور \fBundefine\fR حذف کرد و با دستور \fBredefine\fR تغییر داد\&. .PP \fBاستفاده از متغیرهای نمادین\fR\&. .sp .if n \{\ .RS 4 .\} .nf 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 .fi .if n \{\ .RE .\} .sp .SH "خانواده‌های آدرس (ADDRESS FAMILIES)" .sp خانواده‌های آدرس نوع بسته‌هایی را که پردازش می‌شوند تعیین می‌کنند\&. برای هر خانواده آدرس، هسته شامل قلاب‌هایی (hooks) در مراحل مشخصی از مسیرهای پردازش بسته است که در صورت وجود قوانینی برای این قلاب‌ها، nftables را فراخوانی می‌کنند\&. .TS tab(:); lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp \fBip\fR T}:T{ .sp خانواده آدرس IPv4\&. T} T{ .sp \fBip6\fR T}:T{ .sp خانواده آدرس IPv6\&. T} T{ .sp \fBinet\fR T}:T{ .sp خانواده آدرس اینترنت (IPv4/IPv6)\&. T} T{ .sp \fBarp\fR T}:T{ .sp خانواده آدرس ARP، که بسته‌های IPv4 ARP را مدیریت می‌کند\&. T} T{ .sp \fBbridge\fR T}:T{ .sp خانواده آدرس پل (Bridge)، که بسته‌های عبوری از یک دستگاه پل را مدیریت می‌کند\&. T} T{ .sp \fBnetdev\fR T}:T{ .sp خانواده آدرس Netdev، که بسته‌ها را در مسیر ورودی (ingress) و خروجی (egress) مدیریت می‌کند\&. T} .TE .sp 1 .sp تمام اشیاء nftables در فضاهای نام مختص خانواده آدرس قرار دارند، بنابراین همه شناسه‌ها شامل یک خانواده آدرس هستند\&. اگر شناسه‌ای بدون خانواده آدرس مشخص شود، خانواده \fBip\fR به صورت پیش‌فرض استفاده می‌شود\&. .SS "خانواده‌های آدرس IPV4/IPV6/INET (IPV4/IPV6/INET ADDRESS FAMILIES)" .sp خانواده‌های آدرس IPv4/IPv6/Inet بسته‌های IPv4، IPv6 یا هر دو نوع را مدیریت می‌کنند\&. آن‌ها شامل پنج قلاب در مراحل مختلف پردازش بسته در پشته شبکه هستند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۱.\ \&قلاب‌های خانواده آدرس IPv4/IPv6/Inet .TS allbox tab(:); ltB ltB. T{ قلاب (Hook) T}:T{ توضیحات T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp prerouting T}:T{ .sp تمام بسته‌های ورودی به سیستم توسط قلاب prerouting پردازش می‌شوند\&. این قلاب قبل از فرآیند مسیریابی فراخوانی می‌شود و برای فیلتر کردن زودهنگام یا تغییر ویژگی‌های بسته که بر مسیریابی تأثیر می‌گذارند استفاده می‌شود\&. T} T{ .sp input T}:T{ .sp بسته‌های تحویل داده شده به سیستم محلی توسط قلاب input پردازش می‌شوند\&. T} T{ .sp forward T}:T{ .sp بسته‌های هدایت‌شده به یک میزبان دیگر توسط قلاب forward پردازش می‌شوند\&. T} T{ .sp output T}:T{ .sp بسته‌های ارسال‌شده توسط فرآیندهای محلی توسط قلاب output پردازش می‌شوند\&. T} T{ .sp postrouting T}:T{ .sp تمام بسته‌های خروجی از سیستم توسط قلاب postrouting پردازش می‌شوند\&. T} T{ .sp ingress T}:T{ .sp تمام بسته‌های ورودی به سیستم توسط این قلاب پردازش می‌شوند\&. این قلاب قبل از گرداننده‌های پروتکل لایه ۳ (و بنابراین قبل از قلاب prerouting) فراخوانی می‌شود و می‌تواند برای فیلتر کردن و اعمال سیاست (policing) استفاده شود\&. قلاب Ingress فقط برای خانواده Inet در دسترس است (از هسته لینوکس ۵.۱۰ به بعد)\&. T} .TE .sp 1 .SS "خانواده آدرس ARP (ARP ADDRESS FAMILY)" .sp خانواده آدرس ARP بسته‌های ARP دریافتی و ارسالی توسط سیستم را مدیریت می‌کند\&. این خانواده معمولاً برای دستکاری (mangle) بسته‌های ARP به منظور خوشه‌بندی (clustering) استفاده می‌شود\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲.\ \&قلاب‌های خانواده آدرس ARP .TS allbox tab(:); ltB ltB. T{ قلاب (Hook) T}:T{ توضیحات T} .T& lt lt lt lt. T{ .sp input T}:T{ .sp بسته‌های تحویل داده شده به سیستم محلی توسط قلاب input پردازش می‌شوند\&. T} T{ .sp output T}:T{ .sp بسته‌های ارسال‌شده توسط سیستم محلی توسط قلاب output پردازش می‌شوند\&. T} .TE .sp 1 .SS "خانواده آدرس BRIDGE (BRIDGE ADDRESS FAMILY)" .sp خانواده آدرس bridge بسته‌های اترنت عبوری از دستگاه‌های پل (bridge) را مدیریت می‌کند\&. .sp فهرست قلاب‌های پشتیبانی‌شده دقیقاً مشابه خانواده‌های آدرس IPv4/IPv6/Inet در بالا است\&. .SS "خانواده آدرس NETDEV (NETDEV ADDRESS FAMILY)" .sp خانواده آدرس Netdev بسته‌ها را از مسیر ورودی (ingress) و خروجی (egress) دستگاه مدیریت می‌کند\&. این خانواده به شما امکان می‌دهد بسته‌های هر نوع ethertype مانند ARP،‏ VLAN 802.1q،‏ VLAN 802.1ad (Q\-in\-Q) و همچنین بسته‌های IPv4 و IPv6 را فیلتر کنید\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۳.\ \&قلاب‌های خانواده آدرس Netdev .TS allbox tab(:); ltB ltB. T{ قلاب (Hook) T}:T{ توضیحات T} .T& lt lt lt lt. T{ .sp ingress T}:T{ .sp تمام بسته‌های ورودی به سیستم توسط این قلاب پردازش می‌شوند\&. این قلاب پس از شنودهای شبکه (مانند \fBtcpdump\fR)، درست پس از \fBtc\fR ingress و قبل از گرداننده‌های پروتکل لایه ۳ فراخوانی می‌شود و می‌تواند برای فیلتر کردن زودهنگام و اعمال سیاست استفاده شود\&. T} T{ .sp egress T}:T{ .sp تمام بسته‌های خروجی از سیستم توسط این قلاب پردازش می‌شوند\&. این قلاب پس از گرداننده‌های پروتکل لایه ۳ و قبل از \fBtc\fR egress فراخوانی می‌شود و می‌تواند برای فیلتر کردن دیرهنگام و اعمال سیاست استفاده شود\&. T} .TE .sp 1 .sp بسته‌های تونل‌شده (مانند \fBvxlan\fR) توسط قلاب‌های خانواده netdev هم به صورت کپسول‌زدایی‌شده (decapsulated) و هم کپسوله‌شده (tunneled) پردازش می‌شوند\&. بنابراین یک بسته را می‌توان هم روی شبکه روکش (overlay) و هم روی شبکه زیرساخت فیلتر کرد\&. .sp توجه داشته باشید که ترتیب netfilter و \fBtc\fR در ورودی (ingress) نسبت به خروجی (egress) معکوس (آینه‌ای) است\&. این امر تقارن را برای NAT و سایر تغییرات بسته (mangling) تضمین می‌کند\&. .sp بسته‌های ورودی که به رابط دیگری هدایت (redirect) می‌شوند، تنها در صورتی در خروجی توسط netfilter پردازش می‌شوند که قبلاً مرحله پردازش ورودی netfilter را پشت سر گذاشته باشند\&. بدین ترتیب، بسته‌های ورودی که توسط \fBtc\fR تغییر مسیر داده می‌شوند مشمول netfilter نمی‌شوند\&. اما اگر در ورودی توسط \fBnetfilter\fR تغییر مسیر داده شوند، مشمول آن خواهند شد\&. از نظر مفهومی، tc و netfilter را می‌توان به صورت لایه‌هایی در نظر گرفت که netfilter بالای tc قرار دارد: اگر بسته از لایه tc به لایه netfilter منتقل نشده باشد، در خروجی مشمول netfilter نخواهد شد\&. .SH "مجموعه قوانین (RULESET)" .sp .if n \{\ .RS 4 .\} .nf {\fBlist\fR | \fBflush\fR} \fBruleset\fR [\fIfamily\fR] .fi .if n \{\ .RE .\} .sp کلمه کلیدی \fBruleset\fR برای مشخص کردن کل مجموعه جدول‌ها، زنجیره‌ها و غیره که در حال حاضر در هسته وجود دارند استفاده می‌شود\&. دستورات \fBruleset\fR زیر در دسترس هستند: .TS tab(:); lt lt lt lt. T{ .sp \fBlist\fR T}:T{ .sp چاپ مجموعه قوانین در قالبی خوانا برای انسان\&. T} T{ .sp \fBflush\fR T}:T{ .sp پاک کردن کل مجموعه قوانین\&. توجه داشته باشید که برخلاف iptables، این کار تمام جدول‌ها و هر آنچه درون آن‌هاست را حذف می‌کند و عملاً منجر به یک مجموعه قوانین خالی می‌شود؛ هیچ فیلترینگ بسته‌ای دیگر اتفاق نخواهد افتاد، بنابراین هسته هر بسته معتبری را که دریافت کند می‌پذیرد\&. T} .TE .sp 1 .sp امکان محدود کردن \fBlist\fR و \fBflush\fR تنها به یک خانواده آدرس خاص وجود دارد\&. برای مشاهده فهرست نام‌های معتبر خانواده‌ها، بخش \(lqخانواده‌های آدرس (ADDRESS FAMILIES)\(rq در بالا را ببینید\&. .sp از نظر طراحی، خروجی دستور \fBlist ruleset\fR می‌تواند به عنوان ورودی \fBnft \-f\fR استفاده شود\&. در عمل، این قابلیت معادل \fBiptables\-save\fR و \fBiptables\-restore\fR در nft است\&. .SH "جدول‌ها (TABLES)" .sp .if n \{\ .RS 4 .\} .nf {\fBadd\fR | \fBcreate\fR} \fBtable\fR [\fIfamily\fR] \fItable\fR [\fB{\fR [\fBcomment\fR \fIcomment\fR \fB;\fR] [\fBflags\fR \fIflags\fR \fB;\fR] \fB}\fR] {\fBdelete\fR | \fBdestroy\fR | \fBlist\fR | \fBflush\fR} \fBtable\fR [\fIfamily\fR] \fItable\fR \fBlist tables\fR [\fIfamily\fR] \fBdelete table\fR [\fIfamily\fR] \fBhandle\fR \fIhandle\fR \fBdestroy table\fR [\fIfamily\fR] \fBhandle\fR \fIhandle\fR .fi .if n \{\ .RE .\} .sp جدول‌ها (Tables) ظرف‌هایی برای زنجیره‌ها، مجموعه‌ها و اشیاء دارای وضعیت هستند\&. آن‌ها با خانواده آدرس و نام خود مشخص می‌شوند\&. خانواده آدرس باید یکی از موارد \fBip\fR، \fBip6\fR، \fBinet\fR، \fBarp\fR، \fBbridge\fR یا \fBnetdev\fR باشد\&. خانواده آدرس \fBinet\fR یک خانواده ساختگی (dummy) است که برای ایجاد جدول‌های ترکیبی IPv4/IPv6 استفاده می‌شود\&. کلمه کلیدی \fBmeta expression nfproto\fR می‌تواند برای بررسی اینکه بسته در زمینه کدام خانواده (ipv4 یا ipv6) پردازش می‌شود استفاده شود\&. هنگامی که هیچ خانواده آدرسی مشخص نشده باشد، به‌طور پیش‌فرض از \fBip\fR استفاده می‌شود\&. تنها تفاوت بین add و create این است که دستور اول در صورتی که جدول مشخص‌شده از قبل وجود داشته باشد خطایی بازنمی‌گرداند، در حالی که \fBcreate\fR یک خطا بازمی‌گرداند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&4.\ \&فلگ‌های جدول (Table flags) .TS allbox tab(:); ltB ltB. T{ Flag T}:T{ توضیحات T} .T& lt lt lt lt lt lt. T{ .sp dormant T}:T{ .sp جدول دیگر ارزیابی نمی‌شود (زنجیره‌های پایه ثبت‌نشده / unregistered می‌شوند)\&. T} T{ .sp owner T}:T{ .sp جدول تحت مالکیت فرآیند ایجادکننده است\&. T} T{ .sp persist T}:T{ .sp جدول باید پس از پایان فرآیند مالک نیز باقی بماند\&. T} .TE .sp 1 .sp ایجاد یک جدول با فلگ \fBowner\fR سایر فرآیندها را از دستکاری آن یا محتویاتش منع می‌کند\&. به‌طور پیش‌فرض، هنگامی که فرآیند خاتمه یابد، جدول حذف خواهد شد\&. تنظیم فلگ \fBpersist\fR از این اتفاق جلوگیری می‌کند و جدول یتیم حاصل یک مالک جدید را می‌پذیرد؛ به عنوان مثال یک دیمن در حال راه‌اندازی مجدد که جدول را نگهداری می‌کند\&. .PP \fBافزودن، تغییر و حذف جدول\fR. .sp .if n \{\ .RS 4 .\} .nf # 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 .fi .if n \{\ .RE .\} .sp .TS tab(:); lt lt lt lt lt lt lt lt lt lt. T{ .sp \fBadd\fR T}:T{ .sp افزودن یک جدول جدید برای خانواده داده‌شده با نام مشخص‌شده\&. T} T{ .sp \fBdelete\fR T}:T{ .sp حذف جدول مشخص‌شده\&. T} T{ .sp \fBdestroy\fR T}:T{ .sp حذف جدول مشخص‌شده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمی‌شود\&. T} T{ .sp \fBlist\fR T}:T{ .sp فهرست کردن تمام زنجیره‌ها و قوانین جدول مشخص‌شده\&. T} T{ .sp \fBflush\fR T}:T{ .sp پاکسازی تمام زنجیره‌ها و قوانین جدول مشخص‌شده\&. T} .TE .sp 1 .SH "زنجیره‌ها (CHAINS)" .sp .if n \{\ .RS 4 .\} .nf {\fBadd\fR | \fBcreate\fR} \fBchain\fR [\fIfamily\fR] \fItable\fR \fIchain\fR [\fB{ type\fR \fItype\fR \fBhook\fR \fIhook\fR [\fIDEVICE\fR] \fBpriority\fR \fIpriority\fR \fB;\fR [\fBpolicy\fR \fIpolicy\fR \fB;\fR] [\fBcomment\fR \fIcomment\fR \fB;\fR] \fB}\fR] {\fBdelete\fR | \fBdestroy\fR | \fBlist\fR | \fBflush\fR} \fBchain\fR [\fIfamily\fR] \fItable\fR \fIchain\fR \fBlist chains\fR [\fIfamily\fR] [\fItable\fR] \fBdelete chain\fR [\fIfamily\fR] \fItable\fR \fBhandle\fR \fIhandle\fR \fBdestroy chain\fR [\fIfamily\fR] \fItable\fR \fBhandle\fR \fIhandle\fR \fBrename chain\fR [\fIfamily\fR] \fItable\fR \fIchain\fR \fInewname\fR \fIDEVICE\fR := {\fBdevice\fR \fIDEVICE_NAME\fR | \fBdevices = {\fR \fIDEVICE_LIST\fR \fB}\fR} \fIDEVICE_LIST\fR := \fIDEVICE_NAME\fR [\fB,\fR \fIDEVICE_LIST\fR] \fIDEVICE_NAME\fR := \fIstring\fR | \fIstring\fR\fB*\fR .fi .if n \{\ .RE .\} .sp زنجیره‌ها ظرف‌هایی برای قوانین هستند\&. آن‌ها در دو نوع وجود دارند: زنجیره‌های پایه (base chains) و زنجیره‌های معمولی (regular chains)\&. یک زنجیره پایه، نقطه ورودی بسته‌ها از پشته شبکه (networking stack) است؛ یک زنجیره معمولی می‌تواند به عنوان هدف پرش استفاده شود و برای سازماندهی بهتر قوانین به کار می‌رود\&. زنجیره‌های معمولی می‌توانند ناشناس باشند؛ برای جزئیات به مثال‌های \fBVERDICT STATEMENT\fR مراجعه کنید\&. .TS tab(:); lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp \fBadd\fR T}:T{ .sp افزودن یک زنجیره جدید در جدول مشخص‌شده\&. هنگامی که مقادیر hook و priority مشخص شده باشند، زنجیره به عنوان یک زنجیره پایه ایجاد شده و به پشته شبکه متصل می‌شود\&. T} T{ .sp \fBcreate\fR T}:T{ .sp مشابه دستور \fBadd\fR است، اما اگر زنجیره از قبل وجود داشته باشد خطایی بازمی‌گرداند\&. T} T{ .sp \fBdelete\fR T}:T{ .sp حذف زنجیره مشخص‌شده\&. زنجیره نباید شامل هیچ قانونی باشد یا به عنوان هدف پرش استفاده شود\&. T} T{ .sp \fBdestroy\fR T}:T{ .sp حذف زنجیره مشخص‌شده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمی‌شود\&. زنجیره نباید شامل هیچ قانونی باشد یا به عنوان هدف پرش استفاده شود\&. T} T{ .sp \fBrename\fR T}:T{ .sp تغییر نام زنجیره مشخص‌شده\&. T} T{ .sp \fBlist\fR T}:T{ .sp فهرست کردن تمام قوانین زنجیره مشخص‌شده\&. T} T{ .sp \fBflush\fR T}:T{ .sp پاکسازی تمام قوانین زنجیره مشخص‌شده\&. T} .TE .sp 1 .sp برای زنجیره‌های پایه، پارامترهای \fBtype\fR، \fBhook\fR و \fBpriority\fR الزامی هستند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&5.\ \&انواع زنجیره‌های پشتیبانی‌شده (Supported chain types) .TS allbox tab(:); ltB ltB ltB ltB. T{ Type T}:T{ Families T}:T{ Hooks T}:T{ توضیحات T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp filter T}:T{ .sp all T}:T{ .sp all T}:T{ .sp نوع زنجیره استاندارد برای استفاده در مواقع تردید\&. T} T{ .sp nat T}:T{ .sp ip, ip6, inet T}:T{ .sp prerouting, input, output, postrouting T}:T{ .sp زنجیره‌هایی از این نوع، ترجمه آدرس بومی (Native Address Translation) را بر اساس مدخل‌های conntrack انجام می‌دهند\&. تنها نخستین بسته از یک اتصال عملاً از این زنجیره عبور می‌کند \- قوانین آن معمولاً جزئیات مدخل conntrack ایجادشده را مشخص می‌کنند (به عنوان مثال گزاره‌های NAT)\&. T} T{ .sp route T}:T{ .sp ip, ip6, inet T}:T{ .sp output T}:T{ .sp اگر بسته‌ای از زنجیره‌ای از این نوع عبور کرده باشد و در آستانه پذیرش (accept) باشد، در صورتی که بخش‌های مرتبط سرآیند IP تغییر کرده باشند، یک جستجوی مسیر (route lookup) جدید انجام می‌شود\&. این کار امکان پیاده‌سازی مواردی مانند انتخاب‌کننده‌های مسیریابی مبتنی بر پالیسی (policy routing) را در nftables فراهم می‌کند\&. T} .TE .sp 1 .sp جدا از موارد خاص نشان داده شده در بالا (به عنوان مثال عدم پشتیبانی نوع \fBnat\fR از قلاب \fBforward\fR یا پشتیبانی نوع \fBroute\fR تنها از قلاب \fBoutput\fR)، سه نکته قابل توجه دیگر نیز وجود دارد: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} خانواده netdev صرفاً از دو ترکیب پشتیبانی می‌کند، یعنی نوع \fBfilter\fR با قلاب \fBingress\fR و نوع \fBfilter\fR با قلاب \fBegress\fR\&. زنجیره‌های پایه در این خانواده همچنین نیازمند حضور پارامتر \fIDEVICE\fR هستند زیرا فقط به ازای هر رابط شبکه وجود دارند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} خانواده arp تنها از قلاب‌های \fBinput\fR و \fBoutput\fR پشتیبانی می‌کند، که هر دو در زنجیره‌هایی از نوع \fBfilter\fR هستند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} خانواده inet همچنین از قلاب \fBingress\fR (از هسته لینوکس 5\&.10 به بعد) پشتیبانی می‌کند تا بسته‌های IPv4 و IPv6 را در همان مکان قلاب \fBingress\fR مربوط به netdev فیلتر کند\&. این قلاب inet به شما امکان می‌دهد مجموعه‌ها و نگاشت‌ها را بین قلاب‌های معمول \fBprerouting\fR، \fBinput\fR، \fBforward\fR، \fBoutput\fR، \fBpostrouting\fR و این قلاب \fBingress\fR به اشتراک بگذارید\&. .RE .sp پارامتر \fBdevice\fR نام یک رابط شبکه را به عنوان یک رشته می‌پذیرد، و هنگام افزودن یک زنجیره پایه که ترافیک را روی قلاب‌های ingress یا egress فیلتر می‌کند الزامی است\&. هر زنجیره ingress یا egress تنها ترافیک رابط مشخص‌شده در پارامتر \fBdevice\fR را فیلتر خواهد کرد\&. همچنین می‌توان با استفاده از پارامتر \fBdevices\fR از همان زنجیره پایه برای چندین دستگاه استفاده کرد\&. .sp در هسته‌های جدیدتر، با تعیین پسوند ستاره (*)، پشتیبانی اولیه‌ای از نویسه‌های عام (wildcards) در \fIDEVICE_NAME\fR نیز وجود دارد\&. زنجیره روی تمام رابط‌هایی که با پیشوند داده‌شده مطابقت دارند اعمال خواهد شد\&. از دستور \fBlist hooks\fR برای مشاهده وضعیت فعلی استفاده کنید\&. .sp پارامتر \fBpriority\fR یک مقدار عدد صحیح علامت‌دار یا یک نام اولویت استاندارد را می‌پذیرد که ترتیب پیمایش زنجیره‌های دارای مقدار \fBhook\fR یکسان را (صرف‌نظر از جدولی که به آن تعلق دارند) مشخص می‌کند\&. ترتیب صعودی است: برای هر قلاب، زنجیره‌های با مقادیر اولویت کمتر قبل از زنجیره‌های با مقادیر بالاتر ارزیابی می‌شوند\&. ترتیب ارزیابی زنجیره‌های با اولویت یکسان نامشخص است\&. .sp در زنجیره‌های از نوع \fBnat\fR، حد انحصاری پایینی معادل \-200 برای مقادیر \fBpriority\fR وجود دارد، زیرا conntrack در این اولویت قلاب می‌شود و NAT به آن نیاز دارد\&. .sp مقادیر اولویت استاندارد را می‌توان با نام‌هایی که به‌خاطرسپاری آن‌ها آسان است جایگزین کرد\&. همه نام‌ها در هر خانواده با هر قلاب کاربرد ندارند (به ماتریس‌های سازگاری زیر مراجعه کنید) اما مقدار عددی آن‌ها همچنان می‌تواند برای اولویت‌بندی زنجیره‌ها استفاده شود\&. .sp این نام‌ها و مقادیر بر اساس اولویت‌هایی که xtables هنگام ثبت زنجیره‌های پیش‌فرض خود استفاده می‌کند، تعریف شده و در دسترس قرار گرفته‌اند\&. .sp بیشتر خانواده‌ها از مقادیر یکسانی استفاده می‌کنند، اما bridge از مقادیر متفاوتی نسبت به بقیه استفاده می‌کند\&. برای شرح مقادیر و سازگاری به جدول‌های زیر مراجعه کنید\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&6.\ \&ماتریس سازگاری نام‌های اولویت استاندارد، خانواده و قلاب (Standard priority names, family and hook compatibility matrix) .TS allbox tab(:); ltB ltB ltB ltB. T{ Name T}:T{ Value T}:T{ Families T}:T{ Hooks T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp raw T}:T{ .sp \-300 T}:T{ .sp ip, ip6, inet T}:T{ .sp all T} T{ .sp mangle T}:T{ .sp \-150 T}:T{ .sp ip, ip6, inet T}:T{ .sp all T} T{ .sp dstnat T}:T{ .sp \-100 T}:T{ .sp ip, ip6, inet T}:T{ .sp prerouting T} T{ .sp filter T}:T{ .sp 0 T}:T{ .sp ip, ip6, inet, arp, netdev T}:T{ .sp all T} T{ .sp security T}:T{ .sp 50 T}:T{ .sp ip, ip6, inet T}:T{ .sp all T} T{ .sp srcnat T}:T{ .sp 100 T}:T{ .sp ip, ip6, inet T}:T{ .sp postrouting T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&7.\ \&نام‌های اولویت استاندارد و سازگاری قلاب برای خانواده bridge (Standard priority names and hook compatibility for the bridge family) .TS allbox tab(:); lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp Name T}:T{ .sp Value T}:T{ .sp Hooks T} T{ .sp dstnat T}:T{ .sp \-300 T}:T{ .sp prerouting T} T{ .sp filter T}:T{ .sp \-200 T}:T{ .sp all T} T{ .sp out T}:T{ .sp 100 T}:T{ .sp output T} T{ .sp srcnat T}:T{ .sp 300 T}:T{ .sp postrouting T} .TE .sp 1 .sp عبارات محاسباتی پایه‌ای (جمع و تفریق) را نیز می‌توان با این نام‌های استاندارد برای تسهیل اولویت‌بندی نسبی استفاده کرد، به عنوان مثال \fBmangle \- 5\fR نشان‌دهنده \fB\-155\fR است\&. مقادیر تا زمانی که فاصله آن‌ها از مقدار استاندارد بیشتر از ۱۰ نباشد، به همین صورت چاپ خواهند شد\&. .sp زنجیره‌های پایه همچنین امکان تعیین \fBpolicy\fR (خط‌مشی) زنجیره را فراهم می‌کنند، یعنی اینکه چه اتفاقی برای بسته‌هایی که صراحتاً در قوانین موجود پذیرفته یا رد نشده‌اند رخ دهد\&. مقادیر خط‌مشی پشتیبانی‌شده \fBaccept\fR (که پیش‌فرض است) یا \fBdrop\fR هستند\&. .SH "قوانین (RULES)" .sp .if n \{\ .RS 4 .\} .nf {\fBadd\fR | \fBinsert\fR} \fBrule\fR [\fIfamily\fR] \fItable\fR \fIchain\fR [\fBhandle\fR \fIhandle\fR | \fBindex\fR \fIindex\fR] \fIstatement\fR \&... [\fBcomment\fR \fIcomment\fR] \fBreplace rule\fR [\fIfamily\fR] \fItable\fR \fIchain\fR \fBhandle\fR \fIhandle\fR \fIstatement\fR \&... [\fBcomment\fR \fIcomment\fR] {\fBdelete\fR | \fBreset\fR} \fBrule\fR [\fIfamily\fR] \fItable\fR \fIchain\fR \fBhandle\fR \fIhandle\fR \fBdestroy rule\fR [\fIfamily\fR] \fItable\fR \fIchain\fR \fBhandle\fR \fIhandle\fR \fBreset rules\fR [\fIfamily\fR] [\fItable\fR [\fIchain\fR]] .fi .if n \{\ .RE .\} .sp قوانین به زنجیره‌ها در جدول داده‌شده اضافه می‌شوند\&. اگر خانواده مشخص نشده باشد، از خانواده ip استفاده می‌شود\&. قوانین بر اساس مجموعه‌ای از قواعد دستوری از دو نوع جزء ساخته می‌شوند: عبارت‌ها (expressions) و گزاره‌ها (statements)\&. .sp دستورات add و insert از یک مشخص‌کننده مکان اختیاری پشتیبانی می‌کنند، که یا یک \fIhandle\fR (دسته) است یا \fIindex\fR (اندیس، شروع از صفر) یک قانون موجود\&. در سطح داخلی، مکان‌های قوانین همیشه با \fIhandle\fR شناسایی می‌شوند و تبدیل از \fIindex\fR در فضای کاربری انجام می‌گیرد\&. این موضوع در صورتی که پس از انجام تبدیل، تغییری همزمان در مجموعه قوانین رخ دهد، دو پیامد احتمالی دارد: اگر قانونی قبل از قانون ارجاع‌شده درج یا حذف شده باشد، اندیس مؤثر قانون ممکن است تغییر کند\&. اگر قانون ارجاع‌شده حذف شده باشد، دستور توسط هسته رد می‌شود دقیقاً مانند اینکه یک \fIhandle\fR نامعتبر داده شده باشد\&. .sp یک \fIcomment\fR یک کلمه منفرد یا یک رشته چندکلمه‌ای درون علامت‌های نقل‌قول دوتایی (") است که می‌تواند برای یادداشت‌گذاری درباره قانون اصلی استفاده شود\&. \fBنکته:\fR اگر از bash برای افزودن قوانین استفاده می‌کنید، باید علامت‌های نقل‌قول را اسکیپ کنید، به عنوان مثال \e"enable ssh for servers\e"\&. .TS tab(:); lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp \fBadd\fR T}:T{ .sp افزودن یک قانون جدید که توسط فهرستی از گزاره‌ها توصیف شده است\&. قانون به انتهای زنجیره داده‌شده اضافه می‌شود مگر اینکه مکانی مشخص شده باشد، که در این صورت قانون پس از قانون مشخص‌شده درج می‌گردد\&. T} T{ .sp \fBinsert\fR T}:T{ .sp همانند \fBadd\fR است با این تفاوت که قانون در ابتدای زنجیره یا قبل از قانون مشخص‌شده درج می‌شود\&. T} T{ .sp \fBreplace\fR T}:T{ .sp مشابه \fBadd\fR است، اما این قانون جایگزین قانون مشخص‌شده می‌شود\&. T} T{ .sp \fBdelete\fR T}:T{ .sp حذف قانون مشخص‌شده\&. T} T{ .sp \fBdestroy\fR T}:T{ .sp حذف قانون مشخص‌شده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمی‌شود\&. T} T{ .sp \fBreset\fR T}:T{ .sp بازنشانی وضعیت موجود در قانون، به عنوان مثال مقادیر گزاره‌های counter و quota\&. T} .TE .sp 1 .PP \fBافزودن یک قانون به زنجیره خروجی (output) جدول ip\fR. .sp .if n \{\ .RS 4 .\} .nf nft add rule filter output ip daddr 192\&.168\&.0\&.0/24 accept # \*(Aqip filter\*(Aq is assumed # same command, slightly more verbose nft add rule ip filter output ip daddr 192\&.168\&.0\&.0/24 accept .fi .if n \{\ .RE .\} .PP \fBحذف قانون از جدول inet\fR. .sp .if n \{\ .RS 4 .\} .nf # 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 .fi .if n \{\ .RE .\} .sp .SH "ارزیابی کلی مجموعه قوانین (OVERALL EVALUATION OF THE RULESET)" .sp این یک خلاصه از نحوه ارزیابی مجموعه قوانین (ruleset) است\&. .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} حتی اگر یک بسته توسط مجموعه قوانین پذیرفته (accept) شود، ممکن است همچنان از طریق روش‌های دیگر دور انداخته شود؛ به عنوان مثال، لینوکس به طور کلی انواع مختلف ICMP را نادیده می‌گیرد و گزینه‌های sysctl مانند net\&.ipv{4,6}\&.conf\&.*\&.forwarding یا net\&.ipv4\&.conf\&.*\&.rp_filter\&. وجود دارند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} جدول‌ها صرفاً مفهومی در nftables برای ساختاردهی به مجموعه قوانین هستند\&. آن‌ها نقشی در ارزیابی مجموعه قوانین ندارند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} بسته‌ها از پشته شبکه عبور می‌کنند و در قلاب‌های (hooks) مختلف (به بخش \(lqخانواده‌های آدرس (ADDRESS FAMILIES)\(rq در بالا برای فهرست قلاب‌ها به ازای هر خانواده آدرس مراجعه کنید) توسط هر زنجیره پایه‌ای (base chain) که به این قلاب‌ها متصل است ارزیابی می‌شوند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} زنجیره‌های پایه می‌توانند زنجیره‌های معمولی را (از طریق \fBjump\fR و \fBgoto\fR) فراخوانی کنند\&. زنجیره‌های معمولی می‌توانند زنجیره‌های معمولی دیگر را فراخوانی کنند\&. ارزیابی در زنجیره فراخوانی‌شده ادامه می‌یابد\&. زنجیره‌های مقیم در یک جدول متفاوت را نمی‌توان فراخوانی کرد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} برای هر قلاب، زنجیره‌های متصل بر اساس اولویتشان (priorities) ارزیابی می‌شوند\&. زنجیره‌های با مقدار اولویت کمتر قبل از زنجیره‌های با مقدار بالاتر ارزیابی می‌شوند\&. ترتیب زنجیره‌هایی با مقدار اولویت یکسان نامشخص است\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک حکم (verdict) \fBaccept\fR (شامل یک حکم ضمنی از طریق خط‌مشی زنجیره پایه) به ارزیابی زنجیره پایه فعلی پایان می‌دهد\&. فرقی نمی‌کند که حکم \fBaccept\fR در خود زنجیره پایه صادر شده باشد یا در یک زنجیره معمولی که از زنجیره پایه فراخوانی شده است\&. بسته به زنجیره پایه بعدی پیش می‌رود\&. بنابراین، یک بسته در نهایت پذیرفته می‌شود اگر و تنها اگر هیچ قانون (مطابق) یا خط‌مشی زنجیره پایه‌ای حکم \fBdrop\fR صادر نکند\&. همه این‌ها برای عبارت‌های شبه‌حکم که متضمن \fBaccept\fR هستند، مانند عبارت‌های NAT، نیز صدق می‌کند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک حکم \fBdrop\fR (شامل یک حکم ضمنی از طریق خط‌مشی زنجیره پایه) فوراً به ارزیابی کل مجموعه قوانین پایان می‌دهد\&. هیچ زنجیره دیگری از هیچ قلابی بررسی نخواهد شد\&. بنابراین امکان‌پذیر نیست که یک حکم \fBdrop\fR در زنجیره‌ای بعدی به یک \fBaccept\fR تغییر کند\&. این مورد همچنین برای سایر عبارت‌های پایانی که متضمن \fBdrop\fR هستند، مانند \fBreject\fR نیز صدق می‌کند\&. بدین ترتیب، اگر هر زنجیره پایه از drop به عنوان خط‌مشی خود استفاده کند، همان زنجیره پایه (یا یک زنجیره معمولی که مستقیماً یا غیرمستقیم توسط آن فراخوانی شده) باید حداقل شامل یک قانون مطابقت‌دار \fBaccept\fR باشد، در غیر این صورت بسته دور انداخته (drop) خواهد شد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} با توجه به معناشناسی \fBaccept\fR/\fBdrop\fR و تنها با در نظر گرفتن تصمیم نهایی درباره اینکه آیا یک بسته پذیرفته یا دور انداخته می‌شود، ترتیب زنجیره‌های پایه مختلف در هر قلاب بر اساس اولویت‌هایشان تنها تا جایی اهمیت دارد که هر یک از آن‌ها بسته یا متاداده آن را تغییر دهد و این امر بر احکام صادرشده توسط زنجیره‌ها تأثیر بگذارد \(en به جز این، ترتیب نباید اهمیتی داشته باشد (به جز در عملکرد و سایر اثرات جانبی)\&. این همچنین بدان معناست که میان‌بر زدن در تصمیم نهایی فقط از طریق احکام \fBdrop\fR (یا به عبارتی عبارت‌های شبه‌حکمی که متضمن \fBdrop\fR هستند، مانند \fBreject\fR) امکان‌پذیر است\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک حکم \fBjump\fR باعث می‌شود موقعیت فعلی در پشته فراخوانی زنجیره‌ها ذخیره شود و ارزیابی در ابتدای زنجیره معمولی فراخوانی‌شده ادامه یابد\&. زنجیره‌های فراخوانی‌شده باید از همان جدول باشند و نمی‌توانند زنجیره پایه باشند\&. هنگامی که به پایان زنجیره فراخوانی‌شده می‌رسد، یک حکم ضمنی \fBreturn\fR صادر می‌شود\&. سایر احکام (یا عبارت‌های شبه‌حکم) همان‌طور که در بالا و پایین توضیح داده شده پردازش می‌شوند\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک حکم \fBgoto\fR مشابه \fBjump\fR است، با این تفاوت که موقعیت فعلی در پشته فراخوانی زنجیره‌ها ذخیره نمی‌شود\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} یک حکم \fBreturn\fR به ارزیابی زنجیره فعلی پایان می‌دهد، آخرین موقعیت اضافه‌شده را از پشته فراخوانی زنجیره‌ها برمی‌دارد (pop می‌کند) و باعث می‌شود ارزیابی پس از آن موقعیت ادامه یابد\&. هنگامی که هیچ موقعیتی برای برداشتن وجود ندارد (که در حالتی اتفاق می‌افتد که زنجیره فعلی یا زنجیره پایه باشد یا یک زنجیره معمولی که صرفاً از طریق احکام \fBgoto\fR به آن رسیده شده باشد)، ارزیابی زنجیره پایه فعلی (و هر زنجیره معمولی فراخوانی‌شده از آن) با استفاده از خط‌مشی زنجیره پایه به عنوان حکم ضمنی پایان می‌یابد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} مثال‌هایی برای \fBjump\fR/\fBgoto\fR/\fBreturn\fR: .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fIbase\fR {\fBjump\fR}→ \fIregular\-1\fR {\fBjump\fR}→ \fIregular\-2\fR در پایان \fIregular\-2\fR یا زمانی که یک \fBreturn\fR در آن صادر شود، ارزیابی پس از موقعیت \fBjump\fR در \fIregular\-1\fR ادامه می‌یابد\&. در پایان \fIregular\-1\fR یا زمانی که یک \fBreturn\fR در آن صادر شود، ارزیابی پس از موقعیت \fBjump\fR در \fIbase\fR ادامه می‌یابد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fIbase\fR {\fBjump\fR}→ \fIregular\-1\fR {\fBgoto\fR}→ \fIregular\-2\fR در پایان \fIregular\-2\fR یا زمانی که یک \fBreturn\fR در آن صادر شود، ارزیابی پس از موقعیت \fBjump\fR در \fIbase\fR ادامه می‌یابد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fIbase\fR {\fBjump\fR}→ \fIregular\-1\fR {\fBjump\fR}→ \fIregular\-2\fR {\fBgoto\fR}→ \fIregular\-3\fR در پایان \fIregular\-3\fR یا زمانی که یک \fBreturn\fR در آن صادر شود، ارزیابی پس از موقعیت \fBjump\fR در \fIregular\-1\fR ادامه می‌یابد\&. در پایان \fIregular\-1\fR یا زمانی که یک \fBreturn\fR در آن صادر شود، ارزیابی پس از موقعیت \fBjump\fR در \fIbase\fR ادامه می‌یابد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} \fIbase\fR {\fBjump\fR}→ \fIregular\-1\fR {\fBgoto\fR}→ \fIregular\-2\fR {\fBgoto\fR}→ \fIregular\-3\fR در پایان \fIregular\-3\fR یا زمانی که یک \fBreturn\fR در آن صادر شود، ارزیابی پس از موقعیت \fBjump\fR در \fIbase\fR ادامه می‌یابد\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} احکام (یعنی: \fBaccept\fR, \fBdrop\fR, \fBjump\fR, \fBgoto\fR, \fBreturn\fR و \fBcontinue\fR) و همچنین عبارت‌هایی که متضمن یک حکم هستند (مانند \fBreject\fR یا عبارت‌های NAT) نیز به ارزیابی هرگونه عبارت بعدی در قوانین مربوطه خود پایان می‌دهند (یا به هنگام بارگذاری چنین قوانینی باعث ایجاد خطا می‌شوند)\&. به عنوان مثال در \&... counter accept عبارت counter پردازش می‌شود، اما در \&... accept counter پردازش نمی‌شود\&. این موضوع در مورد عبارت comment که همیشه ارزیابی می‌شود، صدق نمی‌کند\&. .RE .SH "مجموعه‌ها (SETS)" .sp ابزار nftables دو نوع مفهوم مجموعه ارائه می‌دهد\&. مجموعه‌های بی‌نام (Anonymous sets) مجموعه‌هایی هستند که نام مشخصی ندارند\&. اعضای مجموعه هنگام ایجاد قانونی که مجموعه در آن استفاده می‌شود، درون آکولاد قرار گرفته و عناصر با کاما از هم جدا می‌شوند\&. با حذف آن قانون، مجموعه نیز حذف می‌شود\&. آن‌ها قابل به‌روزرسانی نیستند؛ به این معنی که پس از اعلان یک مجموعه بی‌نام، دیگر نمی‌توان آن را تغییر داد مگر با حذف یا تغییر قانونی که از آن مجموعه بی‌نام استفاده می‌کند\&. .PP \fBاستفاده از مجموعه‌های بی‌نام برای پذیرش زیرشبکه‌ها و درگاه‌های خاص\fR. .sp .if n \{\ .RS 4 .\} .nf nft add rule filter input ip saddr { 10\&.0\&.0\&.0/8, 192\&.168\&.0\&.0/16 } tcp dport { 22, 443 } accept .fi .if n \{\ .RE .\} .sp مجموعه‌های نام‌دار (Named sets) مجموعه‌هایی هستند که ابتدا باید تعریف شوند تا بتوان در قوانین به آن‌ها ارجاع داد\&. برعکس مجموعه‌های بی‌نام، عناصر را می‌توان در هر زمان به یک مجموعه نام‌دار اضافه یا از آن حذف کرد\&. در قوانین با استفاده از پیشوند @ قبل از نام مجموعه به آن ارجاع داده می‌شود\&. .PP \fBاستفاده از مجموعه‌های نام‌دار برای پذیرش آدرس‌ها و درگاه‌ها\fR. .sp .if n \{\ .RS 4 .\} .nf nft add rule filter input ip saddr @allowed_hosts tcp dport @allowed_ports accept .fi .if n \{\ .RE .\} .sp مجموعه‌های allowed_hosts و allowed_ports ابتدا باید ایجاد شوند\&. بخش بعدی نحوه نحو (syntax) مجموعه nft را با جزئیات بیشتری شرح می‌دهد\&. .sp .if n \{\ .RS 4 .\} .nf \fBadd set\fR [\fIfamily\fR] \fItable\fR \fIset\fR \fB{ type\fR \fItype\fR | \fBtypeof\fR \fIexpression\fR \fB;\fR [\fBflags\fR \fIflags\fR \fB;\fR] [\fBtimeout\fR \fItimeout\fR \fB;\fR] [\fBgc\-interval\fR \fIgc\-interval\fR \fB;\fR] [\fBelements = {\fR \fIelement\fR[\fB,\fR \&...] \fB} ;\fR] [\fBsize\fR \fIsize\fR \fB;\fR] [\fBcomment\fR \fIcomment\fR \fB;\fR\fI] [\fR\fI\fBpolicy\fR\fR\fI \*(Aqpolicy\fR \fB;\fR] [\fBauto\-merge ;\fR] \fB}\fR {\fBdelete\fR | \fBdestroy\fR | \fBlist\fR | \fBflush\fR | \fBreset\fR } \fBset\fR [\fIfamily\fR] \fItable\fR \fIset\fR \fBlist sets\fR [\fIfamily\fR] [\fItable\fR] \fBdelete set\fR [\fIfamily\fR] \fItable\fR \fBhandle\fR \fIhandle\fR {\fBadd\fR | \fBdelete\fR | \fBdestroy\fR } \fBelement\fR [\fIfamily\fR] \fItable\fR \fIset\fR \fB{\fR \fIelement\fR[\fB,\fR \&...] \fB}\fR .fi .if n \{\ .RE .\} .sp مجموعه‌ها نگه‌دارنده‌های عنصری از یک نوع داده تعریف‌شده توسط کاربر هستند؛ آن‌ها با یک نام تعریف‌شده توسط کاربر به طور یکتا شناسایی شده و به جدول‌ها متصل می‌شوند\&. رفتار آن‌ها را می‌توان با فلگ‌هایی که در زمان ایجاد مجموعه مشخص می‌شوند، تنظیم کرد\&. .sp برای جزئیات بیشتر به بخش فلگ‌های مجموعه و نگاشت در زیر مراجعه کنید\&. .TS tab(:); lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp \fBadd\fR T}:T{ .sp افزودن یک مجموعه جدید در جدول مشخص‌شده\&. برای اطلاعات بیشتر درباره نحوه تعیین ویژگی‌های یک مجموعه، به جدول مشخصات مجموعه در زیر مراجعه کنید\&. T} T{ .sp \fBdelete\fR T}:T{ .sp حذف مجموعه مشخص‌شده\&. T} T{ .sp \fBdestroy\fR T}:T{ .sp حذف مجموعه مشخص‌شده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمی‌شود\&. T} T{ .sp \fBlist\fR T}:T{ .sp نمایش عناصر موجود در مجموعه مشخص‌شده\&. T} T{ .sp \fBflush\fR T}:T{ .sp حذف تمامی عناصر از مجموعه مشخص‌شده\&. T} T{ .sp \fBreset\fR T}:T{ .sp بازنشانی وضعیت در تمامی عناصر موجود، مانند مقادیر عبارت‌های شمارنده (counter) و سهمیه (quota)\&. T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&8.\ \&مشخصات مجموعه (Set specifications) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه (Keyword) T}:T{ توضیحات (Description) T}:T{ نوع (Type) T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp type T}:T{ .sp نوع داده عناصر مجموعه T}:T{ .sp string: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark T} T{ .sp typeof T}:T{ .sp نوع داده عنصر مجموعه T}:T{ .sp عبارت برای استخراج نوع داده از آن T} T{ .sp flags T}:T{ .sp فلگ‌های مجموعه T}:T{ .sp string: constant, dynamic, interval, timeout\&. برای توصیف ویژگی‌های مجموعه استفاده می‌شود\&. T} T{ .sp timeout T}:T{ .sp مدت زمانی که یک عنصر در مجموعه باقی می‌ماند؛ در صورتی که مجموعه از مسیر بسته (مجموعه قوانین) پر شود، الزامی است T}:T{ .sp رشته، عدد ده‌دهی به همراه واحد\&. واحدها عبارتند از: d, h, m, s T} T{ .sp gc\-interval T}:T{ .sp فاصله زمانی پاک‌سازی زباله (garbage collection)؛ تنها زمانی در دسترس است که timeout یا فلگ timeout فعال باشد T}:T{ .sp رشته، عدد ده‌دهی به همراه واحد\&. واحدها عبارتند از: d, h, m, s T} T{ .sp elements T}:T{ .sp عناصر موجود در مجموعه T}:T{ .sp نوع داده مجموعه T} T{ .sp size T}:T{ .sp حداکثر تعداد عناصر در مجموعه؛ در صورتی که مجموعه از مسیر بسته (مجموعه قوانین) پر شود، الزامی است T}:T{ .sp عدد صحیح بدون علامت (۶۴ بیتی) T} T{ .sp policy T}:T{ .sp خط‌مشی مجموعه T}:T{ .sp string: performance [پیش‌فرض], memory T} T{ .sp auto\-merge T}:T{ .sp ادغام خودکار عناصر مجاور/هم‌پوشان مجموعه (تنها برای مجموعه‌های بازه‌ای) T}:T{ .sp T} .TE .sp 1 .sp گزینه \fBgc\-interval\fR روی مهلت زمانی (timeout) عنصر تأثیری ندارد، اما بر آزادسازی حافظه تأثیر می‌گذارد\&. یک مجموعه بزرگ که به ندرت عناصری در آن منقضی می‌شوند می‌تواند از بازه پاک‌سازی زباله بالاتر (با تکرار کمتر) برای صرفه‌جویی در زمان پردازنده استفاده کند، در حالی که مجموعه‌هایی با به‌روزرسانی‌های فراوان و عناصر کوتاه‌عمر از بازه کمتر بهره‌مند خواهند شد\&. بازه‌های کمتر تضمین می‌کنند که مجموعه زیر حداکثر اندازه خود باقی بماند\&. از نظر داخلی، یک مدخل منقضی‌شده تا زمانی که توسط بازیافت‌کننده حافظه (garbage collector) حذف شود باقی می‌ماند، که این فرآیند همچنین تعداد عناصر مجموعه را کاهش می‌دهد\&. این همچنین بدان معناست که در صورت تنظیم بیش از حد بزرگ \fBgc\-interval\fR، ممکن است مجموعه‌ای نتواند عناصر بیشتری را بپذیرد، حتی اگر همه عناصر منقضی شده باشند\&. .sp گزینه \fBsize\fR حد بالای تعداد عناصری را که مجموعه می‌تواند پشتیبانی کند، تعریف می‌کند\&. برای مجموعه‌هایی که از طریق مجموعه قوانین با کلیدواژه‌های \fBadd\fR و \fBupdate\fR به آن‌ها اضافه می‌شود الزامی است\&. ارائه کلیدواژه \fBsize\fR برای مجموعه‌هایی که فقط از طریق \fBnft add element\fR به آن‌ها اضافه می‌شود امکان انتخاب پیاده‌سازی فشرده‌تر (با صرفه‌جویی در حافظه) را فراهم می‌کند، اما الزامی نیست\&. .sp کلیدواژه اختیاری \fBpolicy\fR می‌تواند برای درخواست پیاده‌سازی بهینه‌تر از نظر حافظه برای مجموعه استفاده شود\&. .sp گزینه \fBauto\-merge\fR به بخش کاربری nftables دستور می‌دهد تا محدوده‌های مجاور و هم‌پوشان را با یکدیگر ادغام کند\&. مثال: هنگامی که مجموعه شامل محدوده \fB1\&.2\&.3\&.1\-1\&.2\&.3\&.4\fR باشد، اضافه کردن عنصر \fB1\&.2\&.3\&.2\fR هیچ تأثیری ندارد\&. اضافه کردن \fB1\&.2\&.3\&.5\fR محدوده موجود را تغییر می‌دهد تا \fB1\&.2\&.3\&.1\-1\&.2\&.3\&.5\fR را پوشش دهد\&. بدون این فلگ، \fB1\&.2\&.3\&.2\fR نمی‌تواند اضافه شود و \fB1\&.2\&.3\&.5\fR به عنوان یک مدخل جدید درج می‌شود\&. .sp برابری یک مقدار با یک مجموعه زمانی برقرار است که مقدار دقیقاً با یک مقدار در مجموعه مطابقت داشته باشد (که برای بازه‌ها به این معنی است که در هر یک از آن‌ها قرار داشته باشد)\&. برای تفاوت‌های ظریف بین بررسی‌های برابری مجموعه‌ها و ماسک‌های بیتی (bitmasks) که از نظر نحوی شبیه به نظر می‌رسند، به بخش \(lqنوع ماسک بیتی (BITMASK TYPE)\(rq مراجعه کنید\&. .SH "نگاشت‌ها (MAPS)" .sp .if n \{\ .RS 4 .\} .nf \fBadd map\fR [\fIfamily\fR] \fItable\fR \fImap\fR \fB{ type\fR \fItype\fR | \fBtypeof\fR \fIexpression\fR [\fBflags\fR \fIflags\fR \fB;\fR] [\fBelements = {\fR \fIelement\fR[\fB,\fR \&...] \fB} ;\fR] [\fBsize\fR \fIsize\fR \fB;\fR] [\fBcomment\fR \fIcomment\fR \fB;\fR\fI] [\fR\fI\fBpolicy\fR\fR\fI \*(Aqpolicy\fR \fB;\fR] \fB}\fR {\fBdelete\fR | \fBdestroy\fR | \fBlist\fR | \fBflush\fR | \fBreset\fR } \fBmap\fR [\fIfamily\fR] \fItable\fR \fImap\fR \fBlist maps\fR [\fIfamily\fR] [\fItable\fR] .fi .if n \{\ .RE .\} .sp نگاشت‌ها (Maps) داده‌ها را بر اساس یک کلید خاص که به عنوان ورودی استفاده می‌شود، ذخیره می‌کنند\&. آن‌ها با یک نام تعریف‌شده توسط کاربر به طور یکتا شناسایی شده و به جدول‌ها متصل می‌شوند\&. .TS tab(:); lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp \fBadd\fR T}:T{ .sp افزودن یک نگاشت جدید در جدول مشخص‌شده\&. T} T{ .sp \fBdelete\fR T}:T{ .sp حذف نگاشت مشخص‌شده\&. T} T{ .sp \fBdestroy\fR T}:T{ .sp حذف نگاشت مشخص‌شده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمی‌شود\&. T} T{ .sp \fBlist\fR T}:T{ .sp نمایش عناصر موجود در نگاشت مشخص‌شده\&. T} T{ .sp \fBflush\fR T}:T{ .sp حذف تمامی عناصر از نگاشت مشخص‌شده\&. T} T{ .sp \fBreset\fR T}:T{ .sp بازنشانی وضعیت در تمامی عناصر موجود، مانند مقادیر عبارت‌های شمارنده (counter) و سهمیه (quota)\&. T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&9.\ \&مشخصات نگاشت (Map specifications) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه (Keyword) T}:T{ توضیحات (Description) T}:T{ نوع (Type) T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp type T}:T{ .sp نوع داده عناصر نگاشت T}:T{ .sp string: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark, counter, quota\&. شمارنده (counter) و سهمیه (quota) نمی‌توانند به عنوان کلید استفاده شوند T} T{ .sp typeof T}:T{ .sp نوع داده عنصر مجموعه/نگاشت T}:T{ .sp عبارت برای استخراج نوع داده از آن T} T{ .sp flags T}:T{ .sp فلگ‌های نگاشت T}:T{ .sp رشته، مشابه فلگ‌های مجموعه T} T{ .sp elements T}:T{ .sp عناصر موجود در نگاشت T}:T{ .sp نوع داده نگاشت T} T{ .sp size T}:T{ .sp حداکثر تعداد عناصر در نگاشت T}:T{ .sp عدد صحیح بدون علامت (۶۴ بیتی) T} T{ .sp policy T}:T{ .sp خط‌مشی نگاشت T}:T{ .sp string: performance [پیش‌فرض], memory T} .TE .sp 1 .sp کاربران می‌توانند ویژگی‌ها/قابلیت‌هایی را که مجموعه/نگاشت باید پشتیبانی کند مشخص کنند\&. این به هسته اجازه می‌دهد تا یک نمایش داخلی بهینه را انتخاب کند\&. اگر یک فلگ لازم مشخص نشده باشد، مجموعه قوانین ممکن است همچنان کار کند، زیرا nftables در صورت امکان استنتاج از مجموعه قوانین، قابلیت‌ها را به طور خودکار فعال می‌کند\&. با این حال ممکن است این برای همه موارد کارساز نباشد، بنابراین توصیه می‌شود تمام قابلیت‌های مورد نیاز در تعریف مجموعه/نگاشت به صورت دستی مشخص شوند\&. همچنین برخی از قابلیت‌ها ناسازگار با یکدیگر (mutually exclusive) هستند؛ به عنوان مثال، امکان‌پذیر نیست که یک مجموعه هم از بازه‌ها و هم از درج از مسیر بسته پشتیبانی کند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&10.\ \&فلگ‌های مجموعه و نگاشت (Set and Map flags) .TS allbox tab(:); ltB ltB. T{ فلگ (Flag) T}:T{ توضیحات (Description) T} .T& lt lt lt lt lt lt lt lt. T{ .sp constant T}:T{ .sp محتویات مجموعه پس از ایجاد هرگز تغییر نخواهد کرد T} T{ .sp dynamic T}:T{ .sp مجموعه باید از به‌روزرسانی‌ها از مسیر بسته با کلیدواژه‌های \fBadd\fR، \fBupdate\fR یا \fBdelete\fR پشتیبانی کند\&. T} T{ .sp interval T}:T{ .sp مجموعه باید بتواند بازه‌ها (محدوده‌ها) را ذخیره کند\&. نمی‌تواند با فلگ \fBdynamic\fR ترکیب شود\&. T} T{ .sp timeout T}:T{ .sp مجموعه باید از مهلت زمانی عناصر (حذف خودکار عناصر پس از انقضا) پشتیبانی کند\&. T} .TE .sp 1 .SH "عناصر (ELEMENTS)" .sp .if n \{\ .RS 4 .\} .nf {\fBadd\fR | \fBcreate\fR | \fBdelete\fR | \fBdestroy\fR | \fBget\fR | \fBreset\fR } \fBelement\fR [\fIfamily\fR] \fItable\fR \fIset\fR \fB{\fR \fIELEMENT\fR[\fB,\fR \&...] \fB}\fR \fIELEMENT\fR := \fIkey_expression\fR \fIOPTIONS\fR [\fB:\fR \fIvalue_expression\fR] \fIOPTIONS\fR := [\fBtimeout\fR \fITIMESPEC\fR] [\fBexpires\fR \fITIMESPEC\fR] [\fBcomment\fR \fIstring\fR] \fITIMESPEC\fR := [\fInum\fR\fBd\fR][\fInum\fR\fBh\fR][\fInum\fR\fBm\fR][\fInum\fR[\fBs\fR]] .fi .if n \{\ .RE .\} .sp دستورات مربوط به عناصر امکان تغییر محتوای مجموعه‌ها و نگاشت‌های نام‌دار را فراهم می‌کنند\&. \fIkey_expression\fR معمولاً مقداری مطابق با نوع مجموعه است\&. استفاده از \fIvalue_expression\fR در مجموعه‌ها مجاز نیست اما هنگام افزودن به نگاشت‌ها الزامی است، جایی که با بخش داده در تعریف نوع آن مطابقت دارد\&. هنگام حذف از نگاشت‌ها، ممکن است مشخص شود اما اختیاری است زیرا \fIkey_expression\fR عنصر را به طور یکتا مشخص می‌کند\&. .sp دستور \fBcreate\fR مشابه \fBadd\fR است، با این استثنا که هیچ‌یک از عناصر فهرست‌شده نباید از قبل وجود داشته باشند\&. .sp دستور \fBget\fR برای بررسی اینکه آیا یک عنصر در یک مجموعه وجود دارد یا خیر مفید است، که ممکن است در مجموعه‌های بسیار بزرگ و/یا بازه‌ای ساده نباشد\&. در مورد اخیر، بازه دربرگیرنده به جای خود عنصر بازگردانده می‌شود\&. .sp دستور \fBreset\fR وضعیت متصل به عنصر(های) داده‌شده را بازنشانی می‌کند، مانند مقادیر عبارت‌های شمارنده (counter) و سهمیه (quota)\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&11.\ \&گزینه‌های عنصر (Element options) .TS allbox tab(:); ltB ltB. T{ گزینه (Option) T}:T{ توضیحات (Description) T} .T& lt lt lt lt lt lt. T{ .sp timeout T}:T{ .sp مقدار مهلت زمانی برای مجموعه‌ها/نگاشت‌های دارای فلگ \fBtimeout\fR T} T{ .sp expires T}:T{ .sp زمان باقی‌مانده تا انقضای عنصر داده‌شده؛ فقط برای تکثیر مجموعه قوانین (ruleset replication) کاربرد دارد T} T{ .sp comment T}:T{ .sp فیلد توضیحات (comment) برای هر عنصر T} .TE .sp 1 .SH "جدول‌های جریان (FLOWTABLES)" .sp .if n \{\ .RS 4 .\} .nf {\fBadd\fR | \fBcreate\fR} \fBflowtable\fR [\fIfamily\fR] \fItable\fR \fIflowtable\fR \fB{ hook\fR \fIhook\fR \fBpriority\fR \fIpriority\fR \fB; devices = {\fR \fIDEVICE_LIST\fR \fB} ; }\fR \fBlist flowtables\fR [\fIfamily\fR] [\fItable\fR] {\fBdelete\fR | \fBdestroy\fR | \fBlist\fR} \fBflowtable\fR [\fIfamily\fR] \fItable\fR \fIflowtable\fR \fBdelete\fR \fBflowtable\fR [\fIfamily\fR] \fItable\fR \fBhandle\fR \fIhandle\fR \fIDEVICE_LIST\fR := \fIDEVICE_NAME\fR [\fB,\fR \fIDEVICE_LIST\fR] \fIDEVICE_NAME\fR := \fIstring\fR | \fIstring\fR\fB*\fR .fi .if n \{\ .RE .\} .sp جدول‌های جریان (Flowtables) به شما این امکان را می‌دهند که هدایت و فوروارد بسته‌ها را در نرم‌افزار شتاب‌دهی کنید\&. مدخل‌های جدول‌های جریان از طریق یک چندتایی (tuple) نمایش داده می‌شوند که متشکل از رابط ورودی، آدرس مبدأ و مقصد، درگاه مبدأ و مقصد؛ و پروتکل‌های لایه ۳/۴ است\&. هر مدخل همچنین رابط مقصد و آدرس درگاه (gateway) را کَش می‌کند \(en برای به‌روزرسانی آدرس لایه پیوند مقصد \(en تا بسته‌ها را هدایت کند\&. فیلدهای ttl و hoplimit نیز کاهش می‌یابند\&. از این رو، جدول‌های جریان یک مسیر جایگزین فراهم می‌کنند که به بسته‌ها اجازه می‌دهد مسیر کلاسیک فورواردینگ را دور بزنند\&. جدول‌های جریان در قلاب \fBingress\fR قرار دارند که قبل از قلاب \fBprerouting\fR واقع شده است\&. شما می‌توانید جریان‌هایی را که می‌خواهید تخلیه بار (offload) کنید از طریق عبارت flow از زنجیره forward انتخاب نمایید\&. جدول‌های جریان بر اساس خانواده آدرس و نام آن‌ها شناسایی می‌شوند\&. خانواده آدرس باید یکی از ip، ip6 یا inet باشد\&. خانواده آدرس inet یک خانواده ساختگی است که برای ایجاد جدول‌های ترکیبی IPv4/IPv6 استفاده می‌شود\&. هنگامی که هیچ خانواده آدرسی مشخص نشده باشد، به طور پیش‌فرض ip استفاده می‌شود\&. .sp گزینه \fBpriority\fR می‌تواند یک عدد صحیح علامت‌دار یا \fBfilter\fR باشد که نشان‌دهنده ۰ است\&. جمع و تفریق می‌تواند برای تنظیم اولویت نسبی استفاده شود، به عنوان مثال filter + 5 برابر با ۵ است\&. .sp با هسته‌های جدیدتر، با تعیین یک پسوند ستاره پشتیبانی اولیه‌ای برای نویسه‌های عام (wildcards) در \fIDEVICE_LIST\fR وجود دارد\&. جدول جریان برای تمامی رابط‌های منطبق با پیشوند داده‌شده اعمال خواهد شد\&. از دستور \fBlist hooks\fR برای مشاهده وضعیت فعلی استفاده کنید\&. .TS tab(:); lt lt lt lt lt lt lt lt. T{ .sp \fBadd\fR T}:T{ .sp افزودن یک جدول جریان جدید برای خانواده داده‌شده با نام داده‌شده\&. T} T{ .sp \fBdelete\fR T}:T{ .sp حذف جدول جریان مشخص‌شده\&. T} T{ .sp \fBdestroy\fR T}:T{ .sp حذف جدول جریان مشخص‌شده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمی‌شود\&. T} T{ .sp \fBlist\fR T}:T{ .sp فهرست کردن تمامی جدول‌های جریان\&. T} .TE .sp 1 .SH "اشیاء وضعیت‌دار (STATEFUL OBJECTS)" .sp .if n \{\ .RS 4 .\} .nf {\fBadd\fR | \fBdelete\fR | \fBdestroy\fR | \fBlist\fR | \fBreset\fR} \fBcounter\fR [\fIfamily\fR] \fItable\fR \fIobject\fR {\fBadd\fR | \fBdelete\fR | \fBdestroy\fR | \fBlist\fR | \fBreset\fR} \fBquota\fR [\fIfamily\fR] \fItable\fR \fIobject\fR {\fBadd\fR | \fBdelete\fR | \fBdestroy\fR | \fBlist\fR} \fBlimit\fR [\fIfamily\fR] \fItable\fR \fIobject\fR \fBdelete\fR \fIcounter\fR [\fIfamily\fR] \fItable\fR \fBhandle\fR \fIhandle\fR \fBdelete\fR \fIquota\fR [\fIfamily\fR] \fItable\fR \fBhandle\fR \fIhandle\fR \fBdelete\fR \fIlimit\fR [\fIfamily\fR] \fItable\fR \fBhandle\fR \fIhandle\fR \fBdestroy\fR \fIcounter\fR [\fIfamily\fR] \fItable\fR \fBhandle\fR \fIhandle\fR \fBdestroy\fR \fIquota\fR [\fIfamily\fR] \fItable\fR \fBhandle\fR \fIhandle\fR \fBdestroy\fR \fIlimit\fR [\fIfamily\fR] \fItable\fR \fBhandle\fR \fIhandle\fR \fBlist\fR { \fBcounters\fR | \fBlimits\fR | \fBquotas\fR } [\fIfamily\fR] [\fItable\fR] \fBreset\fR { \fBcounters\fR | \fBquotas\fR } [\fIfamily\fR] [\fItable\fR] .fi .if n \{\ .RE .\} .sp اشیاء وضعیت‌دار (Stateful objects) به جدول‌ها متصل هستند و با یک نام یکتا شناسایی می‌شوند\&. آن‌ها اطلاعات وضعیت‌دار را از قواعد گروه‌بندی می‌کنند؛ برای ارجاع به آن‌ها در قواعد از کلمات کلیدی "type name" استفاده می‌شود، مانند "counter name"\&. .TS tab(:); lt lt lt lt lt lt lt lt lt lt. T{ .sp \fBadd\fR T}:T{ .sp افزودن یک شیء وضعیت‌دار جدید در جدول مشخص‌شده\&. T} T{ .sp \fBdelete\fR T}:T{ .sp حذف شیء مشخص‌شده\&. T} T{ .sp \fBdestroy\fR T}:T{ .sp حذف شیء مشخص‌شده؛ در صورتی که وجود نداشته باشد با خطا مواجه نمی‌شود\&. T} T{ .sp \fBlist\fR T}:T{ .sp نمایش اطلاعات وضعیت‌داری که شیء نگهداری می‌کند\&. T} T{ .sp \fBreset\fR T}:T{ .sp فهرست کردن و بازنشانی شیء وضعیت‌دار (List\-and\-reset)\&. T} .TE .sp 1 .SS "CT HELPER" .sp .if n \{\ .RS 4 .\} .nf \fBadd\fR \fBct helper\fR [\fIfamily\fR] \fItable\fR \fIname\fR \fB{ type\fR \fItype\fR \fBprotocol\fR \fIprotocol\fR \fB;\fR [\fBl3proto\fR \fIfamily\fR \fB;\fR] \fB}\fR \fBdelete\fR \fBct helper\fR [\fIfamily\fR] \fItable\fR \fIname\fR \fBlist\fR \fBct helpers\fR .fi .if n \{\ .RE .\} .sp قابلیت Ct helper برای تعریف هلپرهای ردیابی اتصال (connection tracking helpers) استفاده می‌شود که سپس می‌توان آن‌ها را در ترکیب با عبارت \fBct helper set\fR به کار برد\&. گزینه‌های \fItype\fR و \fIprotocol\fR اجباری هستند؛ l3proto به‌طور پیش‌فرض از خانواده جدول مشتق می‌شود، یعنی در جدول inet هسته تلاش می‌کند هر دو بک‌اند هلپر ipv4 و ipv6 را (در صورت پشتیبانی هسته) بارگذاری کند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&12.\ \&مشخصات conntrack helper .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp type T}:T{ .sp نام نوع هلپر T}:T{ .sp رشته داخل کوتیشن (مانند "ftp") T} T{ .sp protocol T}:T{ .sp پروتکل لایه ۴ هلپر T}:T{ .sp رشته (مانند ip) T} T{ .sp l3proto T}:T{ .sp پروتکل لایه ۳ هلپر T}:T{ .sp خانواده آدرس (مانند ip) T} T{ .sp comment T}:T{ .sp فیلد توضیح اختصاصی ct helper T}:T{ .sp رشته T} .TE .sp 1 .PP \fBتعریف و تخصیص هلپر ftp\fR. .sp .if n \{\ .RS 4 .\} .nf 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" } } .fi .if n \{\ .RE .\} .sp .SS "CT TIMEOUT" .sp .if n \{\ .RS 4 .\} .nf \fBadd\fR \fBct timeout\fR [\fIfamily\fR] \fItable\fR \fIname\fR \fB{ protocol\fR \fIprotocol\fR \fB; policy = {\fR \fIstate\fR\fB:\fR \fIvalue\fR [\fB,\fR \&...] \fB} ;\fR [\fBl3proto\fR \fIfamily\fR \fB;\fR] \fB}\fR \fBdelete\fR \fBct timeout\fR [\fIfamily\fR] \fItable\fR \fIname\fR \fBlist\fR \fBct timeouts\fR .fi .if n \{\ .RE .\} .sp قابلیت Ct timeout برای به‌روزرسانی مقادیر زمان انقضا (timeout) ردیابی اتصال استفاده می‌شود\&. سیاست‌های Timeout با استفاده از عبارت \fBct timeout set\fR تخصیص داده می‌شوند\&. گزینه‌های \fIprotocol\fR و \fIpolicy\fR اجباری هستند؛ l3proto به‌طور پیش‌فرض از خانواده جدول مشتق می‌شود\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&13.\ \&مشخصات conntrack timeout .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp protocol T}:T{ .sp پروتکل لایه ۴ شیء timeout T}:T{ .sp رشته (مانند ip) T} T{ .sp state T}:T{ .sp نام وضعیت اتصال T}:T{ .sp رشته (مانند "established") T} T{ .sp value T}:T{ .sp مقدار زمان انتظار برای وضعیت اتصال T}:T{ .sp عدد صحیح بدون علامت T} T{ .sp l3proto T}:T{ .sp پروتکل لایه ۳ شیء timeout T}:T{ .sp خانواده آدرس (مانند ip) T} T{ .sp comment T}:T{ .sp فیلد توضیح اختصاصی ct timeout T}:T{ .sp رشته T} .TE .sp 1 .sp نام‌های وضعیت اتصال tcp که می‌توانند مقدار timeout مشخصی داشته باشند عبارتند از: .sp \fIclose\fR، \fIclose_wait\fR، \fIestablished\fR، \fIfin_wait\fR، \fIlast_ack\fR، \fIretrans\fR، \fIsyn_recv\fR، \fIsyn_sent\fR، \fItime_wait\fR و \fIunack\fR\&. .sp می‌توانید از \fIsysctl \-a |grep net\&.netfilter\&.nf_conntrack_tcp_timeout_\fR برای مشاهده و تغییر مقادیر پیش‌فرض سراسری سیستم استفاده کنید\&. عبارت \fIct timeout\fR امکان پیکربندی تنظیمات مختص جریان را بدون تغییر زمان‌های انتظار سراسری فراهم می‌کند\&. .sp به عنوان مثال، پورت tcp شماره 53 می‌تواند تنظیمات بسیار کمتری نسبت به سایر ترافیک‌ها داشته باشد\&. .sp نام‌های وضعیت udp که می‌توانند مقدار timeout مشخصی داشته باشند عبارتند از \fIreplied\fR و \fIunreplied\fR\&. .PP \fBتعریف و تخصیص سیاست ct timeout\fR. .sp .if n \{\ .RS 4 .\} .nf 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" } } .fi .if n \{\ .RE .\} .PP \fBآزمایش سیاست timeout به‌روزرسانی‌شده\fR. .sp .if n \{\ .RS 4 .\} .nf % 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 .fi .if n \{\ .RE .\} .sp .SS "CT EXPECTATION" .sp .if n \{\ .RS 4 .\} .nf \fBadd\fR \fBct expectation\fR [\fIfamily\fR] \fItable\fR \fIname\fR \fB{ protocol\fR \fIprotocol\fR \fB; dport\fR \fIdport\fR \fB; timeout\fR \fItimeout\fR \fB; size\fR \fIsize\fR \fB;\fR [\fBl3proto\fR \fIfamily\fR \fB;\fR] \fB}\fR \fBdelete\fR \fBct expectation\fR [\fIfamily\fR] \fItable\fR \fIname\fR \fBlist\fR \fBct expectations\fR .fi .if n \{\ .RE .\} .sp قابلیت Ct expectation برای ایجاد انتظارات اتصال (connection expectations) استفاده می‌شود\&. انتظارات با استفاده از عبارت \fBct expectation set\fR تخصیص داده می‌شوند\&. گزینه‌های \fIprotocol\fR، \fIdport\fR، \fItimeout\fR و \fIsize\fR اجباری هستند؛ l3proto به‌طور پیش‌فرض از خانواده جدول مشتق می‌شود\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&14.\ \&مشخصات conntrack expectation .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp protocol T}:T{ .sp پروتکل لایه ۴ شیء expectation T}:T{ .sp رشته (مانند ip) T} T{ .sp dport T}:T{ .sp پورت مقصد اتصال مورد انتظار T}:T{ .sp عدد صحیح بدون علامت T} T{ .sp timeout T}:T{ .sp مقدار زمان انتظار برای expectation T}:T{ .sp عدد صحیح بدون علامت T} T{ .sp size T}:T{ .sp مقدار اندازه برای expectation T}:T{ .sp عدد صحیح بدون علامت T} T{ .sp l3proto T}:T{ .sp پروتکل لایه ۳ شیء expectation T}:T{ .sp خانواده آدرس (مانند ip) T} T{ .sp comment T}:T{ .sp فیلد توضیح اختصاصی ct expectation T}:T{ .sp رشته T} .TE .sp 1 .PP \fBتعریف و تخصیص سیاست ct expectation\fR. .sp .if n \{\ .RS 4 .\} .nf 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" } } .fi .if n \{\ .RE .\} .sp .SS "COUNTER" .sp .if n \{\ .RS 4 .\} .nf \fBadd\fR \fBcounter\fR [\fIfamily\fR] \fItable\fR \fIname\fR [\fB{\fR [ \fBpackets\fR \fIpackets\fR \fBbytes\fR \fIbytes\fR \fI;\fR ] [ \fBcomment\fR \fIcomment\fR \fI;\fR \fB}\fR] \fBdelete\fR \fBcounter\fR [\fIfamily\fR] \fItable\fR \fIname\fR \fBlist\fR \fBcounters\fR .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&15.\ \&مشخصات شمارنده (Counter specifications) .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt. T{ .sp packets T}:T{ .sp تعداد اولیه بسته‌ها T}:T{ .sp عدد صحیح بدون علامت (۶۴ بیتی) T} T{ .sp bytes T}:T{ .sp تعداد اولیه بایت‌ها T}:T{ .sp عدد صحیح بدون علامت (۶۴ بیتی) T} T{ .sp comment T}:T{ .sp فیلد توضیح اختصاصی شمارنده T}:T{ .sp رشته T} .TE .sp 1 .PP \fBاستفاده از شمارنده‌های نام‌گذاری‌شده\fR. .sp .if n \{\ .RS 4 .\} .nf nft add counter filter http nft add rule filter input tcp dport 80 counter name \e"http\e" .fi .if n \{\ .RE .\} .PP \fBاستفاده از شمارنده‌های نام‌گذاری‌شده با نقشه‌ها (maps)\fR. .sp .if n \{\ .RS 4 .\} .nf nft add counter filter http nft add counter filter https nft add rule filter input counter name tcp dport map { 80 : \e"http\e", 443 : \e"https\e" } .fi .if n \{\ .RE .\} .sp .SS "QUOTA" .sp .if n \{\ .RS 4 .\} .nf \fBadd\fR \fBquota\fR [\fIfamily\fR] \fItable\fR \fIname\fR \fB{\fR [\fBover\fR|\fBuntil\fR] \fIbytes\fR \fIBYTE_UNIT\fR [ \fBused\fR \fIbytes\fR \fIBYTE_UNIT\fR ] \fI;\fR [ \fBcomment\fR \fIcomment\fR \fI;\fR ] \fB}\fR BYTE_UNIT := bytes | kbytes | mbytes \fBdelete\fR \fBquota\fR [\fIfamily\fR] \fItable\fR \fIname\fR \fBlist\fR \fBquotas\fR .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&16.\ \&مشخصات سهمیه (Quota specifications) .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt. T{ .sp quota T}:T{ .sp محدودیت سهمیه، که به عنوان نام quota استفاده می‌شود T}:T{ .sp دو آرگومان، عدد صحیح بدون علامت (۶۴ بیتی) و رشته: bytes، kbytes، mbytes\&. عبارات "over" و "until" قبل از این آرگومان‌ها قرار می‌گیرند T} T{ .sp used T}:T{ .sp مقدار اولیه سهمیه مصرف‌شده T}:T{ .sp دو آرگومان، عدد صحیح بدون علامت (۶۴ بیتی) و رشته: bytes، kbytes، mbytes T} T{ .sp comment T}:T{ .sp فیلد توضیح اختصاصی quota T}:T{ .sp رشته T} .TE .sp 1 .PP \fBاستفاده از سهمیه‌های نام‌گذاری‌شده\fR. .sp .if n \{\ .RS 4 .\} .nf nft add quota filter user123 { over 20 mbytes } nft add rule filter input ip saddr 192\&.168\&.10\&.123 quota name \e"user123\e" .fi .if n \{\ .RE .\} .PP \fBاستفاده از سهمیه‌های نام‌گذاری‌شده با نقشه‌ها (maps)\fR. .sp .if n \{\ .RS 4 .\} .nf 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 : \e"user123\e", 192\&.168\&.10\&.124 : \e"user124\e" } .fi .if n \{\ .RE .\} .sp .SH "عبارت‌ها (EXPRESSIONS)" .sp عبارت‌ها بیانگر مقادیر هستند؛ خواه مقادیر ثابت مانند آدرس‌های شبکه، شماره پورت‌ها و غیره باشند، یا داده‌های جمع‌آوری‌شده از بسته در طول ارزیابی مجموعه قواعد (ruleset)\&. عبارت‌ها را می‌توان با استفاده از عبارت‌های دودویی، منطقی، رابطه‌ای و انواع دیگر عبارت‌ها ترکیب کرد تا عبارت‌های پیچیده یا رابطه‌ای (تطبیق / match) تشکیل شوند\&. آن‌ها همچنین به عنوان آرگومان برای انواع خاصی از عملیات مانند NAT، نشانه‌گذاری بسته (packet marking) و غیره استفاده می‌شوند\&. .sp هر عبارت دارای یک نوع داده (data type) است که اندازه، تجزیه و نمایش مقادیر نمادین و سازگاری نوع با سایر عبارت‌ها را تعیین می‌کند\&. .SS "دستور DESCRIBE (DESCRIBE COMMAND)" .sp .if n \{\ .RS 4 .\} .nf \fBdescribe\fR \fIexpression\fR | \fIdata type\fR .fi .if n \{\ .RE .\} .sp دستور \fBdescribe\fR اطلاعاتی درباره نوع یک عبارت و نوع داده آن نشان می‌دهد\&. همچنین می‌توان یک نوع داده را مشخص کرد که در این صورت nft اطلاعات بیشتری درباره نوع نمایش خواهد داد\&. .PP \fBدستور describe\fR. .sp .if n \{\ .RS 4 .\} .nf $ 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 .fi .if n \{\ .RE .\} .sp .SH "انواع داده (DATA TYPES)" .sp انواع داده اندازه، تجزیه و نمایش مقادیر نمادین و سازگاری نوع عبارات را تعیین می‌کنند\&. تعدادی نوع داده سراسری وجود دارد، علاوه بر این برخی از انواع عبارت، انواع داده‌های بیشتری را تعریف می‌کنند که مختص همان نوع عبارت است\&. بیشتر انواع داده اندازه ثابتی دارند، با این حال برخی ممکن است اندازه پویایی داشته باشند، مانند نوع رشته (string)\&. برخی از انواع نیز دارای ثابت‌های نمادین از پیش تعریف‌شده هستند\&. این موارد را می‌توان با استفاده از دستور \fBdescribe\fR در nft فهرست کرد: .sp .if n \{\ .RS 4 .\} .nf $ nft describe ct_state datatype ct_state (conntrack state) (basetype bitmask, integer), 32 bits pre\-defined symbolic constants (in hexadecimal): invalid 0x00000001 new \&.\&.\&. .fi .if n \{\ .RE .\} .sp انواع داده ممکن است از انواع مرتبه پایین‌تر مشتق شوند، برای مثال نوع آدرس IPv4 از نوع عدد صحیح مشتق شده است، به این معنی که یک آدرس IPv4 را می‌توان به صورت یک مقدار عدد صحیح نیز مشخص کرد\&. .sp در برخی زمینه‌ها (تعاریف set و map)، تعیین صریح یک نوع داده ضروری است\&. هر نوع دارای نامی است که برای این منظور استفاده می‌شود\&. .SS "نوع عدد صحیح (INTEGER TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp عدد صحیح (Integer) T}:T{ .sp integer T}:T{ .sp متغیر T}:T{ .sp \- T} .TE .sp 1 .sp نوع عدد صحیح (integer) برای مقادیر عددی استفاده می‌شود\&. این نوع می‌تواند به صورت یک عدد ده‌دهی (decimal)، هگزادسیمال یا هشت‌هشتی (octal) مشخص شود\&. نوع عدد صحیح اندازه ثابتی ندارد، و اندازه آن توسط عبارتی که برای آن استفاده می‌شود تعیین می‌گردد\&. .SS "نوع ماسک بیتی (BITMASK TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp ماسک بیتی (Bitmask) T}:T{ .sp bitmask T}:T{ .sp متغیر T}:T{ .sp integer T} .TE .sp 1 .sp نوع ماسک بیتی (\fBbitmask\fR) برای ماسک‌های بیتی استفاده می‌شود\&. .sp در عبارات، بیت‌های یک ماسک بیتی را می‌توان به صورت \fB\fIbit\fR\fR\fB[,\fR\fB\fIbit\fR\fR\fB]\&...\fR مشخص کرد که در آن \fIbit\fR مقدار بیت یا در صورت وجود، یک ثابت نمادین از پیش تعریف‌شده است (برای مثال بیت 0x1 در \fBct state\fR دارای ثابت نمادین new است)\&. .sp برابری یک مقدار با چنین ماسک بیتی زمانی برقرار است که مقدار، هر یک از بیت‌های تعیین‌شده ماسک بیتی را داشته باشد (و به صورت اختیاری سایر بیت‌ها را نیز شامل شود)\&. .sp سینتکس \fB\fIexpression\fR\fR\fB \fR\fB\fIvalue\fR\fR\fB / \fR\fB\fImask\fR\fR با \fB\fIexpression\fR\fR\fB and \fR\fB\fImask\fR\fR\fB == \fR\fB\fIvalue\fR\fR یکسان است\&. برای مثال tcp flags syn,ack / syn,ack,fin,rst با tcp flags and (syn|ack|fin|rst) == syn|ack یکسان است\&. .sp توجه داشته باشید که \fB\fIexpression\fR\fR\fB \fR\fB\fIbit\fR\fR\fB[,\fR\fB\fIbit\fR\fR\fB]\&...\fR به طور کلی با \fB\fIexpression\fR\fR\fB {\fR\fB\fIbit\fR\fR\fB[,\fR\fB\fIbit\fR\fR\fB]\&...}\fR یکسان نیست و در مورد یک مجموعه نام‌گذاری‌شده (named set) نیز به همین صورت است\&. اشکال دوم در واقع جستجو در یک مجموعه هستند و تنها زمانی مطابقت دارند که مجموعه دقیقاً شامل یک مقدار منطبق باشد\&. با این حال، زمانی که همه بیت‌ها از نظر معنایی مانعة‌الجمع (mutually exclusive) باشند، این دو حالت در عمل یکسان هستند (که تطبیق ماسک بیتی معمولاً سریع‌تر است)\&. .sp مثال‌ها: * \fBtcp flags syn,ack\fR بسته‌هایی را مطابقت می‌دهد که فلگ SYN، فلگ ACK یا هر دو فلگ SYN و ACK در آن‌ها تنظیم شده باشد\&. سایر فلگ‌ها نادیده گرفته می‌شوند\&. \fBtcp flags { syn, ack }\fR بسته‌هایی را مطابقت می‌دهد که فقط فلگ SYN یا فقط فلگ ACK در آن‌ها تنظیم شده باشد\&. همه فلگ‌های دیگر باید غیرفعال باشند\&. * \fBct state established,related\fR و \fBct state { established, related }\fR دقیقاً بسته‌های یکسانی را مطابقت می‌دهند، زیرا بیت‌های \fBct state\fR همگی مانعة‌الجمع هستند\&. .sp طبق معمول، می‌توان از دستور \fBnft describe\fR برای دریافت جزئیات مربوط به یک نوع داده استفاده کرد که برای ماسک‌های بیتی، نام‌های نمادین و مقادیر بیت‌ها را نمایش می‌دهد\&. .SS "نوع رشته (STRING TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp رشته (String) T}:T{ .sp string T}:T{ .sp متغیر T}:T{ .sp \- T} .TE .sp 1 .sp نوع رشته (string) برای رشته‌های متنی و کاراکتری استفاده می‌شود\&. یک رشته با یک نویسه الفبایی (a\-zA\-Z) آغاز می‌شود که به دنبال آن صفر یا چند نویسه الفبایی‌عددی یا نویسه‌های /، \-، _ و \&. قرار می‌گیرند\&. علاوه بر این، هر متنی که درون گیومه دوتایی (") قرار گیرد به عنوان رشته شناخته می‌شود\&. .PP \fBتعیین نوع رشته (String specification)\fR. .sp .if n \{\ .RS 4 .\} .nf # Interface name filter input iifname eth0 # Weird interface name filter input iifname "(eth0)" .fi .if n \{\ .RE .\} .sp .SS "نوع رابط کاربری (INTERFACE TYPE TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp نوع رابط کاربری (Interface type) T}:T{ .sp iface_type T}:T{ .sp ۱۶ بیت T}:T{ .sp integer T} .TE .sp 1 .sp نوع نوع رابط کاربری (interface type type) همراه با عبارت \fBmeta iiftype/oiftype\fR استفاده می‌شود\&. مقادیر آن با تعاریف مربوطه ARPHRD_* در مطابقت دارند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۱۷.\ \&کلیدواژه‌های زیر به طور خودکار به یک نوع رابط با مقدار داده‌شده تبدیل می‌شوند: .TS allbox tab(:); ltB ltB. T{ کلیدواژه T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp ether T}:T{ .sp 1 T} T{ .sp ppp T}:T{ .sp 512 T} T{ .sp ipip T}:T{ .sp 768 T} T{ .sp ipip6 T}:T{ .sp 769 T} T{ .sp loopback T}:T{ .sp 772 T} T{ .sp sit T}:T{ .sp 776 T} T{ .sp ipgre T}:T{ .sp 778 T} .TE .sp 1 .SS "نوع آدرس لایه پیوند (LINK LAYER ADDRESS TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp آدرس لایه پیوند (Link layer address) T}:T{ .sp lladdr T}:T{ .sp متغیر T}:T{ .sp integer T} .TE .sp 1 .sp نوع آدرس لایه پیوند (link layer address) برای آدرس‌های لایه پیوند استفاده می‌شود\&. آدرس‌های لایه پیوند به صورت تعداد متغیری از گروه‌های دو رقمی هگزادسیمال که با دونقطه (:) از هم جدا شده‌اند مشخص می‌شوند\&. .PP \fBمشخص کردن آدرس لایه پیوند (Link layer address specification)\fR. .sp .if n \{\ .RS 4 .\} .nf # Ethernet destination MAC address filter input ether daddr 20:c9:d0:43:12:d9 .fi .if n \{\ .RE .\} .sp .SS "نوع آدرس IPV4 (IPV4 ADDRESS TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp آدرس IPv4 T}:T{ .sp ipv4_addr T}:T{ .sp ۳۲ بیت T}:T{ .sp integer T} .TE .sp 1 .sp نوع آدرس IPv4 برای آدرس‌های IPv4 استفاده می‌شود\&. آدرس‌ها به صورت نشانه‌گذاری ده‌دهی نقطه‌دار (dotted decimal)، هگزادسیمال نقطه‌دار، هشت‌هشتی نقطه‌دار، ده‌دهی، هگزادسیمال، هشت‌هشتی یا به عنوان یک نام میزبان (host name) مشخص می‌شوند\&. نام میزبان با استفاده از تحلیل‌گر استاندارد سیستم (resolver) ترجمه خواهد شد\&. .PP \fBمشخص کردن آدرس IPv4 (IPv4 address specification)\fR. .sp .if n \{\ .RS 4 .\} .nf # dotted decimal notation filter output ip daddr 127\&.0\&.0\&.1 # host name filter output ip daddr localhost .fi .if n \{\ .RE .\} .sp .SS "نوع آدرس IPV6 (IPV6 ADDRESS TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp آدرس IPv6 T}:T{ .sp ipv6_addr T}:T{ .sp ۱۲۸ بیت T}:T{ .sp integer T} .TE .sp 1 .sp نوع آدرس IPv6 برای آدرس‌های IPv6 استفاده می‌شود\&. آدرس‌ها به صورت یک نام میزبان یا به صورت نیم‌کلمه‌های (halfwords) هگزادسیمال جدا شده با دونقطه مشخص می‌شوند\&. آدرس‌ها ممکن است درون براکت‌های مربع ("[]") قرار گیرند تا از شماره پورت متمایز شوند\&. .PP \fBمشخص کردن آدرس IPv6 (IPv6 address specification)\fR. .sp .if n \{\ .RS 4 .\} .nf # abbreviated loopback address filter output ip6 daddr ::1 .fi .if n \{\ .RE .\} .PP \fBمشخص کردن آدرس IPv6 با نشانه‌گذاری براکت (IPv6 address specification with bracket notation)\fR. .sp .if n \{\ .RS 4 .\} .nf # 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 .fi .if n \{\ .RE .\} .sp .SS "نوع بولی (BOOLEAN TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp بولی (Boolean) T}:T{ .sp boolean T}:T{ .sp ۱ بیت T}:T{ .sp integer T} .TE .sp 1 .sp نوع بولی (boolean) یک نوع کمکی نحوی در فضای کاربری (userspace) است\&. کاربرد آن در سمت راست یک عبارت رابطه‌ای (معمولاً ضمنی) است تا عبارت سمت چپ را به یک بررسی بولی (معمولاً برای بررسی وجود) تبدیل کند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۱۸.\ \&کلیدواژه‌های زیر به طور خودکار به یک نوع بولی با مقدار داده‌شده تبدیل می‌شوند: .TS allbox tab(:); ltB ltB. T{ کلیدواژه T}:T{ مقدار T} .T& lt lt lt lt. T{ .sp exists T}:T{ .sp 1 T} T{ .sp missing T}:T{ .sp 0 T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۱۹.\ \&عباراتی که از مقایسه بولی پشتیبانی می‌کنند .TS allbox tab(:); ltB ltB. T{ عبارت T}:T{ رفتار T} .T& lt lt lt lt lt lt. T{ .sp fib T}:T{ .sp بررسی وجود مسیر\&. T} T{ .sp exthdr T}:T{ .sp بررسی وجود هدر افزونه IPv6\&. T} T{ .sp tcp option T}:T{ .sp بررسی وجود هدر گزینه TCP\&. T} .TE .sp 1 .PP \fBمشخص کردن بولی (Boolean specification)\fR. .sp .if n \{\ .RS 4 .\} .nf # 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 .fi .if n \{\ .RE .\} .sp .SS "نوع نوع ICMP (ICMP TYPE TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp نوع ICMP T}:T{ .sp icmp_type T}:T{ .sp ۸ بیت T}:T{ .sp integer T} .TE .sp 1 .sp نوع نوع ICMP برای مشخص کردن آسان فیلد نوع (type) در هدر ICMP استفاده می‌شود\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲۰.\ \&کلیدواژه‌هایی که می‌توان هنگام تعیین نوع ICMP استفاده کرد: .TS allbox tab(:); ltB ltB. T{ کلیدواژه T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp echo\-reply T}:T{ .sp 0 T} T{ .sp destination\-unreachable T}:T{ .sp 3 T} T{ .sp source\-quench T}:T{ .sp 4 T} T{ .sp redirect T}:T{ .sp 5 T} T{ .sp echo\-request T}:T{ .sp 8 T} T{ .sp router\-advertisement T}:T{ .sp 9 T} T{ .sp router\-solicitation T}:T{ .sp 10 T} T{ .sp time\-exceeded T}:T{ .sp 11 T} T{ .sp parameter\-problem T}:T{ .sp 12 T} T{ .sp timestamp\-request T}:T{ .sp 13 T} T{ .sp timestamp\-reply T}:T{ .sp 14 T} T{ .sp info\-request T}:T{ .sp 15 T} T{ .sp info\-reply T}:T{ .sp 16 T} T{ .sp address\-mask\-request T}:T{ .sp 17 T} T{ .sp address\-mask\-reply T}:T{ .sp 18 T} .TE .sp 1 .PP \fBمشخص کردن نوع ICMP (ICMP Type specification)\fR. .sp .if n \{\ .RS 4 .\} .nf # match ping packets filter output icmp type { echo\-request, echo\-reply } .fi .if n \{\ .RE .\} .sp .SS "نوع کد ICMP (ICMP CODE TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp کد ICMP T}:T{ .sp icmp_code T}:T{ .sp ۸ بیت T}:T{ .sp integer T} .TE .sp 1 .sp نوع کد ICMP برای مشخص کردن آسان فیلد کد (code) در هدر ICMP استفاده می‌شود\&. .SS "نوع نوع ICMPV6 (ICMPV6 TYPE TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp نوع ICMPv6 T}:T{ .sp icmpv6_type T}:T{ .sp ۸ بیت T}:T{ .sp integer T} .TE .sp 1 .sp نوع نوع ICMPv6 برای مشخص کردن آسان فیلد نوع (type) در هدر ICMPv6 استفاده می‌شود\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲۱.\ \&کلیدواژه‌هایی که می‌توان هنگام تعیین نوع ICMPv6 استفاده کرد: .TS allbox tab(:); ltB ltB. T{ کلیدواژه T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp destination\-unreachable T}:T{ .sp 1 T} T{ .sp packet\-too\-big T}:T{ .sp 2 T} T{ .sp time\-exceeded T}:T{ .sp 3 T} T{ .sp parameter\-problem T}:T{ .sp 4 T} T{ .sp echo\-request T}:T{ .sp 128 T} T{ .sp echo\-reply T}:T{ .sp 129 T} T{ .sp mld\-listener\-query T}:T{ .sp 130 T} T{ .sp mld\-listener\-report T}:T{ .sp 131 T} T{ .sp mld\-listener\-done T}:T{ .sp 132 T} T{ .sp mld\-listener\-reduction T}:T{ .sp 132 T} T{ .sp nd\-router\-solicit T}:T{ .sp 133 T} T{ .sp nd\-router\-advert T}:T{ .sp 134 T} T{ .sp nd\-neighbor\-solicit T}:T{ .sp 135 T} T{ .sp nd\-neighbor\-advert T}:T{ .sp 136 T} T{ .sp nd\-redirect T}:T{ .sp 137 T} T{ .sp router\-renumbering T}:T{ .sp 138 T} T{ .sp ind\-neighbor\-solicit T}:T{ .sp 141 T} T{ .sp ind\-neighbor\-advert T}:T{ .sp 142 T} T{ .sp mld2\-listener\-report T}:T{ .sp 143 T} .TE .sp 1 .PP \fBمشخص کردن نوع ICMPv6 (ICMPv6 Type specification)\fR. .sp .if n \{\ .RS 4 .\} .nf # match ICMPv6 ping packets filter output icmpv6 type { echo\-request, echo\-reply } .fi .if n \{\ .RE .\} .sp .SS "نوع کد ICMPV6 (ICMPV6 CODE TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp کد ICMPv6 T}:T{ .sp icmpv6_code T}:T{ .sp ۸ بیت T}:T{ .sp integer T} .TE .sp 1 .sp نوع کد ICMPv6 برای مشخص کردن آسان فیلد کد (code) در هدر ICMPv6 استفاده می‌شود\&. .SS "انواع ردگیری اتصال (CONNTRACK TYPES)" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲۲.\ \&نمای کلی انواع مورد استفاده در عبارت و دستور ct .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp حالت ردگیری اتصال (conntrack state) T}:T{ .sp ct_state T}:T{ .sp ۴ بایت T}:T{ .sp bitmask T} T{ .sp جهت ردگیری اتصال (conntrack direction) T}:T{ .sp ct_dir T}:T{ .sp ۸ بیت T}:T{ .sp integer T} T{ .sp وضعیت ردگیری اتصال (conntrack status) T}:T{ .sp ct_status T}:T{ .sp ۴ بایت T}:T{ .sp bitmask T} T{ .sp بیت‌های رویداد ردگیری اتصال (conntrack event bits) T}:T{ .sp ct_event T}:T{ .sp ۴ بایت T}:T{ .sp bitmask T} T{ .sp برچسب ردگیری اتصال (conntrack label) T}:T{ .sp ct_label T}:T{ .sp ۱۲۸ بیت T}:T{ .sp bitmask T} .TE .sp 1 .sp برای هر یک از انواع فوق، کلیدواژه‌هایی برای سهولت استفاده در دسترس هستند: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲۳.\ \&حالت ردگیری اتصال (ct_state) .TS allbox tab(:); ltB ltB. T{ کلیدواژه T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt lt lt. T{ .sp invalid T}:T{ .sp 1 T} T{ .sp established T}:T{ .sp 2 T} T{ .sp related T}:T{ .sp 4 T} T{ .sp new T}:T{ .sp 8 T} T{ .sp untracked T}:T{ .sp 64 T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲۴.\ \&جهت ردگیری اتصال (ct_dir) .TS allbox tab(:); ltB ltB. T{ کلیدواژه T}:T{ مقدار T} .T& lt lt lt lt. T{ .sp original T}:T{ .sp 0 T} T{ .sp reply T}:T{ .sp 1 T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲۵.\ \&وضعیت ردگیری اتصال (ct_status) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ مقدار T}:T{ توضیحات T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp expected T}:T{ .sp 1 T}:T{ .sp اتصال مورد انتظار؛ توسط conntrack helper راه‌اندازی شده است T} T{ .sp seen\-reply T}:T{ .sp 2 T}:T{ .sp ردگیری اتصال (conntrack) بسته‌ها را در هر دو جهت دیده است T} T{ .sp assured T}:T{ .sp 4 T}:T{ .sp در صورت پر شدن جدول هش (hash table)، مدخل conntrack حذف نخواهد شد T} T{ .sp confirmed T}:T{ .sp 8 T}:T{ .sp بسته اولیه پردازش شده است T} T{ .sp snat T}:T{ .sp 16 T}:T{ .sp نشانی مبدا اصلی با مقصد پاسخ متفاوت است T} T{ .sp dnat T}:T{ .sp 32 T}:T{ .sp نشانی مقصد اصلی با مبدا پاسخ متفاوت است T} T{ .sp seq\-adjust T}:T{ .sp 64 T}:T{ .sp بازنویسی شماره ترتیب tcp به دلیل conntrack helper یا synproxy T} T{ .sp snat\-done T}:T{ .sp 128 T}:T{ .sp برای یافتن قاعده منطبق snat/masquerade تلاش شده است T} T{ .sp dnat\-done T}:T{ .sp 256 T}:T{ .sp برای یافتن قاعده منطبق dnat/redirect تلاش شده است T} T{ .sp dying T}:T{ .sp 512 T}:T{ .sp اتصال در آستانه حذف شدن است T} T{ .sp fixed\-timeout T}:T{ .sp 1024 T}:T{ .sp مدخل حتی در صورت فعال بودن ترافیک منقضی می‌شود T} T{ .sp helper T}:T{ .sp 8192 T}:T{ .sp اتصال توسط conntrack helper تحت نظارت است T} T{ .sp offload T}:T{ .sp 16384 T}:T{ .sp اتصال به یک جدول جریان (flow table) برون‌سپاری شده است T} T{ .sp hw\-offload T}:T{ .sp 32768 T}:T{ .sp اتصال به سخت‌افزار برون‌سپاری شده است T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲۶.\ \&بیت‌های رویداد ردگیری اتصال (ct_event) .TS allbox tab(:); ltB ltB. T{ کلیدواژه T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp new T}:T{ .sp 1 T} T{ .sp related T}:T{ .sp 2 T} T{ .sp destroy T}:T{ .sp 4 T} T{ .sp reply T}:T{ .sp 8 T} T{ .sp assured T}:T{ .sp 16 T} T{ .sp protoinfo T}:T{ .sp 32 T} T{ .sp helper T}:T{ .sp 64 T} T{ .sp mark T}:T{ .sp 128 T} T{ .sp seqadj T}:T{ .sp 256 T} T{ .sp secmark T}:T{ .sp 512 T} T{ .sp label T}:T{ .sp 1024 T} .TE .sp 1 .sp کلیدواژه‌های ممکن برای نوع برچسب ردگیری اتصال (ct_label) در زمان اجرا از مسیر /etc/connlabel\&.conf خوانده می‌شوند\&. .SS "نوع بسته DCCP (DCCP PKTTYPE TYPE)" .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ کلیدواژه T}:T{ اندازه T}:T{ نوع پایه T} .T& lt lt lt lt. T{ .sp نوع بسته DCCP T}:T{ .sp dccp_pkttype T}:T{ .sp ۴ بیت T}:T{ .sp integer T} .TE .sp 1 .sp نوع بسته DCCP مقادیر مجاز مختلف فیلد ۴ بیتی مربوطه در هدر DCCP را طبق RFC4340 انتزاع می‌کند\&. توجه داشته باشید که مقادیر احتمالی ۱۰\-۱۵ رزروشده تلقی می‌شوند و بنابراین استفاده از آن‌ها مجاز نیست\&. در تطبیق \fBdccp\fR ابزار iptables، این مقادیر با نام مستعار \fIINVALID\fR شناخته می‌شوند\&. در nftables، می‌توان به سادگی روی محدوده مقادیر عددی تطبیق انجام داد، یعنی \fB10\-15\fR\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲۷.\ \&کلیدواژه‌هایی که می‌توان هنگام تعیین نوع بسته DCCP استفاده کرد .TS allbox tab(:); ltB ltB. T{ کلیدواژه T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp request T}:T{ .sp 0 T} T{ .sp response T}:T{ .sp 1 T} T{ .sp data T}:T{ .sp 2 T} T{ .sp ack T}:T{ .sp 3 T} T{ .sp dataack T}:T{ .sp 4 T} T{ .sp closereq T}:T{ .sp 5 T} T{ .sp close T}:T{ .sp 6 T} T{ .sp reset T}:T{ .sp 7 T} T{ .sp sync T}:T{ .sp 8 T} T{ .sp syncack T}:T{ .sp 9 T} .TE .sp 1 .SH "عبارت‌های اولیه (PRIMARY EXPRESSIONS)" .sp پایین‌ترین مرتبه عبارت، یک عبارت اولیه (primary expression) است که نشان‌دهنده یک مقدار ثابت یا داده‌ای منفرد از بار داده (payload) بسته، متاداده یا یک ماژول حالت‌مند (stateful) می‌باشد\&. .SS "عبارت‌های متاداده (META EXPRESSIONS)" .sp .if n \{\ .RS 4 .\} .nf \fBmeta\fR {\fBlength\fR | \fBnfproto\fR | \fBl4proto\fR | \fBprotocol\fR | \fBpriority\fR} [\fBmeta\fR] {\fBmark\fR | \fBiif\fR | \fBiifname\fR | \fBiiftype\fR | \fBoif\fR | \fBoifname\fR | \fBoiftype\fR | \fBskuid\fR | \fBskgid\fR | \fBnftrace\fR | \fBrtclassid\fR | \fBibrname\fR | \fBobrname\fR | \fBpkttype\fR | \fBcpu\fR | \fBiifgroup\fR | \fBoifgroup\fR | \fBcgroup\fR | \fBrandom\fR | \fBipsec\fR | \fBiifkind\fR | \fBoifkind\fR | \fBtime\fR | \fBhour\fR | \fBday\fR } .fi .if n \{\ .RE .\} .sp یک عبارت متاداده به متاداده‌های مرتبط با یک بسته اشاره دارد\&. .sp دو نوع عبارت متاداده وجود دارد: عبارت‌های متاداده مقید (qualified) و نامقید (unqualified)\&. عبارت‌های متاداده مقید نیازمند کلمه کلیدی meta قبل از کلید متاداده هستند؛ عبارت‌های متاداده نامقید را می‌توان مستقیماً با استفاده از کلید متاداده یا به‌صورت عبارت‌های مقید مشخص کرد\&. عبارت meta l4proto برای تطبیق با یک پروتکل لایه انتقال مشخص که بخشی از بسته IPv4 یا IPv6 است مفید است\&. این عبارت همچنین هرگونه سرآیند الحاقی IPv6 موجود در بسته IPv6 را نادیده می‌گیرد\&. .sp عبارت‌های meta iif، oif، iifname و oifname برای تطبیق با رابطی که بسته از آن وارد شده یا در حال ارسال از آن است به کار می‌روند\&. .sp عبارت‌های iif و oif برای تطبیق بر اساس اندیس رابط (interface index) استفاده می‌شوند، در حالی که iifname و oifname برای تطبیق بر اساس نام رابط به کار می‌روند\&. این دو یکسان نیستند \(em با فرض قاعده زیر: .sp .if n \{\ .RS 4 .\} .nf filter input meta iif "foo" .fi .if n \{\ .RE .\} .sp این قاعده تنها در صورتی می‌تواند اضافه شود که رابط "foo" وجود داشته باشد\&. همچنین، این قاعده حتی اگر نام رابط "foo" به "bar" تغییر یابد همچنان تطبیق داده خواهد شد\&. .sp علت این است که در ساختار داخلی از اندیس رابط استفاده می‌شود\&. در مورد رابط‌هایی که به‌صورت پویا ایجاد می‌شوند، مانند رابط‌های tun/tap یا رابط‌های dialup (به عنوان مثال ppp)، بهتر است از iifname یا oifname استفاده شود\&. .sp در این موارد، نام رابط استفاده می‌شود؛ بنابراین برای افزودن چنین قاعده‌ای نیازی به وجود رابط نیست، در صورت تغییر نام رابط تطبیق متوقف می‌شود و در صورت حذف رابط و ساخت مجدد رابطی با همان نام در آینده، مجدداً تطبیق می‌یابد\&. .sp همانند iptables، تطبیق با نویسه عمومی (wildcard) روی پیشوند نام رابط برای تطبیق‌های \fBiifname\fR و \fBoifname\fR با افزودن یک نویسه ستاره (*) امکان‌پذیر است\&. با این حال توجه داشته باشید که برخلاف iptables، nftables نام رابط‌هایی را که تنها شامل نویسه عمومی هستند نمی‌پذیرد \- کاربران باید صرفاً از این عبارت‌های همیشه منطبق صرف‌نظر کنند\&. برای تطبیق با خود نویسه ستاره به‌صورت تحت‌اللفظی، می‌توان آن را با بک‌اسلش (\e) اسکیپ کرد\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲۸.\ \&انواع عبارت‌های متاداده (Meta expression types) .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp length T}:T{ .sp طول بسته بر حسب بایت T}:T{ .sp integer (32\-bit) T} T{ .sp nfproto T}:T{ .sp خانواده واقعی پروتکل هوک، تنها در جدول inet کاربرد دارد T}:T{ .sp integer (32 bit) T} T{ .sp l4proto T}:T{ .sp پروتکل لایه ۴، هدرهای الحاقی ipv6 را نادیده می‌گیرد T}:T{ .sp integer (8 bit) T} T{ .sp protocol T}:T{ .sp مقدار پروتکل EtherType T}:T{ .sp ether_type T} T{ .sp priority T}:T{ .sp اولویت بسته TC T}:T{ .sp tc_handle T} T{ .sp mark T}:T{ .sp نشان بسته (Packet mark) T}:T{ .sp mark T} T{ .sp iif T}:T{ .sp اندیس رابط ورودی T}:T{ .sp iface_index T} T{ .sp iifname T}:T{ .sp نام رابط ورودی T}:T{ .sp ifname T} T{ .sp iiftype T}:T{ .sp نوع رابط ورودی T}:T{ .sp iface_type T} T{ .sp oif T}:T{ .sp اندیس رابط خروجی T}:T{ .sp iface_index T} T{ .sp oifname T}:T{ .sp نام رابط خروجی T}:T{ .sp ifname T} T{ .sp oiftype T}:T{ .sp نوع سخت‌افزاری رابط خروجی T}:T{ .sp iface_type T} T{ .sp sdif T}:T{ .sp اندیس رابط ورودی دستگاه Slave T}:T{ .sp iface_index T} T{ .sp sdifname T}:T{ .sp نام رابط دستگاه Slave T}:T{ .sp ifname T} T{ .sp skuid T}:T{ .sp شناسه کاربر (UID) مرتبط با سوکت مبدا T}:T{ .sp uid T} T{ .sp skgid T}:T{ .sp شناسه گروه (GID) مرتبط با سوکت مبدا T}:T{ .sp gid T} T{ .sp rtclassid T}:T{ .sp قلمرو مسیریابی (Routing realm) T}:T{ .sp realm T} T{ .sp ibrname T}:T{ .sp نام رابط پل (Bridge) ورودی T}:T{ .sp ifname T} T{ .sp obrname T}:T{ .sp نام رابط پل (Bridge) خروجی T}:T{ .sp ifname T} T{ .sp pkttype T}:T{ .sp نوع بسته T}:T{ .sp pkt_type T} T{ .sp cpu T}:T{ .sp شماره پردازنده در حال پردازش بسته T}:T{ .sp integer (32 bit) T} T{ .sp iifgroup T}:T{ .sp گروه دستگاه ورودی T}:T{ .sp devgroup T} T{ .sp oifgroup T}:T{ .sp گروه دستگاه خروجی T}:T{ .sp devgroup T} T{ .sp cgroup T}:T{ .sp شناسه net_cls\&.classid از گروه کنترل؛ در میزبان‌های صرفاً مبتنی بر cgroupv2 بدون ساختار فعال net_cls مقدار صفر می‌خواند (برای تطبیق روی cgroupv2، عبارت \fBsocket cgroupv2\fR را ببینید) T}:T{ .sp integer (32 bit) T} T{ .sp random T}:T{ .sp عدد شبه‌تصادفی T}:T{ .sp integer (32 bit) T} T{ .sp ipsec T}:T{ .sp درست (true) اگر بسته با ipsec رمزنگاری شده باشد T}:T{ .sp boolean (1 bit) T} T{ .sp iifkind T}:T{ .sp نوع رابط ورودی T}:T{ .sp T} T{ .sp oifkind T}:T{ .sp نوع رابط خروجی T}:T{ .sp T} T{ .sp time T}:T{ .sp زمان مطلق دریافت بسته T}:T{ .sp Integer (32 bit) or string T} T{ .sp day T}:T{ .sp روز هفته T}:T{ .sp Integer (8 bit) or string T} T{ .sp hour T}:T{ .sp ساعت از شبانه‌روز T}:T{ .sp مقدار رشته‌ای در قالب HH:MM یا HH:MM:SS\&. مقادیر باید کمتر از 24:00 باشند، هرچند به دلایل فنی، 23:59:60 نیز پذیرفته می‌شود\&. T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۲۹.\ \&انواع اختصاصی عبارت‌های متاداده (Meta expression specific types) .TS allbox tab(:); ltB ltB. T{ نوع T}:T{ توضیحات T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp iface_index T}:T{ .sp اندیس رابط (عدد ۳۲ بیتی)\&. می‌تواند به‌صورت عددی یا به عنوان نام یک رابط موجود مشخص شود\&. T} T{ .sp ifname T}:T{ .sp نام رابط (رشته ۱۶ بایتی)\&. نیازی به وجود رابط نیست\&. T} T{ .sp uid T}:T{ .sp شناسه کاربر (عدد ۳۲ بیتی)\&. می‌تواند به‌صورت عددی یا به عنوان نام کاربری مشخص شود\&. T} T{ .sp gid T}:T{ .sp شناسه گروه (عدد ۳۲ بیتی)\&. می‌تواند به‌صورت عددی یا به عنوان نام گروه مشخص شود\&. T} T{ .sp realm T}:T{ .sp قلمرو مسیریابی (Routing Realm - عدد ۳۲ بیتی)\&. می‌تواند به‌صورت عددی یا به عنوان نام نمادین تعریف‌شده در /etc/iproute2/rt_realms مشخص شود\&. T} T{ .sp devgroup_type T}:T{ .sp گروه دستگاه (عدد ۳۲ بیتی)\&. می‌تواند به‌صورت عددی یا به عنوان نام نمادین تعریف‌شده در /etc/iproute2/group مشخص شود\&. T} T{ .sp pkt_type T}:T{ .sp نوع بسته: \fBhost\fR (مخاطب آن میزبان محلی است)، \fBbroadcast\fR (برای همه)، \fBmulticast\fR (برای گروه)، \fBother\fR (مخاطب آن میزبانی دیگر است)\&. T} T{ .sp ifkind T}:T{ .sp نوع رابط (رشته ۱۶ بایتی)\&. برای مشاهده فهرست، بخش TYPES در ip\-link(8) را ببینید\&. T} T{ .sp time T}:T{ .sp یا یک عدد صحیح یا یک تاریخ در قالب 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) در نظر گرفته می‌شود\&. T} T{ .sp day T}:T{ .sp یا یک روز از هفته ("Monday"، "Tuesday" و غیره)، یا یک عدد صحیح بین 0 و 6\&. رشته‌ها بدون حساسیت به حروف بزرگ و کوچک تطبیق داده می‌شوند و تطابق کامل الزامی نیست (مثلاً "Mon" با "Monday" تطبیق می‌یابد)\&. هنگامی که یک عدد صحیح داده می‌شود، 0 برابر یکشنبه (Sunday) و 6 برابر شنبه (Saturday) است\&. برای تطبیق یک بازه از روزهای هفته از یک عبارت بازه‌ای مانند "Monday"\-"Wednesday" استفاده کنید\&. T} T{ .sp hour T}:T{ .sp رشته‌ای که نشان‌دهنده یک ساعت در قالب ۲۴ ساعته است\&. ثانیه‌ها را می‌توان به صورت اختیاری مشخص کرد\&. برای مثال، 17:00 و 17:00:00 معادل خواهند بود\&. برای تطبیق یک بازه زمانی از یک عبارت بازه‌ای مانند "17:00"\-"19:00" استفاده کنید\&. T} .TE .sp 1 .PP \fBاستفاده از عبارت‌های متاداده (Using meta expressions)\fR. .sp .if n \{\ .RS 4 .\} .nf # عبارت متاداده مقید 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 .fi .if n \{\ .RE .\} .sp .SS "عبارت SOCKET (SOCKET EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBsocket\fR {\fBtransparent\fR | \fBmark\fR | \fBwildcard\fR} \fBsocket\fR \fBcgroupv2\fR \fBlevel\fR \fINUM\fR .fi .if n \{\ .RE .\} .sp عبارت socket می‌تواند برای جستجوی یک سوکت TCP/UDP باز موجود و ویژگی‌های آن که می‌توانند با یک بسته مرتبط شوند، مورد استفاده قرار گیرد\&. این عبارت به دنبال یک سوکت شنونده متصل‌شده غیرصفر یا برقرارشده (احتمالاً با یک آدرس غیرمحلی) می‌گردد\&. همچنین می‌توانید از آن برای تطبیق روی cgroupv2 سوکت در یک سطح والد (ancestor) مشخص استفاده کنید؛ برای مثال اگر سوکت به cgroupv2 با نام \fIa/b\fR تعلق داشته باشد، سطح والد 1 تطبیق را روی cgroup \fIa\fR بررسی می‌کند و سطح والد 2 تطبیق را روی cgroup \fIb\fR بررسی می‌نماید\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۳۰.\ \&ویژگی‌های سوکت موجود (Available socket attributes) .TS allbox tab(:); ltB ltB ltB. T{ نام T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp transparent T}:T{ .sp مقدار گزینه سوکت IP_TRANSPARENT در سوکت یافت‌شده\&. این مقدار می‌تواند 0 یا 1 باشد\&. T}:T{ .sp boolean (1 bit) T} T{ .sp mark T}:T{ .sp مقدار نشان سوکت (SOL_SOCKET, SO_MARK)\&. T}:T{ .sp mark T} T{ .sp wildcard T}:T{ .sp نشان می‌دهد که آیا سوکت به صورت wildcard متصل شده است یا خیر (مانند 0\&.0\&.0\&.0 یا ::0)\&. T}:T{ .sp boolean (1 bit) T} T{ .sp cgroupv2 T}:T{ .sp نسخه 2 cgroup برای این سوکت (مسیر از /sys/fs/cgroup) T}:T{ .sp cgroupv2 T} .TE .sp 1 .PP \fBاستفاده از عبارت socket (Using socket expression)\fR. .sp .if n \{\ .RS 4 .\} .nf # نشانه‌گذاری بسته‌های متناظر با یک سوکت شفاف (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 } } .fi .if n \{\ .RE .\} .sp .SS "عبارت OSF (OSF EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBosf\fR [\fBttl\fR {\fBloose\fR | \fBskip\fR}] {\fBname\fR | \fBversion\fR} .fi .if n \{\ .RE .\} .sp عبارت osf انگشت‌نگاری (fingerprinting) غیرفعال سیستم‌عامل را انجام می‌دهد\&. این عبارت برخی داده‌ها (مانند Window Size، MSS، گزینه‌ها و ترتیب آن‌ها، DF و غیره) را از بسته‌هایی که بیت SYN آن‌ها تنظیم شده است، مقایسه می‌کند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۳۱.\ \&ویژگی‌های osf موجود (Available osf attributes) .TS allbox tab(:); ltB ltB ltB. T{ نام T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt. T{ .sp ttl T}:T{ .sp بررسی TTL روی بسته برای تعیین سیستم‌عامل\&. T}:T{ .sp string T} T{ .sp version T}:T{ .sp بررسی نسخه سیستم‌عامل روی بسته\&. T}:T{ .sp T} T{ .sp name T}:T{ .sp نام امضای سیستم‌عامل برای تطبیق\&. تمام امضاها را می‌توان در فایل pf\&.os یافت\&. از "unknown" برای امضاهای سیستم‌عاملی که عبارت قادر به تشخیص آن‌ها نبوده استفاده کنید\&. T}:T{ .sp string T} .TE .sp 1 .PP \fBمقادیر ttl موجود (Available ttl values)\fR. .sp .if n \{\ .RS 4 .\} .nf اگر هیچ ویژگی TTL ارسال نشود، یک مقایسه مستقیم و دقیق بین هدر IP و TTL امضا انجام می‌شود\&. این حالت معمولاً برای شبکه‌های محلی (LAN) کاربرد دارد\&. * loose: بررسی می‌کند که آیا TTL هدر IP کمتر از TTL امضا است یا خیر\&. برای آدرس‌های سراسری و مسیریابی‌پذیر (globally-routable) کار می‌کند\&. * skip: اصلاً TTL را مقایسه نمی‌کند\&. .fi .if n \{\ .RE .\} .PP \fBاستفاده از عبارت osf (Using osf expression)\fR. .sp .if n \{\ .RS 4 .\} .nf # پذیرش بسته‌هایی که با امضای دسته سیستم‌عامل "Linux" بدون مقایسه TTL تطبیق دارند\&. table inet x { chain y { type filter hook input priority filter; policy accept; osf ttl skip name "Linux" } } .fi .if n \{\ .RE .\} .sp .SS "عبارت‌های FIB (FIB EXPRESSIONS)" .sp .if n \{\ .RS 4 .\} .nf \fBfib\fR \fIFIB_TUPLE\fR \fIFIB_RESULT\fR \fIFIB_TUPLE\fR := { \fBsaddr\fR | \fBdaddr\fR} [ \fB\&.\fR { \fBiif\fR | \fBoif\fR } \fB\&.\fR \fBmark\fR ] \fIFIB_RESULT\fR := { \fBoif\fR | \fBoifname\fR | \fBcheck\fR | \fBtype\fR } .fi .if n \{\ .RE .\} .sp یک عبارت fib از پایگاه اطلاعات هدایت بسته (FIB - Forwarding Information Base) برای به دست آوردن اطلاعاتی مانند اندیس رابط خروجی پرس‌وجو می‌کند\&. .sp نخستین آرگومان‌های عبارت \fBfib\fR کلیدهای ورودی هستند که به تابع جستجوی fib ارسال می‌شوند\&. یکی از کلیدهای \fBsaddr\fR یا \fBdaddr\fR اجباری است و همچنین مانعة‌الجمع (mutually exclusive) هستند\&. .sp کلمات کلیدی \fBmark\fR، \fBiif\fR و \fBoif\fR اصلاح‌کننده‌های اختیاری برای تاثیرگذاری بر نتیجه جستجو هستند؛ برای توضیحات، جدول کلمات کلیدی \fBFIB_TUPLE\fR را در زیر ببینید\&. کلمات کلیدی چندتایی \fBiif\fR و \fBoif\fR نیز مانعة‌الجمع هستند\&. .sp آخرین آرگومان عبارت \fBfib\fR نوع نتیجه مورد نظر است\&. .sp گزینه \fBoif\fR درخواست دریافت اندیس رابطی را دارد که برای ارسال بسته‌ها به مبدا بسته (کلید \fBsaddr\fR) یا مقصد بسته (کلید \fBdaddr\fR) استفاده می‌شود\&. اگر هیچ مدخل مسیریابی یافت نشود، اندیس رابط برگردانده‌شده 0 خواهد بود\&. .sp گزینه \fBoifname\fR مانند \fBoif\fR است، اما به جای آن نام رابط را پر می‌کند\&. این ویژگی برای بررسی رابط‌های پویا مانند دستگاه‌های ppp کاربردی است\&. اگر هیچ مدخلی یافت نشود، یک نام رابط خالی بازگردانده می‌شود\&. .sp گزینه \fBtype\fR نوع آدرس مانند تک‌پخشی (unicast) یا چندپخشی (multicast) را برمی‌گرداند\&. فهرست کاملی از انواع آدرس پشتیبانی‌شده را می‌توان با دستور \fBnft\fR \fBdescribe\fR \fBfib_addrtype\fR مشاهده کرد\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۳۲.\ \&کلمات کلیدی FIB_TUPLE (FIB_TUPLE keywords) .TS allbox tab(:); ltB ltB. T{ فلگ T}:T{ توضیحات T} .T& lt lt lt lt lt lt lt lt lt lt. T{ .sp daddr T}:T{ .sp انجام جستجوی عادی مسیر: جستجو در fib برای مسیر به سمت \fBآدرس مقصد\fR بسته\&. T} T{ .sp saddr T}:T{ .sp انجام جستجوی معکوس مسیر: جستجو در fib برای مسیر به سمت \fBآدرس مبدا\fR بسته\&. T} T{ .sp mark T}:T{ .sp در نظر گرفتن نشان بسته (nfmark) هنگام پرس‌وجو از fib\&. T} T{ .sp iif T}:T{ .sp اگر جستجوی fib مسیری را ارائه داد، بررسی می‌کند که آیا رابط خروجی آن با رابط \fBورودی\fR بسته یکسان است یا خیر\&. T} T{ .sp oif T}:T{ .sp اگر جستجوی fib مسیری را ارائه داد، بررسی می‌کند که آیا رابط خروجی آن با رابط \fBخروجی\fR بسته یکسان است یا خیر\&. این فلگ تنها همراه با نتیجه \fBtype\fR قابل استفاده است\&. T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۳۳.\ \&کلمات کلیدی FIB_RESULT (FIB_RESULT keywords) .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ نوع نتیجه T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp oif T}:T{ .sp اندیس رابط خروجی T}:T{ .sp iface_index T} T{ .sp check T}:T{ .sp بررسی رابط خروجی T}:T{ .sp boolean T} T{ .sp oifname T}:T{ .sp نام رابط خروجی T}:T{ .sp ifname T} T{ .sp type T}:T{ .sp نوع آدرس T}:T{ .sp fib_addrtype (برای مشاهده فهرست، \fBnft\fR \fBdescribe\fR \fBfib_addrtype\fR را ببینید) T} .TE .sp 1 .sp نتیجه \fBoif\fR و \fBoifname\fR تنها در هوک‌های \fBprerouting\fR، \fBinput\fR و \fBforward\fR معتبر است\&. مقدار \fBtype\fR را می‌توان از هر یک از هوک‌های \fBprerouting\fR، \fBinput\fR، \fBforward\fR، \fBoutput\fR و \fBpostrouting\fR استعلام کرد\&. .sp برای \fBtype\fR، وجود کلمه کلیدی \fBiif\fR در اصلاح‌کننده‌های \fIFIB_TUPLE\fR، هوک‌های در دسترس را به مواردی محدود می‌کند که بسته با یک رابط ورودی مرتبط است، یعنی \fBprerouting\fR، \fBinput\fR و \fBforward\fR\&. به همین ترتیب، کلمه کلیدی \fBoif\fR در فهرست اصلاح‌کننده‌های \fIFIB_TUPLE\fR، هوک‌های در دسترس را به \fBforward\fR، \fBoutput\fR و \fBpostrouting\fR محدود می‌سازد\&. .PP \fBاستفاده از عبارت‌های fib (Using fib expressions)\fR. .sp .if n \{\ .RS 4 .\} .nf # انداختن (drop) بسته‌های فاقد مسیر معکوس filter prerouting fib saddr \&. iif oif missing drop در این مثال، عبارت \*(Aqsaddr \&. iif\*(Aq به دنبال مسیری به سمت *آدرس مبدا* بسته می‌گردد و نتایج منطبق را به رابطی که بسته از آن وارد شده محدود می‌کند، سپس اندیس رابط خروجی را از نتیجه مسیر fib به دست آمده ذخیره می‌نماید\&. اگر هیچ مسیری برای ترکیب آدرس مبدا/رابط ورودی یافت نشود، اندیس رابط خروجی صفر خواهد بود\&. بنابراین، این قاعده تمام بسته‌هایی را که مسیر معکوس سخت‌گیرانه (strict reverse path) ندارند حذف می‌کند (بسته پاسخ فرضی از طریق همان رابطی ارسال خواهد شد که بسته آزمایش‌شده از آن دریافت شده است)\&. اگر فقط از \*(Aqsaddr oif\*(Aq به عنوان کلید ورودی استفاده شود، آنگاه این قاعده فقط بسته‌هایی را حذف می‌کند که fib نتواند مسیری برای آن‌ها پیدا کند\&. در بیشتر پیکربندی‌ها این قاعده هرگز بسته‌ای را حذف نخواهد کرد زیرا مسیر پیش‌فرض برگردانده می‌شود\&. # انداختن بسته‌ها در صورتی که آدرس IP مقصد روی رابط ورودی پیکربندی نشده باشد filter prerouting fib daddr \&. iif type != { local, broadcast, multicast } drop این دستور از fib بر اساس آدرس مقصد بسته‌های جاری و رابط ورودی پرس‌وجو می‌کند\&. اگر بسته به یک آدرس unicast ارسال شود که روی رابط متفاوتی پیکربندی شده است، بسته دور انداخته می‌شود چرا که چنین آدرسی از نوع \*(Aqunicast\*(Aq دسته‌بندی خواهد شد\&. بدون اصلاح‌کننده \*(Aqiif\*(Aq، هر آدرس پیکربندی‌شده روی ماشین محلی به عنوان \*(Aqlocal\*(Aq در نظر گرفته می‌شود و آدرس‌های unicast که روی هیچ رابطی پیکربندی نشده‌اند، نوع \*(Aqunicast\*(Aq را برمی‌گردانند\&. # انجام جستجو در یک جدول خاص \*(Aqblackhole\*(Aq (مقدار 0xdead، نیازمند ip rule مناسب است) filter prerouting meta mark set 0xdead fib daddr \&. mark type vmap { blackhole : drop, prohibit : jump prohibited, unreachable : drop } .fi .if n \{\ .RE .\} .sp .SS "عبارت‌های مسیریابی (ROUTING EXPRESSIONS)" .sp .if n \{\ .RS 4 .\} .nf \fBrt\fR [\fBip\fR | \fBip6\fR] {\fBclassid\fR | \fBnexthop\fR | \fBmtu\fR | \fBipsec\fR} .fi .if n \{\ .RE .\} .sp یک عبارت مسیریابی (routing expression) به داده‌های مسیریابی مرتبط با یک بسته اشاره دارد\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۳۴.\ \&انواع عبارت‌های مسیریابی (Routing expression types) .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp classid T}:T{ .sp قلمرو مسیریابی (Routing realm) T}:T{ .sp realm T} T{ .sp nexthop T}:T{ .sp گام بعدی مسیریابی (Routing nexthop) T}:T{ .sp ipv4_addr/ipv6_addr T} T{ .sp mtu T}:T{ .sp حداکثر اندازه سگمنت (MSS) پروتکل TCP برای مسیر T}:T{ .sp integer (16 bit) T} T{ .sp ipsec T}:T{ .sp مسیردهی از طریق تونل یا ترنسپورت ipsec T}:T{ .sp boolean T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۳۵.\ \&انواع اختصاصی عبارت‌های مسیریابی (Routing expression specific types) .TS allbox tab(:); ltB ltB. T{ نوع T}:T{ توضیحات T} .T& lt lt. T{ .sp realm T}:T{ .sp قلمرو مسیریابی (Routing Realm - عدد ۳۲ بیتی)\&. می‌تواند به‌صورت عددی یا به عنوان نام نمادین تعریف‌شده در /etc/iproute2/rt_realms مشخص شود\&. T} .TE .sp 1 .PP \fBاستفاده از عبارت‌های مسیریابی (Using routing expressions)\fR. .sp .if n \{\ .RS 4 .\} .nf # عبارت 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 .fi .if n \{\ .RE .\} .sp .SS "عبارت‌های IPSEC (IPSEC EXPRESSIONS)" .sp .if n \{\ .RS 4 .\} .nf \fBipsec\fR {\fBin\fR | \fBout\fR} [ \fBspnum\fR \fINUM\fR ] {\fBreqid\fR | \fBspi\fR} \fBipsec\fR {\fBin\fR | \fBout\fR} [ \fBspnum\fR \fINUM\fR ] {\fBip\fR | \fBip6\fR} {\fBsaddr\fR | \fBdaddr\fR} .fi .if n \{\ .RE .\} .sp یک عبارت ipsec به داده‌های ipsec مرتبط با یک بسته اشاره دارد\&. .sp کلمه کلیدی \fIin\fR یا \fIout\fR باید برای مشخص کردن اینکه آیا عبارت سیاست‌های ورودی را بررسی کند یا خروجی، به کار رود\&. کلمه کلیدی \fIin\fR می‌تواند در هوک‌های prerouting، input و forward استفاده شود\&. کلمه کلیدی \fIout\fR برای هوک‌های forward، output و postrouting به کار می‌رود\&. کلمه کلیدی اختیاری spnum می‌تواند برای تطبیق با یک وضعیت (state) خاص در یک زنجیره استفاده شود و مقدار پیش‌فرض آن 0 است\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۳۶.\ \&انواع عبارت‌های Ipsec (Ipsec expression types) .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp reqid T}:T{ .sp شناسه درخواست (Request ID) T}:T{ .sp integer (32 bit) T} T{ .sp spi T}:T{ .sp شاخص پارامتر امنیتی (Security Parameter Index) T}:T{ .sp integer (32 bit) T} T{ .sp saddr T}:T{ .sp آدرس مبدا تونل T}:T{ .sp ipv4_addr/ipv6_addr T} T{ .sp daddr T}:T{ .sp آدرس مقصد تونل T}:T{ .sp ipv4_addr/ipv6_addr T} .TE .sp 1 .sp \fBنکته:\fR هنگام استفاده از xfrm_interface، این عبارت در هوک output قابل استفاده نیست چرا که بسته ساده بدون پیوست بودن اطلاعات IPsec از آن عبور می‌کند \- به جای آن از زنجیره‌ای در هوک postrouting استفاده کنید\&. .SS "عبارت NUMGEN (NUMGEN EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBnumgen\fR {\fBinc\fR | \fBrandom\fR} \fBmod\fR \fINUM\fR [ \fBoffset\fR \fINUM\fR ] .fi .if n \{\ .RE .\} .sp یک تولیدکننده عدد ایجاد می‌کند\&. کلمات کلیدی \fBinc\fR یا \fBrandom\fR حالت عملیاتی آن را کنترل می‌کنند: در حالت \fBinc\fR، آخرین مقدار بازگردانده‌شده صرفاً افزایش می‌یابد (increment)\&. در حالت \fBrandom\fR، یک عدد تصادفی جدید بازگردانده می‌شود\&. مقدار پس از کلمه کلیدی \fBmod\fR یک مرز بالا (بخوانید: پیمانه یا modulus) را مشخص می‌کند که اعداد بازگردانده‌شده هرگز به آن نمی‌رسند\&. کلمه کلیدی اختیاری \fBoffset\fR امکان افزایش مقدار بازگردانده‌شده با یک آفست ثابت را فراهم می‌کند\&. .sp یک مورد استفاده رایج برای \fBnumgen\fR متعادل‌سازی بار (load-balancing) است: .PP \fBاستفاده از عبارت numgen (Using numgen expression)\fR. .sp .if n \{\ .RS 4 .\} .nf # روش نوبت‌گردشی (round-robin) بین 192\&.168\&.10\&.100 و 192\&.168\&.20\&.200: add rule nat prerouting dnat to numgen inc mod 2 map \e { 0 : 192\&.168\&.10\&.100, 1 : 192\&.168\&.20\&.200 } # مبتنی بر احتمال با بایاس فرد با استفاده از بازه‌ها: add rule nat prerouting dnat to numgen random mod 10 map \e { 0\-2 : 192\&.168\&.10\&.100, 3\-9 : 192\&.168\&.20\&.200 } .fi .if n \{\ .RE .\} .sp .SS "عبارت‌های هش (HASH EXPRESSIONS)" .sp .if n \{\ .RS 4 .\} .nf \fBjhash\fR {\fBip saddr\fR | \fBip6 daddr\fR | \fBtcp dport\fR | \fBudp sport\fR | \fBether saddr\fR} [\fB\&.\fR \&...] \fBmod\fR \fINUM\fR [ \fBseed\fR \fINUM\fR ] [ \fBoffset\fR \fINUM\fR ] \fBsymhash\fR \fBmod\fR \fINUM\fR [ \fBoffset\fR \fINUM\fR ] .fi .if n \{\ .RE .\} .sp از یک تابع درهم‌سازی (هش) برای تولید یک عدد استفاده می‌کند\&. توابع موجود عبارتند از \fBjhash\fR، معروف به Jenkins Hash، و \fBsymhash\fR، برای هش متقارن (Symmetric Hash)\&. تابع \fBjhash\fR نیازمند یک عبارت برای تعیین پارامترهای سرآیند بسته جهت اعمال درهم‌سازی است و الحاق (concatenation) نیز امکان‌پذیر می‌باشد\&. مقدار پس از کلمه کلیدی \fBmod\fR یک مرز بالا (بخوانید: پیمانه یا modulus) را مشخص می‌کند که اعداد بازگردانده‌شده هرگز به آن نمی‌رسند\&. کلمه کلیدی اختیاری \fBseed\fR برای تعیین یک مقدار اولیه به عنوان بذر (seed) در تابع درهم‌سازی استفاده می‌شود\&. کلمه کلیدی اختیاری \fBoffset\fR امکان افزایش مقدار بازگردانده‌شده با یک آفست ثابت را فراهم می‌کند\&. .sp یک مورد استفاده رایج برای \fBjhash\fR و \fBsymhash\fR متعادل‌سازی بار (load-balancing) است: .PP \fBاستفاده از عبارت‌های هش (Using hash expressions)\fR. .sp .if n \{\ .RS 4 .\} .nf # متعادل‌سازی بار بر اساس ip مبدا بین ۲ آدرس ip: add rule nat prerouting dnat to jhash ip saddr mod 2 map \e { 0 : 192\&.168\&.10\&.100, 1 : 192\&.168\&.20\&.200 } # متعادل‌سازی بار متقارن بین ۲ آدرس ip: add rule nat prerouting dnat to symhash mod 2 map \e { 0 : 192\&.168\&.10\&.100, 1 : 192\&.168\&.20\&.200 } .fi .if n \{\ .RE .\} .sp .SH "عبارت‌های بار مفید (PAYLOAD EXPRESSIONS)" .sp عبارت‌های بار مفید به داده‌های موجود در بار مفید (payload) بسته اشاره دارند\&. .SS "عبارت هدر اترنت (ETHERNET HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBether\fR {\fBdaddr\fR | \fBsaddr\fR | \fBtype\fR} .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&37.\ \&انواع عبارت هدر اترنت (Ethernet header expression types) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt. T{ .sp daddr T}:T{ .sp نشانی MAC مقصد T}:T{ .sp ether_addr T} T{ .sp saddr T}:T{ .sp نشانی MAC مبدا T}:T{ .sp ether_addr T} T{ .sp type T}:T{ .sp EtherType T}:T{ .sp ether_type T} .TE .sp 1 .SS "عبارت هدر VLAN (VLAN HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBvlan\fR {\fBid\fR | \fBdei\fR | \fBpcp\fR | \fBtype\fR} .fi .if n \{\ .RE .\} .sp عبارت vlan برای تطبیق روی فیلدهای هدر vlan استفاده می‌شود\&. این عبارت در خانواده‌های \fBip\fR، \fBip6\fR و \fBinet\fR کار نخواهد کرد، مگر اینکه رابط vlan با تنظیم \fBreorder_hdr off\fR پیکربندی شده باشد\&. مقدار پیش‌فرض \fBreorder_hdr on\fR است که به صورت خودکار تگ vlan را از بسته حذف می‌کند\&. برای اطلاعات بیشتر به .BR ip\-link (8) مراجعه کنید\&. برای این خانواده‌ها، تطبیق نام رابط vlan با استفاده از عبارت‌های \fBmeta iif\fR یا \fBmeta iifname\fR آسان‌تر است\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&38.\ \&عبارت هدر VLAN (VLAN header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp id T}:T{ .sp شناسه VLAN (VID) T}:T{ .sp integer (12 bit) T} T{ .sp dei T}:T{ .sp نشانگر واجد شرایط حذف (Drop Eligible Indicator) T}:T{ .sp integer (1 bit) T} T{ .sp pcp T}:T{ .sp نقطه کد اولویت (Priority code point) T}:T{ .sp integer (3 bit) T} T{ .sp type T}:T{ .sp EtherType T}:T{ .sp ether_type T} .TE .sp 1 .SS "عبارت هدر ARP (ARP HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBarp\fR {\fBhtype\fR | \fBptype\fR | \fBhlen\fR | \fBplen\fR | \fBoperation\fR | \fBsaddr\fR { \fBip\fR | \fBether\fR } | \fBdaddr\fR { \fBip\fR | \fBether\fR } .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&39.\ \&عبارت هدر ARP (ARP header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp htype T}:T{ .sp نوع سخت‌افزار ARP T}:T{ .sp integer (16 bit) T} T{ .sp ptype T}:T{ .sp EtherType T}:T{ .sp ether_type T} T{ .sp hlen T}:T{ .sp طول نشانی سخت‌افزاری T}:T{ .sp integer (8 bit) T} T{ .sp plen T}:T{ .sp طول نشانی پروتکل T}:T{ .sp integer (8 bit) T} T{ .sp operation T}:T{ .sp عملیات T}:T{ .sp arp_op T} T{ .sp saddr ether T}:T{ .sp نشانی اترنت فرستنده T}:T{ .sp ether_addr T} T{ .sp daddr ether T}:T{ .sp نشانی اترنت مقصد T}:T{ .sp ether_addr T} T{ .sp saddr ip T}:T{ .sp نشانی IPv4 فرستنده T}:T{ .sp ipv4_addr T} T{ .sp daddr ip T}:T{ .sp نشانی IPv4 مقصد T}:T{ .sp ipv4_addr T} .TE .sp 1 .SS "عبارت هدر IPV4 (IPV4 HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBip\fR {\fBversion\fR | \fBhdrlength\fR | \fBdscp\fR | \fBecn\fR | \fBlength\fR | \fBid\fR | \fBfrag\-off\fR | \fBttl\fR | \fBprotocol\fR | \fBchecksum\fR | \fBsaddr\fR | \fBdaddr\fR } .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&40.\ \&عبارت هدر IPv4 (IPv4 header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp version T}:T{ .sp نسخه هدر IP (۴) T}:T{ .sp integer (4 bit) T} T{ .sp hdrlength T}:T{ .sp طول هدر IP شامل گزینه‌ها T}:T{ .sp integer (4 bit) FIXME scaling T} T{ .sp dscp T}:T{ .sp نقطه کد خدمات تفکیک‌شده (Differentiated Services Code Point) T}:T{ .sp dscp T} T{ .sp ecn T}:T{ .sp اعلان صریح ازدحام (Explicit Congestion Notification) T}:T{ .sp ecn T} T{ .sp length T}:T{ .sp طول کل بسته T}:T{ .sp integer (16 bit) T} T{ .sp id T}:T{ .sp شناسه IP T}:T{ .sp integer (16 bit) T} T{ .sp frag\-off T}:T{ .sp آفست قطعه (Fragment offset) T}:T{ .sp integer (16 bit) T} T{ .sp ttl T}:T{ .sp طول عمر (TTL) T}:T{ .sp integer (8 bit) T} T{ .sp protocol T}:T{ .sp پروتکل لایه بالاتر T}:T{ .sp inet_proto T} T{ .sp checksum T}:T{ .sp چک‌سام هدر IP T}:T{ .sp integer (16 bit) T} T{ .sp saddr T}:T{ .sp نشانی مبدا T}:T{ .sp ipv4_addr T} T{ .sp daddr T}:T{ .sp نشانی مقصد T}:T{ .sp ipv4_addr T} .TE .sp 1 .sp هنگام تطبیق روی \fBip length\fR مراقب باشید: هسته لینوکس ممکن است چندین بسته را در یک بسته بزرگ تجمیع کند که از MTU بزرگ‌تر باشد\&. علاوه بر این، اگر حداکثر اندازه GRO/GSO بزرگ‌تر از ۶۵۵۳۵ باشد (به .BR ip\-link (8) و به‌ویژه gro_ipv4_max_size و gso_ipv4_max_size مراجعه کنید)، ممکن است \fBip length\fR برای چنین بسته‌های بزرگی (jumbo packets) برابر با ۰ باشد\&. عبارت \fBmeta length\fR به شما امکان می‌دهد طول بسته را شامل اندازه هدر IP تطبیق دهید\&. .SS "عبارت هدر ICMP (ICMP HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBicmp\fR {\fBtype\fR | \fBcode\fR | \fBchecksum\fR | \fBid\fR | \fBsequence\fR | \fBgateway\fR | \fBmtu\fR} .fi .if n \{\ .RE .\} .sp این عبارت به فیلدهای هدر ICMP اشاره دارد\&. هنگام استفاده از آن در خانواده‌های \fBinet\fR، \fBbridge\fR یا \fBnetdev\fR، باعث ایجاد یک وابستگی ضمنی به IPv4 می‌شود\&. برای تطبیق روی موارد غیرمعمول مانند ICMP روی IPv6، باید یک تطبیق صریح \fBmeta protocol ip6\fR به قاعده اضافه شود\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&41.\ \&عبارت هدر ICMP (ICMP header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp type T}:T{ .sp فیلد نوع ICMP T}:T{ .sp icmp_type T} T{ .sp code T}:T{ .sp فیلد کد ICMP T}:T{ .sp integer (8 bit) T} T{ .sp checksum T}:T{ .sp فیلد چک‌سام ICMP T}:T{ .sp integer (16 bit) T} T{ .sp id T}:T{ .sp شناسه درخواست/پاسخ اکو T}:T{ .sp integer (16 bit) T} T{ .sp sequence T}:T{ .sp شماره توالی درخواست/پاسخ اکو T}:T{ .sp integer (16 bit) T} T{ .sp gateway T}:T{ .sp گیت‌وی هدایت‌های مجدد T}:T{ .sp integer (32 bit) T} T{ .sp mtu T}:T{ .sp مقدار MTU در کشف MTU مسیر T}:T{ .sp integer (16 bit) T} .TE .sp 1 .SS "عبارت هدر IGMP (IGMP HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBigmp\fR {\fBtype\fR | \fBmrt\fR | \fBchecksum\fR | \fBgroup\fR} .fi .if n \{\ .RE .\} .sp این عبارت به فیلدهای هدر IGMP اشاره دارد\&. هنگام استفاده از آن در خانواده‌های \fBinet\fR، \fBbridge\fR یا \fBnetdev\fR، باعث ایجاد یک وابستگی ضمنی به IPv4 می‌شود\&. برای تطبیق روی موارد غیرمعمول مانند IGMP روی IPv6، باید یک تطبیق صریح \fBmeta protocol ip6\fR به قاعده اضافه شود\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&42.\ \&عبارت هدر IGMP (IGMP header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp type T}:T{ .sp فیلد نوع IGMP T}:T{ .sp igmp_type T} T{ .sp mrt T}:T{ .sp فیلد حداکثر زمان پاسخ IGMP T}:T{ .sp integer (8 bit) T} T{ .sp checksum T}:T{ .sp فیلد چک‌سام IGMP T}:T{ .sp integer (16 bit) T} T{ .sp group T}:T{ .sp نشانی گروه T}:T{ .sp integer (32 bit) T} .TE .sp 1 .SS "عبارت هدر IPV6 (IPV6 HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBip6\fR {\fBversion\fR | \fBdscp\fR | \fBecn\fR | \fBflowlabel\fR | \fBlength\fR | \fBnexthdr\fR | \fBhoplimit\fR | \fBsaddr\fR | \fBdaddr\fR} .fi .if n \{\ .RE .\} .sp این عبارت به فیلدهای هدر IPv6 اشاره دارد\&. هنگام استفاده از \fBip6 nexthdr\fR احتیاط کنید؛ این مقدار تنها به هدر بعدی اشاره دارد، به این معنی که \fBip6 nexthdr tcp\fR فقط در صورتی مطابقت خواهد داشت که بسته IPv6 فاقد هرگونه هدر افزونه (extension header) باشد\&. بسته‌هایی که قطعه‌قطعه شده‌اند یا برای نمونه شامل هدرهای افزونه مسیریابی هستند، مطابقت داده نخواهند شد\&. اگر می‌خواهید هدر انتقال واقعی را مطابقت دهید و هدرهای افزونه اضافی را نادیده بگیرید، لطفاً به‌جای آن از \fBmeta l4proto\fR استفاده کنید\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&43.\ \&عبارت هدر IPv6 (IPv6 header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp version T}:T{ .sp نسخه هدر IP (۶) T}:T{ .sp integer (4 bit) T} T{ .sp dscp T}:T{ .sp نقطه کد خدمات تفکیک‌شده (Differentiated Services Code Point) T}:T{ .sp dscp T} T{ .sp ecn T}:T{ .sp اعلان صریح ازدحام (Explicit Congestion Notification) T}:T{ .sp ecn T} T{ .sp flowlabel T}:T{ .sp برچسب جریان (Flow label) T}:T{ .sp integer (20 bit) T} T{ .sp length T}:T{ .sp طول بار مفید (Payload length) T}:T{ .sp integer (16 bit) T} T{ .sp nexthdr T}:T{ .sp پروتکل هدر بعدی (Nexthdr protocol) T}:T{ .sp inet_proto T} T{ .sp hoplimit T}:T{ .sp محدودیت پرش (Hop limit) T}:T{ .sp integer (8 bit) T} T{ .sp saddr T}:T{ .sp نشانی مبدا T}:T{ .sp ipv6_addr T} T{ .sp daddr T}:T{ .sp نشانی مقصد T}:T{ .sp ipv6_addr T} .TE .sp 1 .sp هنگام تطبیق روی \fBip6 length\fR مراقب باشید: هسته لینوکس ممکن است چندین بسته را در یک بسته بزرگ تجمیع کند که از MTU بزرگ‌تر باشد\&. علاوه بر این، اگر حداکثر اندازه GRO/GSO بزرگ‌تر از ۶۵۵۳۵ باشد (به .BR ip\-link (8) و به‌ویژه gro_max_size و gso_max_size مراجعه کنید)، ممکن است \fBip6 length\fR برای چنین بسته‌های بزرگی (jumbo packets) برابر با ۰ باشد\&. عبارت \fBmeta length\fR به شما امکان می‌دهد طول بسته را شامل اندازه هدر IPv6 تطبیق دهید\&. .PP \fBاستفاده از عبارت‌های هدر ip6\fR. .sp .if n \{\ .RS 4 .\} .nf # تطبیق در صورتی که اولین هدر افزونه نشان‌دهنده یک قطعه باشد ip6 nexthdr ipv6\-frag .fi .if n \{\ .RE .\} .sp .SS "عبارت هدر ICMPV6 (ICMPV6 HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBicmpv6\fR {\fBtype\fR | \fBcode\fR | \fBchecksum\fR | \fBparameter\-problem\fR | \fBpacket\-too\-big\fR | \fBid\fR | \fBsequence\fR | \fBmax\-delay\fR | \fBtaddr\fR | \fBdaddr\fR} .fi .if n \{\ .RE .\} .sp این عبارت به فیلدهای هدر ICMPv6 اشاره دارد\&. هنگام استفاده از آن در خانواده‌های \fBinet\fR، \fBbridge\fR یا \fBnetdev\fR، باعث ایجاد یک وابستگی ضمنی به IPv6 می‌شود\&. برای تطبیق روی موارد غیرمعمول مانند ICMPv6 روی IPv4، باید یک تطبیق صریح \fBmeta protocol ip\fR به قاعده اضافه شود\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&44.\ \&عبارت هدر ICMPv6 (ICMPv6 header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp type T}:T{ .sp فیلد نوع ICMPv6 T}:T{ .sp icmpv6_type T} T{ .sp code T}:T{ .sp فیلد کد ICMPv6 T}:T{ .sp integer (8 bit) T} T{ .sp checksum T}:T{ .sp فیلد چک‌سام ICMPv6 T}:T{ .sp integer (16 bit) T} T{ .sp parameter\-problem T}:T{ .sp اشاره‌گر به مشکل T}:T{ .sp integer (32 bit) T} T{ .sp packet\-too\-big T}:T{ .sp مقدار MTU فراتر از حد مجاز (oversized MTU) T}:T{ .sp integer (32 bit) T} T{ .sp id T}:T{ .sp شناسه درخواست/پاسخ اکو T}:T{ .sp integer (16 bit) T} T{ .sp sequence T}:T{ .sp شماره توالی درخواست/پاسخ اکو T}:T{ .sp integer (16 bit) T} T{ .sp max\-delay T}:T{ .sp حداکثر تاخیر پاسخ در پرس‌وجوهای MLD T}:T{ .sp integer (16 bit) T} T{ .sp taddr T}:T{ .sp نشانی هدف در درخواست/اعلان همسایه، هدایت مجدد یا MLD T}:T{ .sp ipv6_addr T} T{ .sp daddr T}:T{ .sp نشانی مقصد هدایت مجدد T}:T{ .sp ipv6_addr T} .TE .sp 1 .SS "عبارت هدر TCP (TCP HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBtcp\fR {\fBsport\fR | \fBdport\fR | \fBsequence\fR | \fBackseq\fR | \fBdoff\fR | \fBreserved\fR | \fBflags\fR | \fBwindow\fR | \fBchecksum\fR | \fBurgptr\fR} .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&45.\ \&عبارت هدر TCP (TCP header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp sport T}:T{ .sp پورت مبدا T}:T{ .sp inet_service T} T{ .sp dport T}:T{ .sp پورت مقصد T}:T{ .sp inet_service T} T{ .sp sequence T}:T{ .sp شماره توالی T}:T{ .sp integer (32 bit) T} T{ .sp ackseq T}:T{ .sp شماره تایید دریافت (Acknowledgement number) T}:T{ .sp integer (32 bit) T} T{ .sp doff T}:T{ .sp آفست داده (Data offset) T}:T{ .sp integer (4 bit) FIXME scaling T} T{ .sp reserved T}:T{ .sp ناحیه رزروشده T}:T{ .sp integer (4 bit) T} T{ .sp flags T}:T{ .sp فلگ‌های TCP T}:T{ .sp tcp_flag T} T{ .sp window T}:T{ .sp اندازه پنجره (Window) T}:T{ .sp integer (16 bit) T} T{ .sp checksum T}:T{ .sp چک‌سام T}:T{ .sp integer (16 bit) T} T{ .sp urgptr T}:T{ .sp اشاره‌گر فوری (Urgent pointer) T}:T{ .sp integer (16 bit) T} .TE .sp 1.SS "عبارت هدر UDP (UDP HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBudp\fR {\fBsport\fR | \fBdport\fR | \fBlength\fR | \fBchecksum\fR} .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&46.\ \&عبارت هدر UDP (UDP header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp sport T}:T{ .sp پورت مبدا T}:T{ .sp inet_service T} T{ .sp dport T}:T{ .sp پورت مقصد T}:T{ .sp inet_service T} T{ .sp length T}:T{ .sp طول کل بسته T}:T{ .sp integer (16 bit) T} T{ .sp checksum T}:T{ .sp چک‌سام T}:T{ .sp integer (16 bit) T} .TE .sp 1 .SS "عبارت هدر UDP-LITE (UDP-LITE HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBudplite\fR {\fBsport\fR | \fBdport\fR | \fBchecksum\fR} .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&47.\ \&عبارت هدر UDP\-Lite (UDP\-Lite header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt. T{ .sp sport T}:T{ .sp پورت مبدا T}:T{ .sp inet_service T} T{ .sp dport T}:T{ .sp پورت مقصد T}:T{ .sp inet_service T} T{ .sp checksum T}:T{ .sp چک‌سام T}:T{ .sp integer (16 bit) T} .TE .sp 1 .SS "عبارت هدر SCTP (SCTP HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBsctp\fR {\fBsport\fR | \fBdport\fR | \fBvtag\fR | \fBchecksum\fR} \fBsctp chunk\fR \fICHUNK\fR [ \fIFIELD\fR ] \fICHUNK\fR := \fBdata\fR | \fBinit\fR | \fBinit\-ack\fR | \fBsack\fR | \fBheartbeat\fR | \fBheartbeat\-ack\fR | \fBabort\fR | \fBshutdown\fR | \fBshutdown\-ack\fR | \fBerror\fR | \fBcookie\-echo\fR | \fBcookie\-ack\fR | \fBecne\fR | \fBcwr\fR | \fBshutdown\-complete\fR | \fBasconf\-ack\fR | \fBforward\-tsn\fR | \fBasconf\fR \fIFIELD\fR := \fICOMMON_FIELD\fR | \fIDATA_FIELD\fR | \fIINIT_FIELD\fR | \fIINIT_ACK_FIELD\fR | \fISACK_FIELD\fR | \fISHUTDOWN_FIELD\fR | \fIECNE_FIELD\fR | \fICWR_FIELD\fR | \fIASCONF_ACK_FIELD\fR | \fIFORWARD_TSN_FIELD\fR | \fIASCONF_FIELD\fR \fICOMMON_FIELD\fR := \fBtype\fR | \fBflags\fR | \fBlength\fR \fIDATA_FIELD\fR := \fBtsn\fR | \fBstream\fR | \fBssn\fR | \fBppid\fR \fIINIT_FIELD\fR := \fBinit\-tag\fR | \fBa\-rwnd\fR | \fBnum\-outbound\-streams\fR | \fBnum\-inbound\-streams\fR | \fBinitial\-tsn\fR \fIINIT_ACK_FIELD\fR := \fIINIT_FIELD\fR \fISACK_FIELD\fR := \fBcum\-tsn\-ack\fR | \fBa\-rwnd\fR | \fBnum\-gap\-ack\-blocks\fR | \fBnum\-dup\-tsns\fR \fISHUTDOWN_FIELD\fR := \fBcum\-tsn\-ack\fR \fIECNE_FIELD\fR := \fBlowest\-tsn\fR \fICWR_FIELD\fR := \fBlowest\-tsn\fR \fIASCONF_ACK_FIELD\fR := \fBseqno\fR \fIFORWARD_TSN_FIELD\fR := \fBnew\-cum\-tsn\fR \fIASCONF_FIELD\fR := \fBseqno\fR .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&48.\ \&عبارت هدر SCTP (SCTP header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp sport T}:T{ .sp پورت مبدا T}:T{ .sp inet_service T} T{ .sp dport T}:T{ .sp پورت مقصد T}:T{ .sp inet_service T} T{ .sp vtag T}:T{ .sp تگ اعتبارسنجی (Verification Tag) T}:T{ .sp integer (32 bit) T} T{ .sp checksum T}:T{ .sp چک‌سام T}:T{ .sp integer (32 bit) T} T{ .sp chunk T}:T{ .sp جستجوی chunk در بسته T}:T{ .sp بدون \fIFIELD\fR، مقدار بولی نشان‌دهنده وجود T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&49.\ \&فیلدهای chunk پروتکل SCTP (SCTP chunk fields) .TS allbox tab(:); ltB ltB ltB ltB. T{ نام T}:T{ عرض به بیت T}:T{ Chunk T}:T{ توضیحات T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp type T}:T{ .sp 8 T}:T{ .sp all T}:T{ .sp کاربردی ندارد، توسط نوع chunk تعریف می‌شود T} T{ .sp flags T}:T{ .sp 8 T}:T{ .sp all T}:T{ .sp معناشناسی بر اساس هر chunk تعریف می‌شود T} T{ .sp length T}:T{ .sp 16 T}:T{ .sp all T}:T{ .sp طول این chunk به بایت، بدون احتساب padding T} T{ .sp tsn T}:T{ .sp 32 T}:T{ .sp data T}:T{ .sp شماره توالی انتقال (Transmission Sequence Number) T} T{ .sp stream T}:T{ .sp 16 T}:T{ .sp data T}:T{ .sp شناسه جریان (Stream identifier) T} T{ .sp ssn T}:T{ .sp 16 T}:T{ .sp data T}:T{ .sp شماره توالی جریان (Stream sequence number) T} T{ .sp ppid T}:T{ .sp 32 T}:T{ .sp data T}:T{ .sp شناسه پروتکل بار مفید (Payload protocol identifier) T} T{ .sp init\-tag T}:T{ .sp 32 T}:T{ .sp init, init\-ack T}:T{ .sp تگ آغاز (Initiate tag) T} T{ .sp a\-rwnd T}:T{ .sp 32 T}:T{ .sp init, init\-ack, sack T}:T{ .sp اعتبار پنجره دریافت اعلام‌شده (Advertised receiver window credit) T} T{ .sp num\-outbound\-streams T}:T{ .sp 16 T}:T{ .sp init, init\-ack T}:T{ .sp تعداد جریان‌های خروجی T} T{ .sp num\-inbound\-streams T}:T{ .sp 16 T}:T{ .sp init, init\-ack T}:T{ .sp تعداد جریان‌های ورودی T} T{ .sp initial\-tsn T}:T{ .sp 32 T}:T{ .sp init, init\-ack T}:T{ .sp شماره توالی انتقال اولیه (Initial transmit sequence number) T} T{ .sp cum\-tsn\-ack T}:T{ .sp 32 T}:T{ .sp sack, shutdown T}:T{ .sp شماره توالی انتقال تجمعی تاییدشده (Cumulative TSN acknowledged) T} T{ .sp num\-gap\-ack\-blocks T}:T{ .sp 16 T}:T{ .sp sack T}:T{ .sp تعداد بلوک‌های Gap Ack گنجانده‌شده T} T{ .sp num\-dup\-tsns T}:T{ .sp 16 T}:T{ .sp sack T}:T{ .sp تعداد شماره‌های توالی انتقال تکراری دریافت شده T} T{ .sp lowest\-tsn T}:T{ .sp 32 T}:T{ .sp ecne, cwr T}:T{ .sp پایین‌ترین شماره توالی انتقال T} T{ .sp seqno T}:T{ .sp 32 T}:T{ .sp asconf\-ack, asconf T}:T{ .sp شماره توالی (Sequence number) T} T{ .sp new\-cum\-tsn T}:T{ .sp 32 T}:T{ .sp forward\-tsn T}:T{ .sp شماره توالی انتقال تجمعی جدید T} .TE .sp 1 .SS "عبارت هدر DCCP (DCCP HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBdccp\fR {\fBsport\fR | \fBdport\fR | \fBtype\fR} .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&50.\ \&عبارت هدر DCCP (DCCP header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt. T{ .sp sport T}:T{ .sp پورت مبدا T}:T{ .sp inet_service T} T{ .sp dport T}:T{ .sp پورت مقصد T}:T{ .sp inet_service T} T{ .sp type T}:T{ .sp نوع بسته T}:T{ .sp dccp_pkttype T} .TE .sp 1 .SS "عبارت هدر احراز هویت (AUTHENTICATION HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBah\fR {\fBnexthdr\fR | \fBhdrlength\fR | \fBreserved\fR | \fBspi\fR | \fBsequence\fR} .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&51.\ \&عبارت هدر AH (AH header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp nexthdr T}:T{ .sp پروتکل هدر بعدی T}:T{ .sp inet_proto T} T{ .sp hdrlength T}:T{ .sp طول هدر AH T}:T{ .sp integer (8 bit) T} T{ .sp reserved T}:T{ .sp ناحیه رزروشده T}:T{ .sp integer (16 bit) T} T{ .sp spi T}:T{ .sp شاخص پارامتر امنیتی (Security Parameter Index) T}:T{ .sp integer (32 bit) T} T{ .sp sequence T}:T{ .sp شماره توالی T}:T{ .sp integer (32 bit) T} .TE .sp 1 .SS "عبارت هدر بار مفید امنیتی رمزگذاری‌شده (ENCRYPTED SECURITY PAYLOAD HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBesp\fR {\fBspi\fR | \fBsequence\fR} .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&52.\ \&عبارت هدر ESP (ESP header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt. T{ .sp spi T}:T{ .sp شاخص پارامتر امنیتی (Security Parameter Index) T}:T{ .sp integer (32 bit) T} T{ .sp sequence T}:T{ .sp شماره توالی T}:T{ .sp integer (32 bit) T} .TE .sp 1 .SS "عبارت هدر IPCOMP (IPCOMP HEADER EXPRESSION)" .sp \fBcomp\fR {\fBnexthdr\fR | \fBflags\fR | \fBcpi\fR} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&53.\ \&عبارت هدر IPComp (IPComp header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt. T{ .sp nexthdr T}:T{ .sp پروتکل هدر بعدی T}:T{ .sp inet_proto T} T{ .sp flags T}:T{ .sp فلگ‌ها T}:T{ .sp bitmask T} T{ .sp cpi T}:T{ .sp شاخص پارامتر فشرده‌سازی (compression Parameter Index) T}:T{ .sp integer (16 bit) T} .TE .sp 1 .SS "عبارت هدر GRE (GRE HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBgre\fR {\fBflags\fR | \fBversion\fR | \fBprotocol\fR} \fBgre\fR \fBip\fR {\fBversion\fR | \fBhdrlength\fR | \fBdscp\fR | \fBecn\fR | \fBlength\fR | \fBid\fR | \fBfrag\-off\fR | \fBttl\fR | \fBprotocol\fR | \fBchecksum\fR | \fBsaddr\fR | \fBdaddr\fR } \fBgre\fR \fBip6\fR {\fBversion\fR | \fBdscp\fR | \fBecn\fR | \fBflowlabel\fR | \fBlength\fR | \fBnexthdr\fR | \fBhoplimit\fR | \fBsaddr\fR | \fBdaddr\fR} .fi .if n \{\ .RE .\} .sp عبارت gre برای تطبیق روی فیلدهای هدر gre استفاده می‌شود\&. این عبارت همچنین امکان تطبیق روی بسته IPv4 یا IPv6 درون هدر gre را فراهم می‌کند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&54.\ \&عبارت هدر GRE (GRE header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt. T{ .sp flags T}:T{ .sp فلگ‌های checksum، routing، key، sequence و strict source route T}:T{ .sp integer (5 bit) T} T{ .sp version T}:T{ .sp فیلد نسخه gre؛ مقدار 0 برای GRE و مقدار 1 برای PPTP T}:T{ .sp integer (3 bit) T} T{ .sp protocol T}:T{ .sp نوع EtherType بسته کپسوله‌شده T}:T{ .sp integer (16 bit) T} .TE .sp 1 .PP \fBتطبیق نشانی مقصد IPv4 داخلی کپسوله‌شده در gre\fR. .sp .if n \{\ .RS 4 .\} .nf netdev filter ingress gre ip daddr 9\&.9\&.9\&.9 counter .fi .if n \{\ .RE .\} .sp .SS "عبارت هدر GENEVE (GENEVE HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBgeneve\fR {\fBvni\fR | \fBflags\fR} \fBgeneve\fR \fBether\fR {\fBdaddr\fR | \fBsaddr\fR | \fBtype\fR} \fBgeneve\fR \fBvlan\fR {\fBid\fR | \fBdei\fR | \fBpcp\fR | \fBtype\fR} \fBgeneve\fR \fBip\fR {\fBversion\fR | \fBhdrlength\fR | \fBdscp\fR | \fBecn\fR | \fBlength\fR | \fBid\fR | \fBfrag\-off\fR | \fBttl\fR | \fBprotocol\fR | \fBchecksum\fR | \fBsaddr\fR | \fBdaddr\fR } \fBgeneve\fR \fBip6\fR {\fBversion\fR | \fBdscp\fR | \fBecn\fR | \fBflowlabel\fR | \fBlength\fR | \fBnexthdr\fR | \fBhoplimit\fR | \fBsaddr\fR | \fBdaddr\fR} \fBgeneve\fR \fBtcp\fR {\fBsport\fR | \fBdport\fR | \fBsequence\fR | \fBackseq\fR | \fBdoff\fR | \fBreserved\fR | \fBflags\fR | \fBwindow\fR | \fBchecksum\fR | \fBurgptr\fR} \fBgeneve\fR \fBudp\fR {\fBsport\fR | \fBdport\fR | \fBlength\fR | \fBchecksum\fR} .fi .if n \{\ .RE .\} .sp عبارت geneve برای تطبیق روی فیلدهای هدر geneve استفاده می‌شود\&. هدر geneve یک فریم اترنت را درون یک بسته \fBudp\fR کپسوله می‌کند\&. این عبارت مستلزم آن است که تطبیق را به بسته‌های \fBudp\fR محدود کنید (معمولاً در پورت 6081 طبق پورت‌های اختصاص‌یافته IANA)\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&55.\ \&عبارت هدر GENEVE (GENEVE header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt. T{ .sp protocol T}:T{ .sp نوع EtherType بسته کپسوله‌شده T}:T{ .sp integer (16 bit) T} T{ .sp vni T}:T{ .sp شناسه شبکه مجازی (Virtual Network ID - VNI) T}:T{ .sp integer (24 bit) T} .TE .sp 1 .PP \fBتطبیق پورت مقصد TCP داخلی کپسوله‌شده در geneve\fR. .sp .if n \{\ .RS 4 .\} .nf netdev filter ingress udp dport 4789 geneve tcp dport 80 counter .fi .if n \{\ .RE .\} .sp .SS "عبارت هدر GRETAP (GRETAP HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBgretap\fR {\fBvni\fR | \fBflags\fR} \fBgretap\fR \fBether\fR {\fBdaddr\fR | \fBsaddr\fR | \fBtype\fR} \fBgretap\fR \fBvlan\fR {\fBid\fR | \fBdei\fR | \fBpcp\fR | \fBtype\fR} \fBgretap\fR \fBip\fR {\fBversion\fR | \fBhdrlength\fR | \fBdscp\fR | \fBecn\fR | \fBlength\fR | \fBid\fR | \fBfrag\-off\fR | \fBttl\fR | \fBprotocol\fR | \fBchecksum\fR | \fBsaddr\fR | \fBdaddr\fR } \fBgretap\fR \fBip6\fR {\fBversion\fR | \fBdscp\fR | \fBecn\fR | \fBflowlabel\fR | \fBlength\fR | \fBnexthdr\fR | \fBhoplimit\fR | \fBsaddr\fR | \fBdaddr\fR} \fBgretap\fR \fBtcp\fR {\fBsport\fR | \fBdport\fR | \fBsequence\fR | \fBackseq\fR | \fBdoff\fR | \fBreserved\fR | \fBflags\fR | \fBwindow\fR | \fBchecksum\fR | \fBurgptr\fR} \fBgretap\fR \fBudp\fR {\fBsport\fR | \fBdport\fR | \fBlength\fR | \fBchecksum\fR} .fi .if n \{\ .RE .\} .sp عبارت gretap برای تطبیق روی فریم اترنت کپسوله‌شده درون هدر gre استفاده می‌شود\&. از عبارت \fBgre\fR برای تطبیق روی فیلدهای هدر \fBgre\fR استفاده کنید\&. .PP \fBتطبیق پورت مقصد TCP داخلی کپسوله‌شده در gretap\fR. .sp .if n \{\ .RS 4 .\} .nf netdev filter ingress gretap tcp dport 80 counter .fi .if n \{\ .RE .\} .sp .SS "عبارت هدر VXLAN (VXLAN HEADER EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fBvxlan\fR {\fBvni\fR | \fBflags\fR} \fBvxlan\fR \fBether\fR {\fBdaddr\fR | \fBsaddr\fR | \fBtype\fR} \fBvxlan\fR \fBvlan\fR {\fBid\fR | \fBdei\fR | \fBpcp\fR | \fBtype\fR} \fBvxlan\fR \fBip\fR {\fBversion\fR | \fBhdrlength\fR | \fBdscp\fR | \fBecn\fR | \fBlength\fR | \fBid\fR | \fBfrag\-off\fR | \fBttl\fR | \fBprotocol\fR | \fBchecksum\fR | \fBsaddr\fR | \fBdaddr\fR } \fBvxlan\fR \fBip6\fR {\fBversion\fR | \fBdscp\fR | \fBecn\fR | \fBflowlabel\fR | \fBlength\fR | \fBnexthdr\fR | \fBhoplimit\fR | \fBsaddr\fR | \fBdaddr\fR} \fBvxlan\fR \fBtcp\fR {\fBsport\fR | \fBdport\fR | \fBsequence\fR | \fBackseq\fR | \fBdoff\fR | \fBreserved\fR | \fBflags\fR | \fBwindow\fR | \fBchecksum\fR | \fBurgptr\fR} \fBvxlan\fR \fBudp\fR {\fBsport\fR | \fBdport\fR | \fBlength\fR | \fBchecksum\fR} .fi .if n \{\ .RE .\} .sp عبارت vxlan برای تطبیق روی فیلدهای هدر vxlan استفاده می‌شود\&. هدر vxlan یک فریم اترنت را درون یک بسته \fBudp\fR کپسوله می‌کند\&. این عبارت مستلزم آن است که تطبیق را به بسته‌های \fBudp\fR محدود کنید (معمولاً در پورت 4789 طبق پورت‌های اختصاص‌یافته IANA)\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&56.\ \&عبارت هدر VXLAN (VXLAN header expression) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt. T{ .sp flags T}:T{ .sp فلگ‌های vxlan T}:T{ .sp integer (8 bit) T} T{ .sp vni T}:T{ .sp شناسه شبکه مجازی (Virtual Network ID - VNI) T}:T{ .sp integer (24 bit) T} .TE .sp 1 .PP \fBتطبیق پورت مقصد TCP داخلی کپسوله‌شده در vxlan\fR. .sp .if n \{\ .RS 4 .\} .nf netdev filter ingress udp dport 4789 vxlan tcp dport 80 counter .fi .if n \{\ .RE .\} .sp .SS "عبارت بار مفید خام (RAW PAYLOAD EXPRESSION)" .sp .if n \{\ .RS 4 .\} .nf \fB@\fR\fIbase\fR\fB,\fR\fIoffset\fR\fB,\fR\fIlength\fR .fi .if n \{\ .RE .\} .sp عبارت بار مفید خام (Raw payload) دستور بارگذاری \fIlength\fR بیت با شروع از \fIoffset\fR بیت را می‌دهد\&. بیت 0 به اولین بیت اشاره دارد \(em در زبان برنامه‌نویسی C، این به بالاترین بیت (topmost bit)، یعنی 0x80 در مورد یک هشت‌بایتی اشاره می‌کند\&. این عبارات برای تطبیق هدرهایی که هنوز عبارت الگوی خوانا برای انسان ندارند مفید هستند\&. توجه داشته باشید که nft وابستگی‌هایی را برای عبارت‌های بار مفید خام اضافه نمی‌کند\&. اگر به عنوان مثال بخواهید فیلدهای پروتکل یک هدر انتقال با شماره پروتکل 5 را مطابقت دهید، باید بسته‌هایی را که هدر انتقال متفاوتی دارند به صورت دستی مستثنی کنید، برای مثال با استفاده از \fBmeta l4proto 5\fR قبل از عبارت خام\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&57.\ \&پایه‌های پروتکل بار مفید پشتیبانی‌شده (Supported payload protocol bases) .TS allbox tab(:); ltB ltB. T{ پایه (Base) T}:T{ توضیحات T} .T& lt lt lt lt lt lt lt lt. T{ .sp ll T}:T{ .sp لایه پیوند (Link layer)، برای مثال هدر اترنت T} T{ .sp nh T}:T{ .sp هدر شبکه (Network header)، برای مثال IPv4 یا IPv6 T} T{ .sp th T}:T{ .sp هدر انتقال (Transport Header)، برای مثال TCP T} T{ .sp ih T}:T{ .sp هدر داخلی / بار مفید (Inner Header / Payload)، یعنی بعد از هدر سطح انتقال L4 T} .TE .sp 1 .PP \fBتطبیق پورت مقصد هم برای UDP و هم TCP\fR. .sp .if n \{\ .RS 4 .\} .nf inet filter input meta l4proto {tcp, udp} @th,16,16 { 53, 80 } .fi .if n \{\ .RE .\} .sp عبارت بالا را می‌توان به این صورت نیز نوشت .sp .if n \{\ .RS 4 .\} .nf inet filter input meta l4proto {tcp, udp} th dport { 53, 80 } .fi .if n \{\ .RE .\} .sp این روش راحت‌تر است، اما مانند نشانه‌گذاری عبارت خام، هیچ وابستگی ایجاد یا بررسی نمی‌شود\&. این مسئولیت کاربر است که تطبیق را به آن دسته از انواع هدر که مفهوم پورت دارند محدود کند\&. در غیر این صورت، قواعدی که از عبارت‌های خام استفاده می‌کنند به اشتباه با بسته‌های نامربوط تطبیق داده می‌شوند؛ به عنوان مثال فیلد SPI بسته‌های ESP را به اشتباه به عنوان یک پورت تفسیر می‌کنند\&. .PP \fBبازنویسی نشانی سخت‌افزاری هدف بسته arp در صورتی که نشانی پروتکل هدف با یک نشانی داده‌شده مطابقت داشته باشد\fR. .sp .if n \{\ .RS 4 .\} .nf 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 .fi .if n \{\ .RE .\} .sp .SS "عبارت‌های هدر افزونه (EXTENSION HEADER EXPRESSIONS)" .sp عبارت‌های هدر افزونه به داده‌های موجود در هدرهای پروتکل با اندازه متغیر، مانند هدرهای افزونه IPv6، گزینه‌های TCP و گزینه‌های IPv4 اشاره دارند\&. .sp در حال حاضر nftables از تطبیق (یافتن) یک هدر افزونه مشخص در IPv6، گزینه TCP یا گزینه IPv4 پشتیبانی می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf \fBhbh\fR {\fBnexthdr\fR | \fBhdrlength\fR} \fBfrag\fR {\fBnexthdr\fR | \fBfrag\-off\fR | \fBmore\-fragments\fR | \fBid\fR} \fBrt\fR {\fBnexthdr\fR | \fBhdrlength\fR | \fBtype\fR | \fBseg\-left\fR} \fBdst\fR {\fBnexthdr\fR | \fBhdrlength\fR} \fBmh\fR {\fBnexthdr\fR | \fBhdrlength\fR | \fBchecksum\fR | \fBtype\fR} \fBsrh\fR {\fBflags\fR | \fBtag\fR | \fBsid\fR | \fBseg\-left\fR} \fBtcp option\fR {\fBeol\fR | \fBnop\fR | \fBmaxseg\fR | \fBwindow\fR | \fBsack\-perm\fR | \fBsack\fR | \fBsack0\fR | \fBsack1\fR | \fBsack2\fR | \fBsack3\fR | \fBtimestamp\fR | \fBmptcp\fR } \fItcp_option_field\fR \fBip option\fR { lsrr | ra | rr | ssrr } \fIip_option_field\fR .fi .if n \{\ .RE .\} .sp نحوهای زیر فقط در یک عبارت رابطه‌ای با نوع بولی در سمت راست، تنها برای بررسی وجود هدر معتبر هستند: .sp .if n \{\ .RS 4 .\} .nf \fBexthdr\fR {\fBhbh\fR | \fBfrag\fR | \fBrt\fR | \fBdst\fR | \fBmh\fR} \fBtcp option\fR {\fBeol\fR | \fBnop\fR | \fBmaxseg\fR | \fBwindow\fR | \fBsack\-perm\fR | \fBsack\fR | \fBsack0\fR | \fBsack1\fR | \fBsack2\fR | \fBsack3\fR | \fBtimestamp\fR | \fBmptcp\fR } \fBip option\fR { lsrr | ra | rr | ssrr } \fBdccp option\fR \fIdccp_option_type\fR .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&58.\ \&هدرهای افزونه IPv6 (IPv6 extension headers) .TS allbox tab(:); ltB ltB. T{ کلیدواژه T}:T{ توضیحات T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp hbh T}:T{ .sp گام‌به‌گام (Hop by Hop) T} T{ .sp rt T}:T{ .sp هدر مسیریابی (Routing Header) T} T{ .sp frag T}:T{ .sp هدر قطعه‌بندی (Fragmentation header) T} T{ .sp dst T}:T{ .sp گزینه‌های مقصد (dst options) T} T{ .sp mh T}:T{ .sp هدر تحرک/پویایی (Mobility Header) T} T{ .sp srh T}:T{ .sp هدر مسیریابی قطعه (Segment Routing Header) T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&59.\ \&گزینه‌های TCP (TCP Options) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ فیلدهای گزینه TCP T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp eol T}:T{ .sp پایان لیست گزینه‌ها (End of option list) T}:T{ .sp \- T} T{ .sp nop T}:T{ .sp گزینه لایه‌گذاری ۱ بایتی TCP Nop T}:T{ .sp \- T} T{ .sp maxseg T}:T{ .sp حداکثر اندازه سگمنت TCP (TCP Maximum Segment Size) T}:T{ .sp length, size T} T{ .sp window T}:T{ .sp مقیاس‌بندی پنجره TCP (TCP Window Scaling) T}:T{ .sp length, count T} T{ .sp sack\-perm T}:T{ .sp مجوز تأیید دریافت انتخابی TCP (TCP SACK permitted) T}:T{ .sp length T} T{ .sp sack T}:T{ .sp تأیید دریافت انتخابی TCP (نام مستعار بلوک ۰) T}:T{ .sp length, left, right T} T{ .sp sack0 T}:T{ .sp تأیید دریافت انتخابی TCP (بلوک ۰) T}:T{ .sp length, left, right T} T{ .sp sack1 T}:T{ .sp تأیید دریافت انتخابی TCP (بلوک ۱) T}:T{ .sp length, left, right T} T{ .sp sack2 T}:T{ .sp تأیید دریافت انتخابی TCP (بلوک ۲) T}:T{ .sp length, left, right T} T{ .sp sack3 T}:T{ .sp تأیید دریافت انتخابی TCP (بلوک ۳) T}:T{ .sp length, left, right T} T{ .sp timestamp T}:T{ .sp برچسب‌های زمانی TCP (TCP Timestamps) T}:T{ .sp length, tsval, tsecr T} T{ .sp mptcp T}:T{ .sp پروتکل TCP چندمسیری (Multipath TCP) T}:T{ .sp subtype T} .TE .sp 1 .sp انواع داده را می‌توان با دستور \fInft describe tcp option \fR\fI\fBkeyword\fR\fR\fI [ \fR\fI\fBfieldname\fR\fR\fI ]\fR پرس‌وجو کرد\&. .sp تطبیق گزینه TCP همچنین از نحو عبارت خام برای دسترسی به گزینه‌های اختیاری و دلخواه پشتیبانی می‌کند: .sp .if n \{\ .RS 4 .\} .nf \fBtcp option\fR .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf \fBtcp option\fR \fB@\fR\fInumber\fR\fB,\fR\fIoffset\fR\fB,\fR\fIlength\fR .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&60.\ \&گزینه‌های IP (IP Options) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ فیلدهای گزینه IP T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp lsrr T}:T{ .sp مسیریابی مبدا آزاد (Loose Source Route) T}:T{ .sp length, ptr, addr T} T{ .sp ra T}:T{ .sp هشدار مسیریاب (Router Alert) T}:T{ .sp length, value T} T{ .sp rr T}:T{ .sp ثبت مسیر (Record Route) T}:T{ .sp length, ptr, addr T} T{ .sp ssrr T}:T{ .sp مسیریابی مبدا دقیق (Strict Source Route) T}:T{ .sp length, ptr, addr T} .TE .sp 1 .PP \fBیافتن گزینه‌های TCP (finding TCP options)\fR. .sp .if n \{\ .RS 4 .\} .nf filter input tcp option sack\-perm exists counter .fi .if n \{\ .RE .\} .PP \fBتطبیق گزینه‌های TCP (matching TCP options)\fR. .sp .if n \{\ .RS 4 .\} .nf filter input tcp option maxseg size lt 536 .fi .if n \{\ .RE .\} .PP \fBتطبیق هدرهای افزونه IPv6 (matching IPv6 exthdr)\fR. .sp .if n \{\ .RS 4 .\} .nf ip6 filter input frag more\-fragments 1 counter .fi .if n \{\ .RE .\} .PP \fBیافتن گزینه IP (finding IP option)\fR. .sp .if n \{\ .RS 4 .\} .nf filter input ip option lsrr exists counter .fi .if n \{\ .RE .\} .PP \fBیافتن گزینه DCCP (finding DCCP option)\fR. .sp .if n \{\ .RS 4 .\} .nf filter input dccp option 40 exists counter .fi .if n \{\ .RE .\} .sp .SS "عبارت‌های ردگیری اتصال (CONNTRACK EXPRESSIONS)" .sp عبارت‌های ردگیری اتصال به متاداده‌های مدخل ردگیری اتصال مرتبط با یک بسته اشاره دارند\&. .sp سه نوع عبارت ردگیری اتصال (conntrack) وجود دارد\&. برخی از عبارت‌های conntrack نیازمند مشخص کردن جهت جریان پیش از کلید conntrack هستند، در حالی که برخی دیگر باید مستقیماً استفاده شوند زیرا مستقل از جهت می‌باشند\&. کلیدواژه‌های \fBpackets\fR، \fBbytes\fR و \fBavgpkt\fR می‌توانند با جهت یا بدون جهت استفاده شوند\&. اگر جهت درج نشود، مجموع جهت‌های اصلی (original) و پاسخ (reply) بازگردانده می‌شود\&. همین موضوع در مورد \fBzone\fR نیز صدق می‌کند؛ اگر جهت مشخص شده باشد، zone تنها در صورتی تطبیق داده می‌شود که شناسه zone به جهت مشخص‌شده وابسته باشد\&. .sp .if n \{\ .RS 4 .\} .nf \fBct\fR {\fBstate\fR | \fBdirection\fR | \fBstatus\fR | \fBmark\fR | \fBexpiration\fR | \fBhelper\fR | \fBlabel\fR | \fBcount\fR | \fBid\fR} \fBct\fR [\fBoriginal\fR | \fBreply\fR] {\fBl3proto\fR | \fBprotocol\fR | \fBbytes\fR | \fBpackets\fR | \fBavgpkt\fR | \fBzone\fR} \fBct\fR {\fBoriginal\fR | \fBreply\fR} {\fBproto\-src\fR | \fBproto\-dst\fR} \fBct\fR {\fBoriginal\fR | \fBreply\fR} {\fBip\fR | \fBip6\fR} {\fBsaddr\fR | \fBdaddr\fR} .fi .if n \{\ .RE .\} .sp انواع اختصاصی conntrack در این جدول، در زیربخش CONNTRACK TYPES در بالا توضیح داده شده‌اند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&61.\ \&عبارت‌های ردگیری اتصال (Conntrack expressions) .TS allbox tab(:); ltB ltB ltB. T{ کلیدواژه T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp state T}:T{ .sp وضعیت اتصال T}:T{ .sp ct_state T} T{ .sp direction T}:T{ .sp جهت بسته نسبت به اتصال T}:T{ .sp ct_dir T} T{ .sp status T}:T{ .sp وضعیت اتصال T}:T{ .sp ct_status T} T{ .sp mark T}:T{ .sp علامت (mark) اتصال T}:T{ .sp mark T} T{ .sp expiration T}:T{ .sp زمان انقضای اتصال T}:T{ .sp time T} T{ .sp helper T}:T{ .sp برنامه کمکی (Helper) مرتبط با اتصال T}:T{ .sp string T} T{ .sp label T}:T{ .sp بیت برچسب ردگیری اتصال یا نام نمادین تعریف‌شده در connlabel\&.conf در مسیر include مربوط به nftables T}:T{ .sp ct_label T} T{ .sp l3proto T}:T{ .sp پروتکل لایه ۳ اتصال T}:T{ .sp nf_proto T} T{ .sp saddr T}:T{ .sp نشانی مبدا اتصال برای جهت مشخص‌شده T}:T{ .sp ipv4_addr/ipv6_addr T} T{ .sp daddr T}:T{ .sp نشانی مقصد اتصال برای جهت مشخص‌شده T}:T{ .sp ipv4_addr/ipv6_addr T} T{ .sp protocol T}:T{ .sp پروتکل لایه ۴ اتصال برای جهت مشخص‌شده T}:T{ .sp inet_proto T} T{ .sp proto\-src T}:T{ .sp مبدا پروتکل لایه ۴ برای جهت مشخص‌شده T}:T{ .sp integer (16 bit) T} T{ .sp proto\-dst T}:T{ .sp مقصد پروتکل لایه ۴ برای جهت مشخص‌شده T}:T{ .sp integer (16 bit) T} T{ .sp packets T}:T{ .sp تعداد بسته‌های دیده‌شده در جهت مشخص‌شده یا مجموع اصلی و پاسخ T}:T{ .sp integer (64 bit) T} T{ .sp bytes T}:T{ .sp تعداد بایت‌های دیده‌شده؛ توضیحات کلیدواژه \fBpackets\fR را ببینید T}:T{ .sp integer (64 bit) T} T{ .sp avgpkt T}:T{ .sp میانگین بایت در هر بسته؛ توضیحات کلیدواژه \fBpackets\fR را ببینید T}:T{ .sp integer (64 bit) T} T{ .sp zone T}:T{ .sp ناحیه ردگیری اتصال (conntrack zone) T}:T{ .sp integer (16 bit) T} T{ .sp count T}:T{ .sp تعداد اتصالات فعلی T}:T{ .sp integer (32 bit) T} T{ .sp id T}:T{ .sp شناسه اتصال T}:T{ .sp ct_id T} .TE .sp 1 .PP \fBمحدود کردن تعداد اتصالات موازی به یک سرور (restrict the number of parallel connections to a server)\fR. .sp .if n \{\ .RS 4 .\} .nf nft add set filter ssh_flood \*(Aq{ type ipv4_addr; flags dynamic; }\*(Aq nft add rule filter input ct state new tcp dport 22 add @ssh_flood \*(Aq{ ip saddr ct count over 2 }\*(Aq reject .fi .if n \{\ .RE .\} .sp .SH "دستورها و گزاره‌ها (STATEMENTS)" .sp گزاره‌ها نشان‌دهنده اقداماتی هستند که باید انجام شوند\&. آن‌ها می‌توانند جریان کنترل را تغییر دهند (بازگشت، پرش به زنجیره‌ای دیگر، پذیرش یا دور انداختن بسته) یا می‌توانند اقداماتی مانند ثبت گزارش وقایع، رد کردن بسته و غیره را انجام دهند\&. .sp گزاره‌ها به دو نوع وجود دارند\&. گزاره‌های پایانی ارزیابی قانون فعلی را بدون قید و شرط پایان می‌دهند، در حالی که گزاره‌های غیرپایانی یا صرفاً به‌صورت شرطی و یا هرگز ارزیابی قانون فعلی را پایان نمی‌دهند؛ به عبارت دیگر، از دیدگاه ارزیابی قوانین، آن‌ها منفعل هستند\&. در یک قانون می‌تواند تعداد دلخواهی گزاره غیرپایانی وجود داشته باشد، اما تنها یک گزاره پایانی منفرد به عنوان آخرین گزاره مجاز است\&. .SS "گزاره‌های حکم (VERDICT STATEMENTS)" .sp گزاره‌های حکم، جریان کنترل را در مجموعه قوانین تغییر داده و تصمیمات خط‌مشی را برای بسته‌ها صادر می‌کنند\&. .sp .if n \{\ .RS 4 .\} .nf {\fBaccept\fR | \fBdrop\fR | \fBcontinue\fR | \fBreturn\fR} {\fBjump\fR | \fBgoto\fR} \fICHAIN\fR \fICHAIN\fR := \fIchain_name\fR | \fB{\fR \fIstatement\fR \&... \fB}\fR .fi .if n \{\ .RE .\} .sp حکم‌های \fBaccept\fR و \fBdrop\fR احکام مطلق هستند \(em آن‌ها ارزیابی زنجیره را متوقف می‌کنند، گویی بسته با همان تصمیم خط‌مشی معادل به انتهای زنجیره پایه رسیده است\&. برای جزئیات بیشتر به بخش \(lqارزیابی کلی مجموعه قوانین (OVERALL EVALUATION OF THE RULESET)\(rq مراجعه کنید\&. .TS tab(:); lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp \fBaccept\fR T}:T{ .sp پایان زودهنگام ارزیابی\&. ارزیابی در زنجیره پایه بعدی با اولویت بالاتر یا احتمالاً برابر از همان قلاب (hook) یا در اولین زنجیره پایه یک قلاب بعدی (در صورت وجود) ادامه می‌یابد\&. این بدان معناست که بسته همچنان می‌تواند در زنجیره پایه دیگری و همچنین در هر زنجیره فراخوانی‌شده از آن دور انداخته شود\&. به عنوان مثال، یک حکم \fBaccept\fR در یک زنجیره از قلاب \fBforward\fR همچنان به شما امکان می‌دهد بسته را در یک زنجیره پایه دیگر از قلاب \fBforward\fR (یا زنجیره‌ای که از آن فراخوانی شده) با شماره اولویت بالاتر یا در زنجیره‌ای متصل به قلاب \fBpostrouting\fR دور بیندازید (\fBdrop\fR کنید)\&. T} T{ .sp \fBdrop\fR T}:T{ .sp بسته را بلافاصله دور انداخته و ارزیابی مجموعه قوانین را خاتمه می‌دهد\&. هیچ ارزیابی دیگری صورت نمی‌گیرد\&. لغو یا بازنویسی حکم \fBdrop\fR امکان‌پذیر نیست\&. T} T{ .sp \fBjump\fR \fICHAIN\fR T}:T{ .sp موقعیت فعلی را در پشته فراخوانی (call stack) زنجیره‌ها ذخیره کرده و ارزیابی را در اولین قانون \fICHAIN\fR ادامه می‌دهد\&. هنگامی که به انتهای \fICHAIN\fR برسد، یک حکم ضمنی \fBreturn\fR صادر می‌شود\&. هرگاه یک حکم مطلق در \fICHAIN\fR صادر شود (یا به صورت ضمنی توسط یک گزاره شبه‌حکم اعمال گردد)، ارزیابی همان‌طور که در بالا توضیح داده شد خاتمه می‌یابد\&. T} T{ .sp \fBgoto\fR \fICHAIN\fR T}:T{ .sp مشابه \fBjump\fR است، با این تفاوت که موقعیت فعلی در پشته فراخوانی زنجیره‌ها ذخیره نمی‌شود\&. T} T{ .sp \fBreturn\fR T}:T{ .sp ارزیابی زنجیره فعلی را پایان داده، آخرین موقعیت اضافه‌شده را از پشته فراخوانی زنجیره‌ها برمی‌دارد (pop می‌کند) و ارزیابی را پس از آن موقعیت ادامه می‌دهد\&. هنگامی که موقعیتی در پشته برای برداشتن وجود نداشته باشد (حالتی که زنجیره فعلی یا زنجیره پایه باشد یا یک زنجیره معمولی که صرفاً از طریق حکم‌های \fBgoto\fR به آن رسیده باشند)، ارزیابی زنجیره پایه فعلی (و هر زنجیره معمولی فراخوانی‌شده از آن) را با استفاده از خط‌مشی زنجیره پایه به عنوان حکم ضمنی خاتمه می‌دهد\&. T} T{ .sp \fBcontinue\fR T}:T{ .sp ارزیابی را با قانون بعدی ادامه می‌دهد\&. این رفتار پیش‌فرض در حالتی است که قانونی هیچ حکمی صادر نکند\&. T} .TE .sp 1 .sp یک جایگزین برای مشخص کردن نام یک زنجیره معمولی و موجود در \fICHAIN\fR، تعیین یک زنجیره ناشناس (anonymous chain) به صورت موردی (ad\-hoc) است\&. همانند مجموعه‌های ناشناس، نمی‌توان از قانون دیگری به آن ارجاع داد و همراه با قانونی که شامل آن است حذف خواهد شد\&. .sp تمام موارد فوق به طور مشابه برای گزاره‌هایی که متضمن یک حکم هستند نیز صدق می‌کند: گزاره‌های \fBredirect\fR، \fBdnat\fR، \fBsnat\fR و \fBmasquerade\fR در پایان اقدامات مربوط به خود، در داخل یک حکم \fBaccept\fR صادر می‌کنند\&. گزاره‌های \fBreject\fR و \fBsynproxy\fR در پایان اقدامات مربوط به خود، در داخل یک حکم \fBdrop\fR صادر می‌کنند\&. بنابراین این گزاره‌ها مانند حکم‌های ضمنی خود عمل می‌کنند، اما با اثرات جانبی (side effects)\&. .PP \fBاستفاده از گزاره‌های حکم:\fR .sp .if n \{\ .RS 4 .\} .nf # 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; } .fi .if n \{\ .RE .\} .sp .SS "گزاره بار مفید (PAYLOAD STATEMENT)" .sp .if n \{\ .RS 4 .\} .nf \fIpayload_expression\fR \fBset\fR \fIvalue\fR .fi .if n \{\ .RE .\} .sp گزاره بار مفید محتوای بسته را تغییر می‌دهد\&. به عنوان مثال می‌توان از آن برای تنظیم فیلد سرآیند DSCP (diffserv) در ip یا برچسب‌های جریان (flow labels) در ipv6 استفاده کرد\&. .PP \fBمسیریابی برخی بسته‌ها به جای پل زدن:\fR .sp .if n \{\ .RS 4 .\} .nf # 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 .fi .if n \{\ .RE .\} .PP \fBتنظیم فیلد سرآیند DSCP در IPv4:\fR .sp .if n \{\ .RS 4 .\} .nf ip forward ip dscp set 42 .fi .if n \{\ .RE .\} .sp .SS "گزاره هدر افزونه (EXTENSION HEADER STATEMENT)" .sp .if n \{\ .RS 4 .\} .nf \fIextension_header_expression\fR \fBset\fR \fIvalue\fR .fi .if n \{\ .RE .\} .sp گزاره سرآیند افزونه، محتوای بسته را در سرآیندهای با اندازه متغیر تغییر می‌دهد\&. در حال حاضر می‌توان از این گزاره برای تغییر حداکثر اندازه قطعه (TCP Maximum Segment Size یا TCP MSS) در بسته‌ها، مشابه هدف TCPMSS در iptables استفاده کرد\&. .PP \fBتغییر TCP MSS:\fR .sp .if n \{\ .RS 4 .\} .nf 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 .fi .if n \{\ .RE .\} .sp همچنین می‌توانید گزینه‌های tcp را از طریق کلمه کلیدی reset حذف کنید\&. .PP \fBحذف گزینه tcp:\fR .sp .if n \{\ .RS 4 .\} .nf tcp flags syn reset tcp option sack\-perm .fi .if n \{\ .RE .\} .sp .SS "گزاره گزارش وقایع (LOG STATEMENT)" .sp .if n \{\ .RS 4 .\} .nf \fBlog\fR [\fBprefix\fR \fIquoted_string\fR] [\fBlevel\fR \fIsyslog\-level\fR] [\fBflags\fR \fIlog\-flags\fR] \fBlog\fR \fBgroup\fR \fInflog_group\fR [\fBprefix\fR \fIquoted_string\fR] [\fBqueue\-threshold\fR \fIvalue\fR] [\fBsnaplen\fR \fIsize\fR] \fBlog level audit\fR .fi .if n \{\ .RE .\} .sp گزاره log ثبت گزارش وقایع بسته‌های منطبق را فعال می‌کند\&. هنگامی که از این گزاره در یک قانون استفاده می‌شود، هسته لینوکس برخی از اطلاعات تمام بسته‌های منطبق (مانند فیلدهای سرآیند) را از طریق گزارش هسته (که می‌توان آن را با dmesg(1) یا در syslog خواند) چاپ می‌کند\&. .sp در شکل دوم فراخوانی (اگر \fInflog_group\fR مشخص شده باشد)، هسته لینوکس بسته را به nfnetlink_log منتقل می‌کند که گزارش را از طریق یک سوکت netlink به گروه مشخص‌شده ارسال می‌نماید\&. یک فرایند فضای کاربری می‌تواند در این گروه عضو شود تا گزارش‌ها را دریافت کند؛ برای دیمون ثبت گزارش فضای کاربری Netfilter به راهنمای ulogd(8) و در صورتی که مایل به توسعه یک برنامه سفارشی جهت پردازش گزارش‌های خود هستید، برای جزئیات به مستندات libnetfilter_log مراجعه کنید\&. .sp در شکل سوم فراخوانی (اگر level audit مشخص شده باشد)، هسته لینوکس پیامی را با قالب مناسب برای خواندن با auditd در بافر audit می‌نویسد\&. بنابراین هیچ گزینه قالب‌بندی دیگری (مانند prefix یا flags) در این حالت مجاز نیست\&. .sp این یک گزاره غیرپایانی است، بنابراین ارزیابی قانون پس از ثبت گزارش بسته ادامه می‌یابد\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&62.\ \&گزینه‌های گزاره log (log statement options) .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp prefix T}:T{ .sp پیشوند پیام گزارش T}:T{ .sp رشته نقل‌قول‌شده (quoted string) T} T{ .sp level T}:T{ .sp سطح گزارش‌گیری در Syslog T}:T{ .sp رشته: emerg, alert, crit, err, warn [پیش‌فرض], notice, info, debug, audit T} T{ .sp group T}:T{ .sp گروه NFLOG برای ارسال پیام‌ها به آن T}:T{ .sp عدد صحیح بدون علامت (۱۶ بیتی) T} T{ .sp snaplen T}:T{ .sp طول بار داده بسته برای گنجاندن در پیام netlink T}:T{ .sp عدد صحیح بدون علامت (۳۲ بیتی) T} T{ .sp queue\-threshold T}:T{ .sp تعداد بسته‌ها برای صف‌بندی در هسته پیش از ارسال آن‌ها به فضای کاربری T}:T{ .sp عدد صحیح بدون علامت (۳۲ بیتی) T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&63.\ \&فلگ‌های لاگ (log\-flags) .TS allbox tab(:); ltB ltB. T{ فلگ T}:T{ توضیحات T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp tcp sequence T}:T{ .sp ثبت گزارش شماره‌های توالی TCP\&. T} T{ .sp tcp options T}:T{ .sp ثبت گزارش گزینه‌ها از سرآیند بسته TCP\&. T} T{ .sp ip options T}:T{ .sp ثبت گزارش گزینه‌ها از سرآیند بسته IP/IPv6\&. T} T{ .sp skuid T}:T{ .sp ثبت گزارش شناسه کاربر (userid) فرایندی که بسته را تولید کرده است\&. T} T{ .sp ether T}:T{ .sp رمزگشایی نشانی‌های MAC و پروتکل\&. T} T{ .sp all T}:T{ .sp فعال‌سازی تمام فلگ‌های گزارش فهرست‌شده در بالا\&. T} .TE .sp 1 .PP \fBاستفاده از گزاره log:\fR .sp .if n \{\ .RS 4 .\} .nf # 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 .fi .if n \{\ .RE .\} .sp .SS "گزاره رد بسته (REJECT STATEMENT)" .sp .if n \{\ .RS 4 .\} .nf \fBreject\fR [ \fBwith\fR \fIREJECT_WITH\fR ] \fIREJECT_WITH\fR := \fBicmp\fR \fIicmp_reject_code\fR | \fBicmpv6\fR \fIicmpv6_reject_code\fR | \fBicmpx\fR \fIicmpx_reject_code\fR | \fBtcp reset\fR .fi .if n \{\ .RE .\} .sp یک گزاره reject تلاش می‌کند در پاسخ به بسته منطبق‌شده یک بسته خطا ارسال کند و سپس در داخل یک حکم \fBdrop\fR صادر می‌نماید\&. بنابراین این یک گزاره پایانی با تمام پیامدهای مربوط به آن است (به بخش‌های \(lqارزیابی کلی مجموعه قوانین (OVERALL EVALUATION OF THE RULESET)\(rq و \(lqگزاره‌های حکم (VERDICT STATEMENTS)\(rq مراجعه کنید)\&. این گزاره فقط در زنجیره‌های پایه‌ای که از قلاب‌های \fBprerouting\fR، \fBinput\fR، \fBforward\fR یا \fBoutput\fR استفاده می‌کنند، و زنجیره‌های معمولی که صرفاً از آن زنجیره‌ها فراخوانی می‌شوند، معتبر است\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&64.\ \&کلمات کلیدی قابل استفاده برای رد بسته هنگام تعیین کد ICMP (Keywords may be used to reject when specifying the ICMP code) .TS allbox tab(:); ltB ltB. T{ کلمه کلیدی T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp net\-unreachable T}:T{ .sp 0 T} T{ .sp host\-unreachable T}:T{ .sp 1 T} T{ .sp prot\-unreachable T}:T{ .sp 2 T} T{ .sp port\-unreachable T}:T{ .sp 3 T} T{ .sp frag\-needed T}:T{ .sp 4 T} T{ .sp net\-prohibited T}:T{ .sp 9 T} T{ .sp host\-prohibited T}:T{ .sp 10 T} T{ .sp admin\-prohibited T}:T{ .sp 13 T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&65.\ \&کلمات کلیدی قابل استفاده برای رد بسته هنگام تعیین کد ICMPv6 (keywords may be used to reject when specifying the ICMPv6 code) .TS allbox tab(:); ltB ltB. T{ کلمه کلیدی T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp no\-route T}:T{ .sp 0 T} T{ .sp admin\-prohibited T}:T{ .sp 1 T} T{ .sp addr\-unreachable T}:T{ .sp 3 T} T{ .sp port\-unreachable T}:T{ .sp 4 T} T{ .sp policy\-fail T}:T{ .sp 5 T} T{ .sp reject\-route T}:T{ .sp 6 T} .TE .sp 1 .sp انتزاع نوع کد ICMPvX مجموعه‌ای از مقادیر است که بین انواع کدهای ICMP و ICMPv6 هم‌پوشانی دارند تا از خانواده inet مورد استفاده قرار گیرند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&66.\ \&کلمات کلیدی قابل استفاده هنگام تعیین کد ICMPvX (keywords may be used when specifying the ICMPvX code) .TS allbox tab(:); ltB ltB. T{ کلمه کلیدی T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt. T{ .sp no\-route T}:T{ .sp 0 T} T{ .sp port\-unreachable T}:T{ .sp 1 T} T{ .sp host\-unreachable T}:T{ .sp 2 T} T{ .sp admin\-prohibited T}:T{ .sp 3 T} .TE .sp 1 .sp کد پیش‌فرض و متداول ICMP برای رد کردن، \fBport\-unreachable\fR است\&. .sp توجه داشته باشید که در خانواده bridge، گزاره reject فقط در زنجیره‌های پایه‌ای مجاز است که به قلاب‌های input یا prerouting متصل شده باشند\&. .SS "گزاره شمارنده (COUNTER STATEMENT)" .sp گزاره شمارنده تعداد دفعات تطبیق بسته‌ها را به همراه تعداد بایت‌ها تنظیم می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf \fBcounter\fR \fBpackets\fR \fInumber\fR \fBbytes\fR \fInumber\fR \fBcounter\fR { \fBpackets\fR \fInumber\fR | \fBbytes\fR \fInumber\fR } .fi .if n \{\ .RE .\} .SS "گزاره ردگیری اتصال (CONNTRACK STATEMENT)" .sp از گزاره conntrack می‌توان برای تنظیم نشان ردگیری اتصال (conntrack mark) و برچسب‌های ردگیری اتصال (conntrack labels) استفاده کرد\&. .sp .if n \{\ .RS 4 .\} .nf \fBct\fR {\fBmark\fR | \fBevent\fR | \fBlabel\fR | \fBzone\fR} \fBset\fR \fIvalue\fR .fi .if n \{\ .RE .\} .sp گزاره ct متاداده‌های مرتبط با یک اتصال را تنظیم می‌کند\&. شناسه ناحیه (zone id) باید پیش از انجام جستجوی ردگیری اتصال اختصاص داده شود، یعنی این کار باید در prerouting و احتمالاً output (اگر بسته‌های تولیدشده به صورت محلی باید در ناحیه مجزایی قرار گیرند) با اولویت قلاب \fBraw\fR (\-300) انجام شود\&. .sp برخلاف iptables که در آن انتساب کمکی (helper) در جدول raw انجام می‌شود، در اینجا helper باید پس از پیدا شدن یک مدخل conntrack منتسب شود؛ به این معنی که با اولویت‌های قلاب مساوی یا قبل از \-200 کار نخواهد کرد\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&67.\ \&انواع گزاره‌های Conntrack (Conntrack statement types) .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp event T}:T{ .sp بیت‌های رویداد conntrack T}:T{ .sp ماسک بیتی، عدد صحیح (۳۲ بیتی) T} T{ .sp helper T}:T{ .sp نام شیء کمکی ct جهت انتساب به اتصال T}:T{ .sp رشته نقل‌قول‌شده (quoted string) T} T{ .sp mark T}:T{ .sp نشان ردگیری اتصال (Connection tracking mark) T}:T{ .sp mark T} T{ .sp label T}:T{ .sp برچسب ردگیری اتصال (Connection tracking label) T}:T{ .sp label T} T{ .sp zone T}:T{ .sp ناحیه conntrack T}:T{ .sp عدد صحیح (۱۶ بیتی) T} .TE .sp 1 .PP \fBذخیره nfmark بسته در conntrack:\fR .sp .if n \{\ .RS 4 .\} .nf ct mark set meta mark .fi .if n \{\ .RE .\} .PP \fBتنظیم ناحیه نگاشت‌شده از طریق رابط:\fR .sp .if n \{\ .RS 4 .\} .nf 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 } } } .fi .if n \{\ .RE .\} .PP \fBمحدود کردن رویدادهای گزارش‌شده توسط ctnetlink:\fR .sp .if n \{\ .RS 4 .\} .nf ct event set new,related,destroy .fi .if n \{\ .RE .\} .sp .SS "گزاره عدم ردگیری (NOTRACK STATEMENT)" .sp گزاره notrack امکان غیرفعال کردن ردگیری اتصال را برای بسته‌های مشخصی فراهم می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf \fBnotrack\fR .fi .if n \{\ .RE .\} .sp توجه داشته باشید که برای موثر بودن این گزاره، باید قبل از رخ دادن جستجوی conntrack روی بسته‌ها اعمال شود\&. بنابراین، باید در زنجیره‌ای با قلاب prerouting یا output و اولویت قلاب \-300 (\fBraw\fR) یا کمتر قرار گیرد\&. .sp برای یک نمونه استفاده، به گزاره SYNPROXY (SYNPROXY STATEMENT) مراجعه کنید\&. .SS "گزاره متاداده (META STATEMENT)" .sp یک گزاره متاداده مقدار یک عبارت متاداده را تنظیم می‌کند\&. فیلدهای متاداده موجود عبارتند از: priority، mark، pkttype، nftrace\&. .sp .if n \{\ .RS 4 .\} .nf \fBmeta\fR {\fBmark\fR | \fBpriority\fR | \fBpkttype\fR | \fBnftrace\fR | \fBbroute\fR} \fBset\fR \fIvalue\fR .fi .if n \{\ .RE .\} .sp یک گزاره متاداده، متاداده‌های مرتبط با یک بسته را تنظیم می‌کند\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&68.\ \&انواع گزاره‌های متاداده (Meta statement types) .TS allbox tab(:); ltB ltB ltB. T{ کلمه کلیدی T}:T{ توضیحات T}:T{ مقدار T} .T& lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp priority T}:T{ .sp اولویت بسته در TC T}:T{ .sp tc_handle T} T{ .sp mark T}:T{ .sp نشان بسته (Packet mark) T}:T{ .sp mark T} T{ .sp pkttype T}:T{ .sp نوع بسته T}:T{ .sp pkt_type T} T{ .sp nftrace T}:T{ .sp روشن/خاموش کردن ردگیری بسته در مجموعه قوانین\&. برای مشاهده ردگیری‌ها از دستور \fBmonitor trace\fR استفاده کنید T}:T{ .sp 0, 1 T} T{ .sp broute T}:T{ .sp روشن/خاموش کردن broute\&. بسته‌ها به جای پل زدن (bridging)، مسیریابی می‌شوند T}:T{ .sp 0, 1 T} .TE .sp 1 .SS "گزاره محدودیت نرخ (LIMIT STATEMENT)" .sp .if n \{\ .RS 4 .\} .nf \fBlimit rate\fR [\fBover\fR] \fIpacket_number\fR \fB/\fR \fITIME_UNIT\fR [\fBburst\fR \fIpacket_number\fR \fBpackets\fR] \fBlimit rate\fR [\fBover\fR] \fIbyte_number\fR \fIBYTE_UNIT\fR \fB/\fR \fITIME_UNIT\fR [\fBburst\fR \fIbyte_number\fR \fIBYTE_UNIT\fR] \fITIME_UNIT\fR := \fBsecond\fR | \fBminute\fR | \fBhour\fR | \fBday\fR \fIBYTE_UNIT\fR := \fBbytes\fR | \fBkbytes\fR | \fBmbytes\fR .fi .if n \{\ .RE .\} .sp گزاره محدودیت نرخ با استفاده از فیلتر سطل ژتون (token bucket filter) بسته‌ها را با نرخی محدود مطابقت می‌دهد\&. قانونی که از این گزاره استفاده می‌کند تا زمانی که به این حد نرسیده باشد تطبیق داده خواهد شد\&. می‌توان از آن در ترکیب با گزاره log برای ایجاد ثبت گزارش با نرخ محدود استفاده کرد\&. کلمه کلیدی اختیاری \fBover\fR باعث می‌شود در نرخ‌های بالاتر از مقدار مشخص‌شده تطبیق داده شود\&. .sp مقدار \fBburst\fR بر اندازه سطل، یعنی تحمل نوسان (jitter tolerance) تأثیر می‌گذارد\&. در حالت \fBlimit\fR مبتنی بر بسته، سطل دقیقاً به اندازه \fBburst\fR بسته را نگهداری می‌کند که به طور پیش‌فرض پنج بسته است\&. اگر \fBburst\fR بسته را مشخص کنید، باید مقداری غیر صفر باشد\&. در حالت \fBlimit\fR مبتنی بر بایت، حداقل اندازه سطل برابر با مقدار بایت نرخ ارائه‌شده است و مقدار \fBburst\fR به آن اضافه می‌شود که به طور پیش‌فرض صفر بایت است\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&69.\ \&مقادیر گزاره limit (limit statement values) .TS allbox tab(:); ltB ltB ltB. T{ مقدار T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt. T{ .sp packet_number T}:T{ .sp تعداد بسته‌ها T}:T{ .sp عدد صحیح بدون علامت (۳۲ بیتی) T} T{ .sp byte_number T}:T{ .sp تعداد بایت‌ها T}:T{ .sp عدد صحیح بدون علامت (۳۲ بیتی) T} .TE .sp 1 .SS "گزاره‌های NAT (NAT STATEMENTS)" .sp .if n \{\ .RS 4 .\} .nf \fBsnat\fR [[\fBip\fR | \fBip6\fR] [ \fBprefix\fR ] \fBto\fR] \fITARGET_SPEC\fR [\fIFLAGS\fR] \fBdnat\fR [[\fBip\fR | \fBip6\fR] [ \fBprefix\fR ] \fBto\fR] \fITARGET_SPEC\fR [\fIFLAGS\fR] \fBmasquerade\fR [\fBto :\fR\fIPORT_SPEC\fR] [\fIFLAGS\fR] \fBredirect\fR [\fBto :\fR\fIPORT_SPEC\fR] [\fIFLAGS\fR] \fITARGET_SPEC\fR := \fIADDR_SPEC\fR | [\fIADDR_SPEC\fR] \fB:\fR\fIPORT_SPEC\fR \fIADDR_SPEC\fR := \fIaddress\fR | \fIaddress\fR \fB\-\fR \fIaddress\fR \fIPORT_SPEC\fR := \fIport\fR | \fIport\fR \fB\-\fR \fIport\fR \fIFLAGS\fR := \fIFLAG\fR [\fB,\fR \fIFLAGS\fR] \fIFLAG\fR := \fBpersistent\fR | \fBrandom\fR | \fBfully\-random\fR .fi .if n \{\ .RE .\} .sp گزاره‌های nat تنها از نوع‌های زنجیره nat معتبر هستند\&. .sp گزاره‌های \fBsnat\fR و \fBmasquerade\fR مشخص می‌کنند که آدرس/پورت مبدا بسته باید تغییر یابد\&. در حالی که \fBsnat\fR فقط در زنجیره‌های postrouting و input معتبر است، \fBmasquerade\fR تنها در postrouting معنا دارد\&. گزاره‌های dnat و redirect فقط در زنجیره‌های prerouting و output معتبر هستند و مشخص می‌کنند که آدرس/پورت مقصد بسته باید تغییر یابد\&. شما همچنین می‌توانید از زنجیره‌های غیرپایه که از زنجیره‌های پایه با نوع زنجیره nat فراخوانی می‌شوند استفاده کنید\&. تمامی بسته‌های بعدی در این اتصال نیز دستکاری (mangle) خواهند شد و بررسی قوانین متوقف خواهد شد\&. .sp گزاره \fBmasquerade\fR شکل خاصی از snat است که همواره از آدرس IP رابط خروجی برای ترجمه استفاده می‌کند\&. این گزاره به‌ویژه در دروازه‌ها (gateways) با آدرس‌های IP پویا (عمومی) کاربرد دارد\&. .sp گزاره \fBredirect\fR شکل خاصی از dnat است که همواره آدرس مقصد را به آدرس میزبان محلی ترجمه می‌کند\&. این گزاره برای رهگیری ترافیک عبوری از یک مسیریاب و هدایت آن به یک دیمن محلی در حال اجرا، مثلاً هنگام ساخت پروکسی شفاف (transparent proxy) یا دروازه لایه کاربرد (application\-layer gateway) بسیار مفید است\&. .sp برای \fITARGET_SPEC\fR، می‌توان آدرس‌ها، پورت‌ها، یا هر دو را مشخص کرد\&. اگر هیچ آدرس یا پورتی مشخص نشود، فیلد مربوطه در سرآیند بسته بدون تغییر باقی می‌ماند\&. .sp هنگام استفاده در خانواده inet (موجود از هسته ۵\&.۲)، گزاره‌های dnat و snat در صورت ارائه آدرس نیازمند استفاده از کلمات کلیدی ip و ip6 هستند، به مثال‌های زیر نگاه کنید\&. .sp پیش از هسته ۴\&.۱۸، گزاره‌های nat نیازمند حضور هر دو زنجیره پایه prerouting و postrouting بودند، زیرا در غیر این صورت بسته‌ها در مسیر بازگشت توسط netfilter دیده نمی‌شدند و بنابراین هیچ ترجمه معکوسی انجام نمی‌گرفت\&. .sp کلمه کلیدی اختیاری \fBprefix\fR امکان نگاشت \fBn\fR آدرس مبدا به \fBn\fR آدرس مقصد را فراهم می‌کند\&. به \fIمثال‌های پیشرفته NAT\fR در زیر نگاه کنید\&. .sp اگر \fIaddress\fR برای \fBdnat\fR یک آدرس لوپ‌بک IPv4 باشد (یعنی 127\&.0\&.0\&.0/8)، متغیر sysctl با نام "net\&.ipv4\&.conf\&.*\&.route_localnet" برای رابط ورودی باید روی ۱ تنظیم شود\&. در غیر این صورت بسته‌ها توسط کد مسیریابی به عنوان "martians" دور انداخته خواهند شد\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۷۰.\ \&مقادیر گزاره NAT (NAT statement values) .TS allbox tab(:); ltB ltB ltB. T{ عبارت T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt. T{ .sp address T}:T{ .sp مشخص می‌کند که آدرس مبدا/مقصد بسته باید تغییر داده شود\&. می‌توانید یک نگاشت را برای مرتبط کردن فهرستی از تاپل‌های متشکل از کلید عبارت دلخواه با مقدار آدرس مشخص کنید\&. T}:T{ .sp 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 } T} T{ .sp port T}:T{ .sp مشخص می‌کند که پورت مبدا/مقصد بسته باید تغییر داده شود\&. T}:T{ .sp شماره پورت (۱۶ بیتی) T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۷۱.\ \&فلگ‌های گزاره NAT (NAT statement flags) .TS allbox tab(:); ltB ltB. T{ فلگ T}:T{ توضیحات T} .T& lt lt lt lt lt lt. T{ .sp persistent T}:T{ .sp برای هر اتصال، آدرس مبدا/مقصد یکسانی را به یک کلاینت اختصاص می‌دهد\&. T} T{ .sp random T}:T{ .sp در هسته ۵\&.۰ و جدیدتر این فلگ مشابه fully\-random است\&. در هسته‌های قدیمی‌تر نگاشت پورت با استفاده از یک ترکیب هش MD5 دانه‌بندی‌شده (seeded) با استفاده از آدرس مبدا و مقصد و پورت مقصد تصادفی خواهد شد\&. T} T{ .sp fully\-random T}:T{ .sp در صورت استفاده، نگاشت پورت بر اساس یک الگوریتم شبه‌تصادفی ۳۲ بیتی تولید می‌شود\&. T} .TE .sp 1 .PP \fBاستفاده از گزاره‌های NAT\fR\&. .sp .if n \{\ .RS 4 .\} .nf # ایجاد یک پیکربندی جدول/زنجیره مناسب برای تمام مثال‌های بعدی 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 .fi .if n \{\ .RE .\} .PP \fBمثال‌های پیشرفته NAT\fR\&. .sp .if n \{\ .RS 4 .\} .nf # نگاشت پیشوندهای یک شبکه به شبکه دیگر، برای نمونه 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" امکان مرتبط کردن یک آدرس و یک پورت را با هر کلید فراهم می‌کرد. اما در این حالت، برای هر کلید باید دو آدرس و دو پورت (مقادیر حداقل و حداکثر برای هر دو) ذخیره شوند. .fi .if n \{\ .RE .\} .sp .SS "گزاره TPROXY (TPROXY STATEMENT)" .sp گزاره Tproxy بسته را بدون تغییر دادن سرآیند بسته به هر نحوی، به یک سوکت محلی تغییر مسیر می‌دهد\&. در صورت نبود هر یک از آرگومان‌ها، داده‌های بسته ورودی به عنوان پارامتر استفاده می‌شود\&. تطبیق Tproxy نیازمند قاعده دیگری است که اطمینان حاصل کند سرآیند پروتکل انتقال مشخص شده است\&. .sp .if n \{\ .RS 4 .\} .nf \fBtproxy to\fR \fIaddress\fR\fB:\fR\fIport\fR \fBtproxy to\fR {\fIaddress\fR | \fB:\fR\fIport\fR} .fi .if n \{\ .RE .\} .sp این نحو می‌تواند در جدول‌های \fBip/ip6\fR که در آن‌ها پروتکل لایه شبکه مشخص است استفاده شود\&. می‌توان آدرس IP یا پورت را مشخص کرد، اما دست‌کم یکی از آن‌ها الزامی است\&. .sp .if n \{\ .RS 4 .\} .nf \fBtproxy\fR {\fBip\fR | \fBip6\fR} \fBto\fR \fIaddress\fR[\fB:\fR\fIport\fR] \fBtproxy to :\fR\fIport\fR .fi .if n \{\ .RE .\} .sp این نحو می‌تواند در جدول‌های \fBinet\fR استفاده شود\&. پارامتر \fBip/ip6\fR خانواده‌ای را که قاعده با آن تطبیق خواهد یافت مشخص می‌کند\&. پارامتر \fBaddress\fR باید از همین خانواده باشد\&. هنگامی که فقط \fBport\fR تعریف شده است، خانواده آدرس نباید مشخص شود\&. در این حالت، قاعده با هر دو خانواده تطبیق خواهد یافت\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۷۲.\ \&مشخصه‌های tproxy (tproxy attributes) .TS allbox tab(:); ltB ltB. T{ نام T}:T{ توضیحات T} .T& lt lt lt lt. T{ .sp address T}:T{ .sp آدرس IP که سوکت شنونده با گزینه IP_TRANSPARENT به آن مقید (bind) شده است\&. T} T{ .sp port T}:T{ .sp پورتی که سوکت شنونده با گزینه IP_TRANSPARENT به آن مقید (bind) شده است\&. T} .TE .sp 1 .PP \fBمجموعه قوانین نمونه برای گزاره tproxy\fR\&. .sp .if n \{\ .RS 4 .\} .nf 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 } } .fi .if n \{\ .RE .\} .sp توجه داشته باشید که گزاره tproxy غیرپایانی (non\-terminal) است تا امکان پردازش‌های بعدی بسته‌ها فراهم شود\&. این کار اجازه می‌دهد بسته‌ها برای اشکال‌زدایی لاگ شوند و همچنین علامت (mark) آن‌ها برای اطمینان از تحویل محلی بسته‌ها از طریق قوانین مسیریابی مبتنی بر سیاست (policy routing) به‌روزرسانی شود\&. .PP \fBمجموعه قوانین نمونه برای گزاره tproxy همراه با ثبت گزارش (logging) و علامت‌گذاری متاداده\fR\&. .sp .if n \{\ .RS 4 .\} .nf 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 } } } .fi .if n \{\ .RE .\} .sp از آنجا که سرآیند بسته‌ها بدون تغییر باقی می‌ماند، ممکن است بسته‌ها به جای تحویل محلی هدایت (forward) شوند\&. همان‌طور که در بالا اشاره شد، با افزودن قوانین مسیریابی مبتنی بر سیاست و علامت‌گذاری بسته می‌توان از این امر جلوگیری کرد\&. .PP \fBقوانین نمونه مسیریابی مبتنی بر سیاست برای تغییر مسیر محلی\fR\&. .sp .if n \{\ .RS 4 .\} .nf ip rule add fwmark 1 lookup 100 ip route add local 0\&.0\&.0\&.0/0 dev lo table 100 .fi .if n \{\ .RE .\} .sp این یک تغییر در رفتار نسبت به هدف قدیمی TPROXY در iptables است که پایانی (terminal) بود\&. برای پایان دادن به پردازش بسته پس از گزاره tproxy، به خاطر داشته باشید که مانند مثال بالا یک حکم (verdict) صادر کنید\&. .SS "گزاره SYNPROXY (SYNPROXY STATEMENT)" .sp این گزاره دست‌تکانی سه‌مرحله‌ای TCP (TCP three\-way\-handshake) را به صورت موازی در بافت netfilter پردازش می‌کند تا از سیستم محلی یا سیستم‌های پسین (backend) محافظت نماید\&. این گزاره به ردیابی اتصال (connection tracking) نیاز دارد زیرا شماره‌های ترتیب (sequence numbers) باید ترجمه شوند\&. .sp .if n \{\ .RS 4 .\} .nf \fBsynproxy\fR [\fBmss\fR \fImss_value\fR] [\fBwscale\fR \fIwscale_value\fR] [\fISYNPROXY_FLAGS\fR] .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۷۳.\ \&مشخصه‌های گزاره synproxy (synproxy statement attributes) .TS allbox tab(:); ltB ltB. T{ نام T}:T{ توضیحات T} .T& lt lt lt lt. T{ .sp mss T}:T{ .sp حداکثر اندازه قطعه (Maximum segment size) اعلام‌شده به کلاینت‌ها\&. این مقدار باید با سیستم پسین مطابقت داشته باشد\&. T} T{ .sp wscale T}:T{ .sp مقیاس پنجره (Window scale) اعلام‌شده به کلاینت‌ها\&. این مقدار باید با سیستم پسین مطابقت داشته باشد\&. T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۷۴.\ \&فلگ‌های گزاره synproxy (synproxy statement flags) .TS allbox tab(:); ltB ltB. T{ فلگ T}:T{ توضیحات T} .T& lt lt lt lt. T{ .sp sack\-perm T}:T{ .sp ارسال گزینه تایید انتخابی (selective acknowledgement) کلاینت به سیستم پسین (در صورت عدم وجود غیرفعال خواهد شد)\&. T} T{ .sp timestamp T}:T{ .sp ارسال گزینه برچسب زمان (timestamp) کلاینت به سیستم پسین (در صورت عدم وجود غیرفعال خواهد شد؛ همچنین برای تایید انتخابی و مقیاس‌پذیری پنجره مورد نیاز است)\&. T} .TE .sp 1 .PP \fBمجموعه قوانین نمونه برای گزاره synproxy\fR\&. .sp .if n \{\ .RS 4 .\} .nf تعیین گزینه‌های tcp استفاده‌شده توسط سیستم پسین، از یک سیستم خارجی tcpdump \-pni eth0 \-c 1 \*(Aqtcp[tcpflags] == (tcp\-syn|tcp\-ack) && port 80\*(Aq & 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 } } .fi .if n \{\ .RE .\} .sp .SS "گزاره جریان (FLOW STATEMENT)" .sp یک گزاره flow به ما امکان می‌دهد جریان‌هایی را که می‌خواهیم هدایت آن‌ها از طریق میان‌بُر زدن (bypass) پشته شبکه لایه ۳ تسریع شود، انتخاب کنیم\&. شما باید نام flowtable را که می‌خواهید این جریان به آن واگذار (offload) شود مشخص کنید\&. .sp \fBflow add @\fR\fIflowtable\fR .SS "گزاره صف (QUEUE STATEMENT)" .sp این گزاره بسته را با استفاده از گرداننده nfnetlink_queue به فضای کاربری (userspace) منتقل می‌کند\&. بسته در صفی قرار می‌گیرد که با شماره صف ۱۶ بیتی آن مشخص شده است\&. فضای کاربری می‌تواند بسته را در صورت تمایل بازرسی کرده و به صورت اختیاری تغییر دهد\&. فضای کاربری باید یک حکم drop یا accept صادر کند\&. در صورت accept، پردازش از قلاب زنجیره پایه بعدی از سر گرفته می‌شود، نه از قاعده پس از حکم queue\&. برای جزئیات به مستندات libnetfilter_queue مراجعه کنید\&. .sp .if n \{\ .RS 4 .\} .nf \fBqueue\fR [\fBflags\fR \fIQUEUE_FLAGS\fR] [\fBto\fR \fIqueue_number\fR] \fBqueue\fR [\fBflags\fR \fIQUEUE_FLAGS\fR] [\fBto\fR \fIqueue_number_from\fR \- \fIqueue_number_to\fR] \fBqueue\fR [\fBflags\fR \fIQUEUE_FLAGS\fR] [\fBto\fR \fIQUEUE_EXPRESSION\fR ] \fIQUEUE_FLAGS\fR := \fIQUEUE_FLAG\fR [\fB,\fR \fIQUEUE_FLAGS\fR] \fIQUEUE_FLAG\fR := \fBbypass\fR | \fBfanout\fR \fIQUEUE_EXPRESSION\fR := \fBnumgen\fR | \fBhash\fR | \fBsymhash\fR | \fBMAP STATEMENT\fR .fi .if n \{\ .RE .\} .sp عبارت QUEUE_EXPRESSION می‌تواند برای محاسبه شماره صف در زمان اجرا با استفاده از عبارت‌های hash یا numgen به کار رود\&. همچنین به شما امکان می‌دهد با استفاده از گزاره map، شماره صف‌های ثابتی را بر اساس ورودی‌های خارجی مانند آدرس ip مبدا یا نام رابط‌ها اختصاص دهید\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۷۵.\ \&مقادیر گزاره queue (queue statement values) .TS allbox tab(:); ltB ltB ltB. T{ مقدار T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt lt lt lt. T{ .sp queue_number T}:T{ .sp شماره صف را تنظیم می‌کند، مقدار پیش‌فرض 0 است\&. T}:T{ .sp unsigned integer (16 bit) T} T{ .sp queue_number_from T}:T{ .sp صف اولیه در بازه را در صورت استفاده از fanout تنظیم می‌کند\&. T}:T{ .sp unsigned integer (16 bit) T} T{ .sp queue_number_to T}:T{ .sp صف پایانی در بازه را در صورت استفاده از fanout تنظیم می‌کند\&. T}:T{ .sp unsigned integer (16 bit) T} .TE .sp 1 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۷۶.\ \&فلگ‌های گزاره queue (queue statement flags) .TS allbox tab(:); ltB ltB. T{ فلگ T}:T{ توضیحات T} .T& lt lt lt lt. T{ .sp bypass T}:T{ .sp اگر برنامه کاربردی فضای کاربری نتواند عقب‌نشینی کند (پاسخ دهد)، اجازه عبور به بسته‌ها داده می‌شود\&. پیش از استفاده از این فلگ، توصیه‌های تنظیم عملکرد را در مستندات libnetfilter_queue مطالعه کنید\&. T} T{ .sp fanout T}:T{ .sp توزیع بسته‌ها بین چندین صف مختلف\&. T} .TE .sp 1 .SS "گزاره تکثیر بسته (DUP STATEMENT)" .sp گزاره dup برای تکثیر یک بسته و ارسال نسخه کپی‌شده به مقصدی متفاوت استفاده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf \fBdup to\fR \fIdevice\fR \fBdup to\fR \fIaddress\fR \fBdevice\fR \fIdevice\fR .fi .if n \{\ .RE .\} .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B جدول\ \&۷۷.\ \&مقادیر گزاره Dup (Dup statement values) .TS allbox tab(:); ltB ltB ltB. T{ عبارت T}:T{ توضیحات T}:T{ نوع T} .T& lt lt lt lt lt lt. T{ .sp address T}:T{ .sp مشخص می‌کند که نسخه کپی بسته باید به یک دروازه (gateway) جدید ارسال شود\&. T}:T{ .sp 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 } T} T{ .sp device T}:T{ .sp مشخص می‌کند که نسخه کپی باید از طریق device انتقال یابد\&. T}:T{ .sp string T} .TE .sp 1 .PP \fBاستفاده از گزاره dup\fR\&. .sp .if n \{\ .RS 4 .\} .nf # ارسال به ماشینی با آدرس 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" } .fi .if n \{\ .RE .\} .sp .SS "گزاره هدایت بسته (FWD STATEMENT)" .sp گزاره fwd برای تغییر مسیر یک بسته خام به رابطی دیگر استفاده می‌شود\&. این گزاره تنها در قلاب‌های ingress و egress خانواده netdev در دسترس است\&. این گزاره مشابه گزاره dup است با این تفاوت که هیچ کپی‌ای ساخته نمی‌شود\&. .sp همچنین می‌توانید آدرس هاپ بعدی (next hop) و دستگاهی را که بسته باید به آن هدایت شود مشخص کنید\&. این کار با انتقال بسته از طریق لایه همسایه، آدرس MAC مبدا و مقصد بسته را به‌روزرسانی می‌کند\&. این کار همچنین فیلد ttl بسته IP را کاهش می‌دهد\&. این ویژگی روشی برای دور زدن مؤثر مسیر هدایت سنتی فراهم کرده و در نتیجه از جستجوی fib (پایگاه اطلاعات هدایت \- forwarding information base) صرف‌نظر می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf \fBfwd to\fR \fIdevice\fR \fBfwd\fR [\fBip\fR | \fBip6\fR] \fBto\fR \fIaddress\fR \fBdevice\fR \fIdevice\fR .fi .if n \{\ .RE .\} .PP \fBاستفاده از گزاره fwd\fR\&. .sp .if n \{\ .RS 4 .\} .nf # تغییر مسیر بسته خام به دستگاه netdev ingress fwd to "eth0" # هدایت بسته به هاپ بعدی 192.168.200.1 از طریق دستگاه eth0 netdev ingress ether saddr set fwd ip to 192\&.168\&.200\&.1 device "eth0" .fi .if n \{\ .RE .\} .sp .SS "گزاره مجموعه (SET STATEMENT)" .sp گزاره set برای افزودن یا به‌روزرسانی پویای عناصر در یک مجموعه (set) از مسیر عبور بسته استفاده می‌شود\&. مجموعه setname باید از قبل در جدول مشخص‌شده وجود داشته باشد و باید با یکی از فلگ‌های dynamic یا timeout یا هر دو ایجاد شده باشد\&. اگر عبارت گزاره set شامل یک شیء حالت‌مند (stateful object) باشد، فلگ dynamic الزامی است\&. اگر مجموعه با یک انقضای زمانی (timeout) ایجاد شده باشد، فلگ timeout به‌صورت تلویحی در نظر گرفته می‌شود و در صورتی که گزاره set به جای افزودن عناصر آن‌ها را به‌روزرسانی کند، این فلگ الزامی است\&. علاوه بر این، این مجموعه‌ها باید هم حداکثر اندازه مجموعه را مشخص کنند (برای جلوگیری از اتمام حافظه) و هم عناصر آن‌ها چه از طریق تعریف مجموعه و چه از طریق گزاره‌ای که آن‌ها را اضافه یا به‌روزرسانی می‌کند دارای انقضای زمانی باشند (تا تعداد آن‌ها به طور نامحدود رشد نکند)\&. گزاره set می‌تواند برای نمونه جهت ایجاد لیست‌های سیاه پویا (dynamic blacklists) به کار رود\&. .sp به‌روزرسانی‌های پویا همچنین در نگاشت‌ها (maps) پشتیبانی می‌شوند\&. در این حالت، قاعده \fBadd\fR یا \fBupdate\fR باید هم کلید و هم عنصر داده‌ای (مقدار) را که با \fI:\fR از هم جدا شده‌اند ارائه دهد\&. .sp .if n \{\ .RS 4 .\} .nf {\fBadd\fR | \fBupdate\fR} \fB@\fR\fIsetname\fR \fB{\fR \fIexpression\fR [\fBtimeout\fR \fItimeout\fR] [\fBcomment\fR \fIstring\fR] \fB}\fR .fi .if n \{\ .RE .\} .PP \fBمثال برای لیست سیاه ساده\fR\&. .sp .if n \{\ .RS 4 .\} .nf # تعریف یک مجموعه، مقید به جدول "filter"، در خانواده "ip"\&. # انقضای زمانی و اندازه اجباری هستند زیرا ما عناصر را از مسیر بسته اضافه خواهیم کرد\&. # مدخل‌ها پس از یک دقیقه منقضی می‌شوند و در صورت تداوم شرایط محدودیت # ممکن است دوباره اضافه شوند\&. nft add set ip filter blackhole \e "{ type ipv4_addr; flags dynamic; timeout 1m; size 65536; }" # تعریف یک مجموعه برای ذخیره محدودیت به ازای هر saddr\&. # این باید از blackhole جدا باشد زیرا زمان انقضا متفاوت است nft add set ip filter flood \e "{ 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 \e add @flood { ip saddr limit rate over 10/second } \e add @blackhole { ip saddr } \e 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 } .fi .if n \{\ .RE .\} .sp .SS "گزاره نگاشت (MAP STATEMENT)" .sp گزاره map برای جستجوی داده‌ها بر اساس یک کلید ورودی مشخص استفاده می‌شود\&. .sp .if n \{\ .RS 4 .\} .nf \fIexpression\fR \fBmap\fR \fB{\fR \fIMAP_ELEMENTS\fR \fB}\fR \fIMAP_ELEMENTS\fR := \fIMAP_ELEMENT\fR [\fB,\fR \fIMAP_ELEMENTS\fR] \fIMAP_ELEMENT\fR := \fIkey\fR \fB:\fR \fIvalue\fR .fi .if n \{\ .RE .\} .sp مقدار \fIkey\fR مقداری است که توسط \fIexpression\fR بازگردانده می‌شود\&. .PP \fBاستفاده از گزاره map\fR\&. .sp .if n \{\ .RS 4 .\} .nf # انتخاب هدف 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 } .fi .if n \{\ .RE .\} .sp .SS "گزاره نگاشت حکم (VMAP STATEMENT)" .sp گزاره نگاشت حکم (vmap) مشابه‌ گزاره map عمل می‌کند، اما حاوی احکام (verdicts) به عنوان مقادیر است\&. .sp .if n \{\ .RS 4 .\} .nf \fIexpression\fR \fBvmap\fR \fB{\fR \fIVMAP_ELEMENTS\fR \fB}\fR \fIVMAP_ELEMENTS\fR := \fIVMAP_ELEMENT\fR [\fB,\fR \fIVMAP_ELEMENTS\fR] \fIVMAP_ELEMENT\fR := \fIkey\fR \fB:\fR \fIverdict\fR .fi .if n \{\ .RE .\} .PP \fBاستفاده از گزاره vmap\fR\&. .sp .if n \{\ .RS 4 .\} .nf # پرش به زنجیره‌های مختلف بسته به نوع پروتکل لایه ۴: nft add rule ip filter input ip protocol vmap { tcp : jump tcp\-chain, udp : jump udp\-chain , icmp : jump icmp\-chain } .fi .if n \{\ .RE .\} .sp .SS "گزاره XT (XT STATEMENT)" .sp این یک گزاره xt را از رابط سازگاری xtables نشان می‌دهد\&. در صورتی که ترجمه در دسترس نباشد یا کامل نباشد، این گزاره به عنوان یک راهکار جایگزین (fallback) عمل می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf \fBxt\fR \fITYPE\fR \fINAME\fR \fITYPE\fR := \fBmatch\fR | \fBtarget\fR | \fBwatcher\fR .fi .if n \{\ .RE .\} .sp مشاهده این گزاره بدین معناست که مجموعه قوانین (یا بخش‌هایی از آن) توسط \fBiptables\-nft\fR ایجاد شده است و برای مدیریت آن باید از همان ابزار استفاده شود\&. .sp \fBهشدار:\fR nftables این گزاره‌ها را بازیابی نخواهد کرد\&. .SH "دستورهای اضافی (ADDITIONAL COMMANDS)" .sp این‌ها برخی دستورات اضافی موجود در nft هستند\&. .SS "فهرست هوک‌ها (LIST HOOKS)" .sp این دستور فهرستی از توابعی را که برای خانواده پروتکل مشخص‌شده ثبت شده‌اند نمایش می‌دهد، از جمله توابعی که به طور ضمنی توسط ماژول‌های هسته مانند nf_conntrack ثبت شده‌اند\&. .sp .if n \{\ .RS 4 .\} .nf \fBlist hooks\fR [\fIfamily\fR] \fBlist hooks netdev\fR [ \fBdevice\fR \fIDEVICE_NAME\fR ] .fi .if n \{\ .RE .\} .sp دستور \fBlist hooks\fR برای نمایش هر آنچه که روی سیستم فعال است کافی است\&. هوک‌ها در خانواده netdev به یک دستگاه شبکه وابسته‌اند\&. اگر هیچ نام دستگاهی داده نشود، nft تمامی دستگاه‌های شبکه را در فضای نام شبکه فعلی پرس‌وجو خواهد کرد\&. نمونه استفاده: .PP \fBفهرست کردن تمام هوک‌های فعال netfilter در پشته ip یا ip6\fR\&. .sp .if n \{\ .RS 4 .\} .nf % 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] [\&.\&.] .fi .if n \{\ .RE .\} .sp خروجی بالا میزبانی را نشان می‌دهد که nat، conntrack و یکپارچه‌سازی مجدد بسته‌های ipv4 (packet defragmentation) در آن فعال است\&. برای هر مکان هوک در خانواده پرس‌وجوشده، فهرستی از هوک‌های فعال با استفاده از فرمت .sp \fBpriority\fR \fBidentifier\fR [\fBmodule_name\fR] .sp نمایش داده خواهد شد\&. .sp مقدار \fBpriority\fR ترتیبی را که هوک‌ها فراخوانی می‌شوند تعیین می‌کند\&. این فهرست مرتب شده است و کمترین عدد ابتدا اجرا می‌شود\&. .sp مقدار اولویت هوک‌های ثبت‌شده توسط هسته قابل تغییر نیست\&. برای زنجیره‌های پایه ثبت‌شده توسط nftables، این مقدار با مقدار \fBpriority\fR مشخص‌شده در تعریف زنجیره پایه مطابقت دارد\&. .sp پس از مقدار عددی، اطلاعات مربوط به هوک نشان داده می‌شود\&. برای زنجیره‌های پایه تعریف‌شده در nftables، این اطلاعات شامل خانواده جدول، نام جدول و نام زنجیره پایه است\&. برای هوک‌های ناشی از ماژول‌های هسته، به جای آن از نام تابع استفاده می‌شود\&. .sp اگر یک \fBmodule name\fR داده شود، هوک توسط ماژول هسته‌ای با این نام ثبت شده است\&. می‌توانید از دستور \fImodinfo \fR\fI\fBmodule name\fR\fR برای کسب اطلاعات بیشتر در مورد ماژول استفاده کنید\&. .sp این قابلیت نیازمند هسته‌ای است که گزینه CONFIG_NETFILTER_NETLINK_HOOK در آن به صورت ماژول یا توکار (builtin) فعال شده باشد\&. این ماژول \fBnfnetlink_hook\fR نام دارد\&. .SS "پایش و نظارت (MONITOR)" .sp دستور monitor به شما امکان می‌دهد به رویدادهای Netlink تولیدشده توسط زیرسیستم nf_tables گوش دهید\&. این رویدادها یا مربوط به ایجاد و حذف اشیاء هستند یا مربوط به بسته‌هایی که \fBmeta nftrace\fR برای آن‌ها فعال شده است\&. هنگام وقوع آن‌ها، nft رویدادهای پایش‌شده را در قالب JSON یا قالب بومی nft در خروجی استاندارد (stdout) چاپ می‌کند\&. .sp .if n \{\ .RS 4 .\} .nf \fBmonitor\fR [\fBnew\fR | \fBdestroy\fR] \fIMONITOR_OBJECT\fR \fBmonitor\fR \fBtrace\fR \fIMONITOR_OBJECT\fR := \fBtables\fR | \fBchains\fR | \fBsets\fR | \fBrules\fR | \fBelements\fR | \fBruleset\fR .fi .if n \{\ .RE .\} .sp برای فیلتر کردن رویدادهای مربوط به یک شیء خاص، از یکی از کلمات کلیدی در \fIMONITOR_OBJECT\fR استفاده کنید\&. .sp برای فیلتر کردن رویدادهای مربوط به یک اقدام خاص، از کلمه کلیدی \fBnew\fR یا \fBdestroy\fR استفاده کنید\&. .sp شکل دوم فراخوانی هیچ گزینه دیگری نمی‌پذیرد و منحصراً رویدادهای تولیدشده برای بسته‌هایی را که \fBnftrace\fR برای آن‌ها فعال است چاپ می‌کند\&. .sp برای پایان دادن به عملیات پایش، کلیدهای ^C را فشار دهید\&. .PP \fBگوش دادن به تمام رویدادها، گزارش در قالب بومی nft\fR\&. .sp .if n \{\ .RS 4 .\} .nf % nft monitor .fi .if n \{\ .RE .\} .PP \fBگوش دادن به قوانین حذف‌شده، گزارش در قالب JSON\fR\&. .sp .if n \{\ .RS 4 .\} .nf % nft \-j monitor destroy rules .fi .if n \{\ .RE .\} .PP \fBگوش دادن به زنجیره‌های جدید و حذف‌شده، در قالب بومی nft\fR\&. .sp .if n \{\ .RS 4 .\} .nf % nft monitor chains .fi .if n \{\ .RE .\} .PP \fBگوش دادن به رویدادهای مجموعه قوانین مانند جدول، زنجیره، قانون، مجموعه، شمارنده‌ها و سهمیه‌ها، در قالب بومی nft\fR\&. .sp .if n \{\ .RS 4 .\} .nf % nft monitor ruleset .fi .if n \{\ .RE .\} .PP \fBردیابی بسته‌های ورودی از میزبان 10.0.0.1\fR\&. .sp .if n \{\ .RS 4 .\} .nf % nft add rule filter input ip saddr 10\&.0\&.0\&.1 meta nftrace set 1 % nft monitor trace .fi .if n \{\ .RE .\} .sp .SH "گزارش خطا (ERROR REPORTING)" .sp هنگامی که خطایی شناسایی می‌شود، nft خط(های) حاوی خطا و موقعیت بخش‌های دارای خطا در جریان ورودی را نشان می‌دهد و بخش‌های خطادار را با علامت‌های هشتک (^) مشخص می‌کند\&. اگر خطا ناشی از ترکیب دو عبارت یا گزاره باشد، بخشی که محدودیت‌های نقض‌شده را اعمال می‌کند با علامت مد (~) مشخص می‌شود\&. .sp برای خطاهای بازگردانده‌شده توسط هسته، nft نمی‌تواند تشخیص دهد کدام بخش‌های ورودی باعث ایجاد خطا شده‌اند و کل دستور علامت‌گذاری می‌شود\&. .PP \fBخطای ناشی از یک عبارت نادرست منفرد\fR\&. .sp .if n \{\ .RS 4 .\} .nf :1:19\-22: Error: Interface does not exist filter output oif eth0 ^^^^ .fi .if n \{\ .RE .\} .PP \fBخطای ناشی از ترکیب نامعتبر دو عبارت\fR\&. .sp .if n \{\ .RS 4 .\} .nf :1:28\-36: Error: Right hand side of relational expression (==) must be constant filter output tcp dport == tcp dport ~~ ^^^^^^^^^ .fi .if n \{\ .RE .\} .PP \fBخطای بازگردانده‌شده توسط هسته\fR\&. .sp .if n \{\ .RS 4 .\} .nf :0:0\-23: Error: Could not process rule: Operation not permitted filter output oif wlan0 ^^^^^^^^^^^^^^^^^^^^^^^ .fi .if n \{\ .RE .\} .sp .SH "وضعیت خروج (EXIT STATUS)" .sp در صورت موفقیت، nft با وضعیت خروج ۰ خارج می‌شود\&. خطاهای نامشخص باعث خروج با وضعیت ۱، خطاهای تخصیص حافظه با وضعیت ۲ و ناتوانی در باز کردن سوکت Netlink با وضعیت ۳ می‌شوند\&. .SH "همچنین ببینید (SEE ALSO)" .sp .if n \{\ .RS 4 .\} .nf libnftables(3), libnftables\-json(5), iptables(8), ip6tables(8), arptables(8), ebtables(8), ip(8), tc(8) .fi .if n \{\ .RE .\} .sp یک ویکی رسمی در نشانی زیر موجود است: https://wiki\&.nftables\&.org .SH "نویسندگان (AUTHORS)" .sp پروژه nftables توسط Patrick McHardy و Pablo Neira Ayuso و همراه با مشارکت‌کنندگان بسیار دیگری از جامعه Netfilter نوشته شده است\&. .SH "کپی‌رایت (COPYRIGHT)" .sp کپی‌رایت \(co 2008\-2014 Patrick McHardy کپی‌رایت \(co 2013\-2018 Pablo Neira Ayuso .sp پروژه nftables یک نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت شرایط نسخه ۲ از مجوز عمومی همگانی گنو (GNU General Public License) که توسط بنیاد نرم‌افزارهای آزاد منتشر شده است، بازتوزیع کرده و/یا تغییر دهید\&. .sp این مستندات تحت شرایط مجوز کریتیو کامنز انتساب\-اشتراک‌همانند ۴\&.۰ (CC BY\-SA 4\&.0) مجوزدهی شده است: http://creativecommons\&.org/licenses/by\-sa/4\&.0\&.