LIBNFTABLES-JSON(5)   LIBNFTABLES-JSON(5)

libnftables-json - رابط ساختاریافته JSON برای مدیریت قوانین فایروال nftables

{ "nftables": [ OBJECTS ] }

OBJECTS := LIST_OBJECTS | CMD_OBJECTS

LIST_OBJECTS := LIST_OBJECT [ , LIST_OBJECTS ]

CMD_OBJECTS := CMD_OBJECT [ , CMD_OBJECTS ]

CMD_OBJECT := { CMD: LIST_OBJECT } | METAINFO_OBJECT

CMD := "add" | "replace" | "create" | "insert" | "delete" | "list" | "reset" | "flush" | "rename"

LIST_OBJECT := TABLE | CHAIN | RULE | SET | MAP | ELEMENT | FLOWTABLE | COUNTER | QUOTA | CT_HELPER | LIMIT | METAINFO_OBJECT | CT_TIMEOUT | CT_EXPECTATION

کتابخانه libnftables از ورودی و خروجی در قالب JSON پشتیبانی می‌کند. این قابلیت به عنوان یک پیشانه (frontend) جایگزین برای تجزیه‌کننده نحو استاندارد CLI پیاده‌سازی شده است، بنابراین رفتار پایه‌ای کاملاً یکسان بوده و تقریباً برای هر عملیاتی که در نحو استاندارد در دسترس است، یک معادل در نحو JSON وجود دارد.

ورودی JSON می‌تواند در قالب یک رشته تکی به عنوان پارامتر به تابع nft_run_cmd_from_buffer() داده شود یا در فایلی قرار گیرد که با پارامتر filename در تابع nft_run_cmd_from_filename() مشخص می‌شود.

خروجی JSON باید از طریق تابع nft_ctx_output_set_json() فعال شود که خروجی استاندارد کتابخانه را به قالب JSON تبدیل می‌کند. خروجی خطاها تحت تأثیر این تنظیم قرار نمی‌گیرد و دست‌نخورده می‌ماند.

به طور کلی، هر ورودی یا خروجی JSON درون شیئی قرار دارد که شامل یک ویژگی منفرد به نام nftables است. مقدار این ویژگی آرایه‌ای شامل دستورها (برای ورودی) یا عناصر مجموعه قوانین (ruleset) (برای خروجی) می‌باشد.

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

در خروجی، اولین شیء در آرایه nftables یک شیء ویژه حاوی اطلاعات کتابخانه است. محتوای آن به صورت زیر است:

{ "metainfo": {
        "version": STRING,
        "release_name": STRING,
        "json_schema_version": NUMBER
}}

مقادیر ویژگی‌های version و release_name برابر با نسخه بسته و نام انتشار همان‌طور که توسط دستور nft -v چاپ می‌شود است. مقدار ویژگی json_schema_version یک عدد صحیح است که نسخه شِمای JSON را نشان می‌دهد.

اگر در ورودی کتابخانه ارائه شود، تجزیه‌کننده بررسی می‌کند که مقدار json_schema_version از نسخه کدگذاری‌شده درون کتابخانه فراتر نرود (تا اطمینان حاصل شود که شِمای ارائه‌شده کاملاً پشتیبانی می‌شود). در آینده، عددی کمتر از مقدار داخلی ممکن است حالت سازگاری را فعال کند تا ورودی‌های قدیمی و ناسازگار JSON را پردازش نماید.

این ساختار تعداد دلخواهی از دستورها را می‌پذیرد که به ترتیب ظاهر شدن تفسیر می‌شوند. برای نمونه، ورودی با نحو استاندارد زیر:

flush ruleset
add table inet mytable
add chain inet mytable mychain
add rule inet mytable mychain tcp dport 22 accept

به شکل زیر به JSON ترجمه می‌شود:

{ "nftables": [
        { "flush": { "ruleset": null }},
        { "add": { "table": {
                        "family": "inet",
                        "name": "mytable"
        }}},
        { "add": { "chain": {
                        "family": "inet",
                        "table": "mytable",
                        "name": "mychain"
        }}},
        { "add": { "rule": {
                        "family": "inet",
                        "table": "mytable",
                        "chain": "mychain",
                        "expr": [
                                { "match": {
                                        "op": "==",
                                        "left": { "payload": {
                                                        "protocol": "tcp",
                                                        "field": "dport"
                                        }},
                                        "right": 22
                                }},
                                { "accept": null }
                        ]
        }}}
]}

{ "add": ADD_OBJECT }
ADD_OBJECT := TABLE | CHAIN | RULE | SET | MAP | ELEMENT |
                FLOWTABLE | COUNTER | QUOTA | CT_HELPER | LIMIT |
                CT_TIMEOUT | CT_EXPECTATION

افزودن یک عنصر جدید از مجموعه قوانین به کرنل. برای قوانین، این دستور به طور پیش‌فرض قانون را به انتهای زنجیره اضافه می‌کند. اگر قانون حاوی ویژگی handle یا index باشد، پس از قانونی که توسط این ویژگی‌ها مشخص شده درج می‌شود.

{ "replace": RULE }

جایگزینی یک قانون. در RULE، ویژگی handle الزامی است و قانونی را که باید جایگزین شود مشخص می‌کند.

{ "create": ADD_OBJECT }

مشابه دستور add است، اما اگر شیء از قبل وجود داشته باشد خطا برمی‌گرداند.

{ "insert": RULE }

این دستور برای قوانین مشابه add است، اما به جای الحاق قانون به انتهای زنجیره، آن را در موقعیت اول درج می‌کند. اگر ویژگی handle یا index داده شده باشد، قانون قبل از قانونی که با این ویژگی‌ها مشخص شده درج می‌گردد.


نکته

در دستورهای صریح (add، insert، create با پوشش دستور)، فیلد handle برای موقعیت‌یابی استفاده می‌شود. در دستورهای ضمنی (اشیای خام rule بدون پوشش دستور، مانند آنچه در صدور/ورود استفاده می‌شود)، فیلد handle برای تضمین سازگاری در سیستم‌های مختلف نادیده گرفته می‌شود.

{ "delete": ADD_OBJECT }

حذف یک شیء از مجموعه قوانین. به طور معمول در ADD_OBJECT تنها حداقل تعداد ویژگی‌های لازم برای شناسایی یکتای شیء مورد نیاز است. برای بیشتر عناصر مجموعه قوانین، این ویژگی‌ها شامل family و table به همراه handle یا name است (به جز قوانین، زیرا نام ندارند).

{ "list": LIST_OBJECT }
LIST_OBJECT := TABLE | TABLES | CHAIN | CHAINS | SET | SETS |
                 MAP | MAPS | COUNTER | COUNTERS | QUOTA | QUOTAS |
                 CT_HELPER | CT_HELPERS | LIMIT | LIMITS | RULESET |
                 METER | METERS | FLOWTABLE | FLOWTABLES |
                 CT_TIMEOUT | CT_EXPECTATION

فهرست کردن عناصر مجموعه قوانین. فرم‌های جمع برای فهرست کردن همه اشیای آن نوع استفاده می‌شوند، که اختیاری بر اساس family و برای برخی موارد بر اساس table فیلتر می‌شوند.

{ "reset": RESET_OBJECT }
RESET_OBJECT := COUNTER | COUNTERS | QUOTA | QUOTAS | RULE | RULES | SET | MAP | ELEMENT

بازنشانی وضعیت در اشیای سازگار، یعنی صفر کردن شمارنده داخلی آن‌ها.

{ "flush": FLUSH_OBJECT }
FLUSH_OBJECT := TABLE | CHAIN | SET | MAP | METER | RULESET

خالی کردن محتوای شیء داده‌شده، به عنوان مثال حذف همه زنجیره‌ها از یک table مشخص یا حذف همه عناصر از یک set داده‌شده.

{ "rename": CHAIN }

تغییر نام یک زنجیره. نام جدید در ویژگی اختصاصی با نام newname انتظار می‌رود.

{ "ruleset": RULSET_PROPERTIES }
RULESET_PROPERTIES := null | { "family": STRING }

این یک شیء ویژه برای استفاده با دستورهای list و flush است که روی کل مجموعه قوانین یا بخش‌هایی از آن که متعلق به خانواده داده‌شده هستند اعمال می‌شود.

{ "table": {
        "family": STRING,
        "name": STRING,
        "handle": NUMBER,
        "flags": TABLE_FLAGS
}}
TABLE_FLAGS := TABLE_FLAG | [ TABLE_FLAG_LIST ]
TABLE_FLAG_LIST := TABLE_FLAG [, TABLE_FLAG_LIST ]
TABLE_FLAG := "dormant" | "owner" | "persist"

این شیء یک جدول را توصیف می‌کند.

family

خانواده جدول، مانند "ip" یا "ip6".

name

نام جدول.

handle

دستگیره (handle) جدول. در ورودی، تنها در دستور delete به عنوان جایگزینی برای name استفاده می‌شود.

flags

پرچم‌ها (flags) جدول.

{ "chain": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "newname": STRING,
        "handle": NUMBER,
        "type": STRING,
        "hook": STRING,
        "prio": NUMBER,
        "dev": STRING,
        "policy": STRING
}}

این شیء یک زنجیره را توصیف می‌کند.

family

خانواده جدول مربوطه.

table

نام جدول مربوطه.

name

نام زنجیره.

handle

دستگیره (handle) زنجیره. در ورودی، تنها در دستور delete به عنوان جایگزینی برای name استفاده می‌شود.

newname

نام جدید برای زنجیره، که فقط در دستور rename کاربرد دارد.

ویژگی‌های زیر برای زنجیره‌های پایه (base chains) الزامی هستند:

type

نوع زنجیره.

hook

قلاب (hook) زنجیره.

prio

اولویت زنجیره.

dev

رابط متصل‌شده به زنجیره (در صورتی که در خانواده netdev باشد).

policy

سیاست (policy) زنجیره.

{ "rule": {
        "family": STRING,
        "table": STRING,
        "chain": STRING,
        "expr": [ STATEMENTS ],
        "handle": NUMBER,
        "index": NUMBER,
        "comment": STRING
}}
STATEMENTS := STATEMENT [, STATEMENTS ]

این شیء یک قانون را توصیف می‌کند. بلوک‌های سازنده اساسی قوانین، گزاره‌ها (statements) هستند. هر قانون حداقل از یک گزاره تشکیل شده است.

family

خانواده جدول.

table

نام جدول.

chain

نام زنجیره.

expr

آرایه‌ای از گزاره‌ها که این قانون از آن‌ها تشکیل شده است. در ورودی، این ویژگی تنها در دستورهای add/insert/replace استفاده می‌شود.

handle

دستگیره (handle) قانون. در دستورهای delete/replace به عنوان شناسه قانونی که باید حذف یا جایگزین شود عمل می‌کند. در دستورهای add/insert/create در صورت وجود، موقعیت‌یابی را نسبت به یک قانون موجود مشخص می‌کند: add قانون جدید را پس از دستگیره مشخص‌شده درج می‌کند، و insert آن را قبل از آن درج می‌نماید. هنگامی که چندین قانون در یک موقعیت دستگیره یکسان اضافه می‌شوند، موقعیت آن‌ها نسبت به قانون اولیه سنجیده می‌شود، نه نسبت به قوانینی که پیش‌تر درج شده‌اند. در اشیای قانون ضمنی (بدون پوشش دستور، همان‌طور که در خروجی nft -j list استفاده می‌شود)، فیلد handle وجود دارد اما در ورودی نادیده گرفته می‌شود تا قابلیت حمل صادرات/واردات تضمین گردد.

index

موقعیت قانون برای دستورهای add/insert. در این حالت به عنوان جایگزینی برای handle استفاده می‌شود.

comment

توضیح (کامنت) اختیاری قانون.

{ "set": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "handle": NUMBER,
        "type": SET_TYPE,
        "policy": SET_POLICY,
        "flags": SET_FLAGS,
        "elem": SET_ELEMENTS,
        "timeout": NUMBER,
        "gc-interval": NUMBER,
        "size": NUMBER,
        "count": NUMBER,
        "auto-merge": BOOLEAN
}}
{ "map": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "handle": NUMBER,
        "type": SET_TYPE,
        "map": STRING,
        "policy": SET_POLICY,
        "flags": SET_FLAGS,
        "elem": SET_ELEMENTS,
        "timeout": NUMBER,
        "gc-interval": NUMBER,
        "size": NUMBER,
        "count": NUMBER,
        "auto-merge": BOOLEAN
}}
SET_TYPE := STRING | [ SET_TYPE_LIST ] | { "typeof": EXPRESSION }
SET_TYPE_LIST := STRING [, SET_TYPE_LIST ]
SET_POLICY := "performance" | "memory"
SET_FLAGS := SET_FLAG | [ SET_FLAG_LIST ]
SET_FLAG_LIST := SET_FLAG [, SET_FLAG_LIST ]
SET_FLAG := "constant" | "interval" | "timeout"
SET_ELEMENTS := EXPRESSION | [ EXPRESSION_LIST ]
EXPRESSION_LIST := EXPRESSION [, EXPRESSION_LIST ]

این اشیاء یک مجموعه (set) یا نگاشت (map) نام‌گذاری‌شده را توصیف می‌کنند. نگاشت‌ها شکل خاصی از مجموعه‌ها هستند که یک کلید یکتا را به یک مقدار ترجمه می‌کنند.

family

خانواده جدول.

table

نام جدول.

name

نام مجموعه.

handle

دستگیره مجموعه. در ورودی، تنها در دستور delete استفاده می‌شود.

type

نوع داده مجموعه، بخش زیر را ببینید.

map

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

policy

سیاست مجموعه.

flags

پرچم‌های مجموعه.

elem

عنصر یا عناصر اولیه مجموعه، بخش زیر را ببینید.

timeout

مهلت زمانی عنصر بر حسب ثانیه.

gc-interval

فاصله زمانی زباله‌روب (garbage collector) بر حسب ثانیه.

size

حداکثر تعداد عناصر پشتیبانی‌شده.

count

تعداد فعلی عناصر. در ورودی استفاده نمی‌شود.

auto-merge

ادغام خودکار عناصر مجاور یا همپوشان در مجموعه‌های بازه‌ای (interval sets).

TYPE

نوع مجموعه ممکن است یک رشته مانند "ipv4_addr"، آرایه‌ای متشکل از رشته‌ها (برای انواع الحاق‌شده) یا یک شیء typeof حاوی عبارتی برای استخراج نوع باشد.

ELEM

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

چندین عنصر را می‌توان در یک آرایه قرار داد.

{ "element": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "elem": SET_ELEM
}}
SET_ELEM := EXPRESSION | [ EXPRESSION_LIST ]
EXPRESSION_LIST := EXPRESSION [, EXPRESSION ]

دستکاری عنصر یا عناصر در یک مجموعه نام‌گذاری‌شده.

family

خانواده جدول.

table

نام جدول.

name

نام مجموعه.

elem

ویژگی elem در شیء set را ببینید.

{ "flowtable": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "handle": NUMBER,
        "hook": STRING,
        "prio": NUMBER,
        "dev": FT_INTERFACE
}}
FT_INTERFACE := STRING | [ FT_INTERFACE_LIST ]
FT_INTERFACE_LIST := STRING [, STRING ]

این شیء یک جدول جریان (flowtable) نام‌گذاری‌شده را نشان می‌دهد.

family

خانواده جدول.

table

نام جدول.

name

نام جدول جریان.

handle

دستگیره جدول جریان. در ورودی، تنها توسط دستور delete استفاده می‌شود.

hook

قلاب جدول جریان.

prio

اولویت جدول جریان.

dev

رابط یا رابط‌های جدول جریان.

{ "counter": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "handle": NUMBER,
        "packets": NUMBER,
        "bytes": NUMBER
}}

این شیء یک شمارنده (counter) نام‌گذاری‌شده را نشان می‌دهد.

family

خانواده جدول.

table

نام جدول.

name

نام شمارنده.

handle

دستگیره شمارنده. در ورودی، تنها توسط دستور delete استفاده می‌شود.

packets

مقدار شمارنده بسته‌ها.

bytes

مقدار شمارنده بایت‌ها.

{ "quota": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "handle": NUMBER,
        "bytes": NUMBER,
        "used": NUMBER,
        "inv": BOOLEAN
}}

این شیء یک سهمیه (quota) نام‌گذاری‌شده را نشان می‌دهد.

family

خانواده جدول.

table

نام جدول.

name

نام سهمیه.

handle

دستگیره سهمیه. در ورودی، تنها توسط دستور delete استفاده می‌شود.

bytes

آستانه سهمیه.

used

سهمیه مصرف‌شده تا این لحظه.

inv

در صورت مقدار true، اگر سهمیه فراتر رفته باشد مطابقت برقرار می‌شود.

{ "ct helper": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "handle": ... ',
        "type": 'STRING,
        "protocol": CTH_PROTO,
        "l3proto": STRING
}}
CTH_PROTO := "tcp" | "udp"

این شیء یک دستیار ردیابی اتصال (conntrack helper) نام‌گذاری‌شده را نشان می‌دهد.

family

خانواده جدول.

table

نام جدول.

name

نام ct helper.

handle

دستگیره ct helper. در ورودی، تنها توسط دستور delete استفاده می‌شود.

type

نام نوع ct helper، مانند "ftp" یا "tftp".

protocol

پروتکل لایه ۴ مربوط به ct helper.

l3proto

پروتکل لایه ۳ مربوط به ct helper، مانند "ip" یا "ip6".

{ "limit": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "handle": NUMBER,
        "rate": NUMBER,
        "per": STRING,
        "burst": NUMBER,
        "unit": LIMIT_UNIT,
        "inv": BOOLEAN
}}
LIMIT_UNIT := "packets" | "bytes"

این شیء یک محدودیت (limit) نام‌گذاری‌شده را نشان می‌دهد.

family

خانواده جدول.

table

نام جدول.

name

نام محدودیت.

handle

دستگیره محدودیت. در ورودی، تنها توسط دستور delete استفاده می‌شود.

rate

مقدار نرخ محدودیت.

per

واحد زمانی اعمال محدودیت، مانند "week"، "day"، "hour" و غیره. در صورت عدم ذکر، پیش‌فرض "second" است.

burst

مقدار جهش (burst) محدودیت. در صورت عدم ذکر، پیش‌فرض 0 است.

unit

واحد مقادیر نرخ و جهش. در صورت حذف، پیش‌فرض "packets" است.

inv

در صورت مقدار true، اگر از حد مجاز فراتر رود مطابقت برقرار می‌شود. در صورت عدم ذکر، پیش‌فرض false است.

{ "ct timeout": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "handle": NUMBER,
        "protocol": CTH_PROTO,
        "state": STRING,
        "value: NUMBER,
        "l3proto": STRING
}}
CTH_PROTO := "tcp" | "udp" | "dccp" | "sctp" | "gre" | "icmpv6" | "icmp" | "generic"

این شیء یک سیاست مهلت زمانی ردیابی اتصال (conntrack timeout policy) نام‌گذاری‌شده را نشان می‌دهد.

family

خانواده جدول.

table

نام جدول.

name

نام شیء ct timeout.

handle

دستگیره شیء ct timeout. در ورودی، تنها توسط دستور delete استفاده می‌شود.

protocol

پروتکل لایه ۴ مربوط به شیء ct timeout.

state

نام وضعیت اتصال، مانند "established"، "syn_sent"، "close" یا "close_wait"، که مقدار مهلت زمانی برای آن باید به‌روزرسانی شود.

value

مقدار مهلت زمانی به‌روزرسانی‌شده برای وضعیت اتصال مشخص‌شده.

l3proto

پروتکل لایه ۳ مربوط به شیء ct timeout، مانند "ip" یا "ip6".

{ "ct expectation": {
        "family": STRING,
        "table": STRING,
        "name": STRING,
        "handle": NUMBER,
        "l3proto": STRING
        "protocol":* CTH_PROTO,
        "dport": NUMBER,
        "timeout: NUMBER,
        "size: NUMBER,
*}}
CTH_PROTO := "tcp" | "udp" | "dccp" | "sctp" | "gre" | "icmpv6" | "icmp" | "generic"

این شیء یک انتظار ردیابی اتصال (conntrack expectation) نام‌گذاری‌شده را نشان می‌دهد.

family

خانواده جدول.

table

نام جدول.

name

نام شیء ct expectation.

handle

دستگیره شیء ct expectation. در ورودی، تنها توسط دستور delete استفاده می‌شود.

l3proto

پروتکل لایه ۳ شیء ct expectation، مانند "ip" یا "ip6".

protocol

پروتکل لایه ۴ شیء ct expectation.

dport

درگاه مقصد اتصال مورد انتظار.

timeout

مدت زمان بر حسب میلی‌ثانیه که این انتظار فعال خواهد ماند.

size

حداکثر تعداد انتظاراتی که می‌توانند به طور همزمان وجود داشته باشند.

گزاره‌ها (statements) بلوک‌های سازنده قوانین هستند. هر قانون حداقل از یک گزاره تشکیل شده است.

{ "accept": null }
{ "drop": null }
{ "continue": null }
{ "return": null }
{ "jump": { "target": * STRING *}}
{ "goto": { "target": * STRING *}}

یک حکم (verdict) یا عبور بسته از زنجیره فعلی را خاتمه می‌دهد یا آن را به زنجیره دیگری واگذار می‌کند.

گزاره‌های jump و goto به نام زنجیره مقصد نیاز دارند.

{ "match": {
        "left": EXPRESSION,
        "right": EXPRESSION,
        "op": STRING
}}

این گزاره عبارت سمت چپ (معمولاً هدر بسته یا اطلاعات فراداده بسته) را با عبارت سمت راست (معمولاً یک مقدار ثابت) تطبیق می‌دهد. اگر گزاره مقدار true ارزیابی شود، گزاره بعدی در این قانون بررسی می‌شود. در غیر این صورت، پردازش با قانون بعدی در همان زنجیره ادامه می‌یابد.

left

سمت چپ این تطبیق.

right

سمت راست این تطبیق.

op

عملگری که نوع مقایسه را مشخص می‌کند.

عملگرها (OPERATORS)

== برابر (Equal)
!= نابرابر (Not equal)
< کوچک‌تر از (Less than)
> بزرگ‌تر از (Greater than)
<= کوچک‌تر یا مساوی (Less than or equal to)
>= بزرگ‌تر یا مساوی (Greater than or equal to)
in انجام جستجو، یعنی بررسی اینکه آیا بیت‌های RHS در مقدار LHS وجود دارند یا خیر

برخلاف API استاندارد، عملگر در اینجا الزامی است. در API استاندارد، عملگر حذف‌شده ممکن است به دو روش بسته به نوع عبارت در سمت راست (RHS) حل شود:

•اگر RHS یک ماسک بیتی یا فهرستی از ماسک‌های بیتی باشد، عبارت به یک عملیات دودویی با عملگر نابرابری تبدیل می‌شود، به این صورت: LHS & RHS != 0.
•در هر حالت دیگر، عملگر برابری به سادگی درج می‌شود.

برای حالت اول غیربدیهی، JSON API از عملگر in پشتیبانی می‌کند.

{ "counter": {
        "packets": NUMBER,
        "bytes": NUMBER
}}
{ "counter": STRING }

این شیء یک شمارنده بایت/بسته را نشان می‌دهد. در ورودی، هیچ ویژگی‌ای الزامی نیست. در صورت ارائه، به عنوان مقادیر اولیه برای شمارنده عمل می‌کنند.

فرم اول یک شمارنده ناشناس ایجاد می‌کند که درون قانونی که در آن ظاهر شده زندگی می‌کند. فرم دوم ارجاعی به یک شیء شمارنده نام‌گذاری‌شده را مشخص می‌نماید.

packets

بسته‌های شمارش‌شده.

bytes

بایت‌های شمارش‌شده.

{ "mangle": {
        "key": EXPRESSION,
        "value": EXPRESSION
}}

این گزاره داده‌های بسته یا اطلاعات فراداده (meta info) آن را تغییر می‌دهد.

key

داده بسته‌ای که باید تغییر کند، ارائه‌شده به عنوان یک عبارت exthdr، payload، meta، ct یا ct helper.

value

مقدار جدید برای تغییر داده‌ها.

{ "quota": {
        "val": NUMBER,
        "val_unit": STRING,
        "used": NUMBER,
        "used_unit": STRING,
        "inv": BOOLEAN
}}
{ "quota": STRING }

فرم اول یک سهمیه ناشناس ایجاد می‌کند که در قانونی که در آن ظاهر شده قرار دارد. فرم دوم ارجاعی به یک شیء سهمیه نام‌گذاری‌شده را مشخص می‌کند.

val

مقدار سهمیه.

val_unit

واحد val، مانند "kbytes" یا "mbytes". در صورت عدم ذکر، پیش‌فرض "bytes" است.

used

سهمیه مصرف‌شده تا این لحظه. در ورودی اختیاری است. در صورت ارائه، به عنوان مقدار اولیه عمل می‌کند.

used_unit

واحد used. پیش‌فرض "bytes" است.

inv

در صورت مقدار true، اگر سهمیه فراتر رفته باشد مطابقت داده می‌شود. پیش‌فرض false است.

{ "limit": {
        "rate": NUMBER,
        "rate_unit": STRING,
        "per": STRING,
        "burst": NUMBER,
        "burst_unit": STRING,
        "inv": BOOLEAN
}}
{ "limit": STRING }

فرم اول یک محدودیت ناشناس ایجاد می‌کند که درون قانونی که در آن ظاهر شده قرار دارد. فرم دوم ارجاعی به یک شیء محدودیت نام‌گذاری‌شده را مشخص می‌کند.

rate

مقدار نرخ محدودسازی.

rate_unit

واحد rate، مانند "packets" یا "mbytes". پیش‌فرض "packets" است.

per

مخرج rate، مانند "week" یا "minutes".

burst

مقدار جهش (burst). پیش‌فرض 0 است.

burst_unit

واحد burst، در صورتی که rate_unit برابر با "packets" باشد نادیده گرفته می‌شود. پیش‌فرض "bytes" است.

inv

در صورت مقدار true، اگر از حد مجاز فراتر رود مطابقت برقرار می‌شود. پیش‌فرض false است.

{ "fwd": {
        "dev": EXPRESSION,
        "family": FWD_FAMILY,
        "addr": EXPRESSION
}}
FWD_FAMILY := "ip" | "ip6"

هدایت بسته به مقصدی متفاوت.

dev

رابطی که بسته باید روی آن هدایت شود.

family

خانواده addr.

addr

آدرس IP(v6) که بسته باید به آن هدایت شود.

هر دو ویژگی family و addr اختیاری هستند، اما اگر حداقل یکی از آن‌ها داده شود، هر دو باید وجود داشته باشند.

{ "notrack": null }

غیرفعال کردن ردیابی اتصال (connection tracking) برای بسته.

{ "dup": {
        "addr": EXPRESSION,
        "dev": EXPRESSION
}}

تکثیر یک بسته به مقصدی متفاوت.

addr

آدرسی که بسته باید به آن تکثیر شود.

dev

رابطی که بسته باید روی آن تکثیر شود. می‌توان آن را حذف کرد تا رابط به طور صریح مشخص نشود.

{ "snat": {
        "addr": EXPRESSION,
        "family": STRING,
        "port": EXPRESSION,
        "flags": FLAGS
}}
{ "dnat": {
        "addr": EXPRESSION,
        "family": STRING,
        "port": EXPRESSION,
        "flags": FLAGS
}}
{ "masquerade": {
        "port": EXPRESSION,
        "flags": FLAGS
}}
{ "redirect": {
        "port": EXPRESSION,
        "flags": FLAGS
}}
FLAGS := FLAG | [ FLAG_LIST ]
FLAG_LIST := FLAG [, FLAG_LIST ]
FLAG := "random" | "fully-random" | "persistent"

انجام ترجمه نشانی شبکه (NAT).

addr

آدرسی که باید به آن ترجمه شود.

family

خانواده addr، یا ip یا ip6. در خانواده جدول inet الزامی است.

port

درگاهی که باید به آن ترجمه شود.

flags

پرچم یا پرچم‌ها (flags).

همه ویژگی‌ها اختیاری هستند و پیش‌فرض آن‌ها none است.

{ "reject": {
        "type": STRING,
        "expr": EXPRESSION
}}

رد کردن بسته و ارسال پاسخ خطای مشخص‌شده.

type

نوع رد کردن، یکی از مقادیر "tcp reset"، "icmpx"، "icmp" یا "icmpv6".

expr

کد ICMP که بسته با آن رد می‌شود.

همه ویژگی‌ها اختیاری هستند.

{ "set": {
        "op": STRING,
        "elem": EXPRESSION,
        "set": STRING
}}

افزودن یا به‌روزرسانی پویای عناصر در یک مجموعه.

op

عملگر روی مجموعه، یکی از مقادیر "add" یا "update".

elem

عنصر مجموعه برای افزودن یا به‌روزرسانی.

set

ارجاع به مجموعه.

{ "log": {
        "prefix": STRING,
        "group": NUMBER,
        "snaplen": NUMBER,
        "queue-threshold": NUMBER,
        "level": LEVEL,
        "flags": FLAGS
}}
LEVEL := "emerg" | "alert" | "crit" | "err" | "warn" | "notice" |
           "info" | "debug" | "audit"
FLAGS := FLAG | [ FLAG_LIST ]
FLAG_LIST := FLAG [, FLAG_LIST ]
FLAG := "tcp sequence" | "tcp options" | "ip options" | "skuid" |
          "ether" | "all"

ثبت گزارش (لاگ) از بسته.

prefix

پیشوند ورودی‌های گزارش (لاگ).

group

گروه گزارش‌گیری.

snaplen

طول اسنپ (snaplen) برای ثبت لاگ.

queue-threshold

آستانه صف.

level

سطح لاگ. پیش‌فرض "warn" است.

flags

پرچم‌های لاگ.

همه ویژگی‌ها اختیاری هستند.

{ "ct helper": EXPRESSION }

فعال کردن دستیار conntrack مشخص‌شده برای این بسته.

ct helper

ارجاع به ct helper.

{ "meter": {
        "name": STRING,
        "key": EXPRESSION,
        "stmt": STATEMENT
}}

اعمال یک گزاره مشخص با استفاده از یک سنجش‌گر (meter).

name

نام meter.

key

کلید meter.

stmt

گزاره meter.

{ "queue": {
        "num": EXPRESSION,
        "flags": FLAGS
}}
FLAGS := FLAG | [ FLAG_LIST ]
FLAG_LIST := FLAG [, FLAG_LIST ]
FLAG := "bypass" | "fanout"

ارسال بسته به صف در فضای کاربری (userspace).

num

شماره صف.

flags

پرچم‌های صف.

{ "vmap": {
        "key": EXPRESSION,
        "data": EXPRESSION
}}

اعمال شرطی یک حکم (verdict).

key

کلید نگاشت.

data

عبارت نگاشت شامل جفت‌های مقدار/حکم.

{ "ct count": {
        "val": NUMBER,
        "inv": BOOLEAN
}}

محدود کردن تعداد اتصالات با استفاده از conntrack.

val

آستانه تعداد اتصالات.

inv

در صورت مقدار true، اگر از val فراتر رود مطابقت داده می‌شود. در صورت عدم ذکر، پیش‌فرض false است.

{ "ct timeout": EXPRESSION }

اختصاص سیاست مهلت زمانی ردیابی اتصال (conntrack timeout policy).

ct timeout

ارجاع به CT timeout.

{ "ct expectation": EXPRESSION }

اختصاص انتظار ردیابی اتصال (conntrack expectation).

ct expectation

ارجاع به CT expectation.

{ "xt": {
        "type": TYPENAME,
        "name": STRING
}}
TYPENAME := match | target | watcher

این گزاره نمایانگر یک گزاره xt از رابط سازگاری xtables است. این یک سازوکار جایگزین (fallback) برای مواقعی است که ترجمه در دسترس نبوده یا کامل نیست.

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

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

عبارت‌ها (expressions) بلوک‌های سازنده (اکثر) گزاره‌ها هستند. در پایه‌ای‌ترین شکل، آن‌ها صرفاً مقادیر بی‌واسطه‌ای هستند که به صورت نوع رشته‌ای، عددی یا بولی در JSON نمایش داده می‌شوند.

STRING
NUMBER
BOOLEAN

عبارت‌های بی‌واسطه (immediate) معمولاً برای مقادیر ثابت استفاده می‌شوند. برای رشته‌ها، دو حالت خاص وجود دارد:

@STRING

بخش باقی‌مانده به عنوان نام مجموعه برای ایجاد ارجاع به مجموعه در نظر گرفته می‌شود.

\*

ساخت یک عبارت نویسه عمومی (wildcard).

ARRAY

عبارت‌های فهرستی توسط آرایه‌های معمولی شامل تعداد دلخواهی از عبارت‌ها ساخته می‌شوند.

{ "concat": CONCAT }
CONCAT := [ EXPRESSION_LIST ]
EXPRESSION_LIST := EXPRESSION [, EXPRESSION_LIST ]

الحاق چندین عبارت به یکدیگر.

{ "set": SET }
SET := EXPRESSION | [ EXPRESSION_LIST ]

این شیء یک مجموعه ناشناس می‌سازد. برای نگاشت‌ها، آرایه‌ای از آرایه‌ها با دقیقاً دو عنصر انتظار می‌رود.

{ "map": {
        "key": EXPRESSION,
        "data": EXPRESSION
}}

نگاشت یک کلید به یک مقدار.

key

کلید نگاشت.

data

عبارت نگاشت شامل جفت‌های مقدار/مقصد.

{ "prefix": {
        "addr": EXPRESSION,
        "len": NUMBER
}}

ساخت یک پیشوند IPv4 یا IPv6 شامل بخش نشانی در addr و طول پیشوند در len.

{ "range": [ EXPRESSION , EXPRESSION ] }

ساخت بازه‌ای از مقادیر. عنصر اول آرایه نشان‌دهنده کران پایین و عنصر دوم نشان‌دهنده کران بالا است.

{ "payload": {
        "base": BASE,
        "offset": NUMBER,
        "len": NUMBER
}}
{ "payload": {
        "protocol": STRING,
        "field": STRING
}}
BASE := "ll" | "nh" | "th"

ساخت یک عبارت بار داده (payload)، یعنی ارجاع به بخش خاصی از داده‌های بسته. فرم اول یک عبارت بار داده خام ایجاد می‌کند تا به تعداد دلخواهی از بیت‌ها (len) در انحراف مشخص (offset) از یک نقطه مبنای داده‌شده (base) اشاره کند. مقادیر base زیر پذیرفته می‌شوند:

"ll"

انحراف (offset) نسبت به شروع هدر لایه پیوند داده (Link Layer) سنجیده می‌شود.

"nh"

انحراف نسبت به شروع هدر لایه شبکه (Network Layer) سنجیده می‌شود.

"th"

انحراف نسبت به شروع هدر لایه انتقال (Transport Layer) سنجیده می‌شود.

فرم دوم امکان ارجاع به یک فیلد را بر اساس نام (field) در یک هدر بسته مشخص (protocol) فراهم می‌کند.

{ "exthdr": {
        "name": STRING,
        "field": STRING,
        "offset": NUMBER
}}

ایجاد ارجاع به یک فیلد (field) در یک هدر توسعه IPv6 با نام (name). مقدار offset تنها برای پروتکل rt0 استفاده می‌شود.

اگر ویژگی field داده نشود، این عبارت به عنوان بررسی وجود هدر در گزاره match به همراه مقدار بولی در سمت راست استفاده می‌شود.

{ "tcp option": {
        "name": STRING,
        "field": STRING
}}

ایجاد ارجاع به یک فیلد (field) از یک هدر گزینه TCP با نام (name).

اگر ویژگی field داده نشود، عبارت به عنوان بررسی وجود گزینه TCP در یک گزاره match به همراه یک مقدار بولی در سمت راست استفاده می‌شود.

{ "sctp chunk": {
        "name": STRING,
        "field": STRING
}}

ایجاد ارجاع به یک فیلد (field) از یک قطعه (chunk) پروتکل SCTP با نام (name).

اگر ویژگی field داده نشود، عبارت به عنوان بررسی وجود قطعه SCTP در یک گزاره match به همراه یک مقدار بولی در سمت راست استفاده می‌شود.

{ "dccp option": {
        "type": NUMBER*
}}

ایجاد ارجاع به یک گزینه DCCP بر اساس (type).

این عبارت به عنوان بررسی وجود گزینه DCCP در یک گزاره match با یک مقدار بولی در سمت راست استفاده می‌شود.

{ "meta": {
        "key": META_KEY
}}
META_KEY := "length" | "protocol" | "priority" | "random" | "mark" |
              "iif" | "iifname" | "iiftype" | "oif" | "oifname" |
              "oiftype" | "skuid" | "skgid" | "nftrace" |
              "rtclassid" | "ibrname" | "obrname" | "ibridgename" |
              "obridgename" | "pkttype" | "cpu" | "iifgroup" |
              "oifgroup" | "cgroup" | "nfproto" | "l4proto" |
              "secpath"

ایجاد ارجاع به فراداده (meta data) بسته.

{ "rt": {
        "key": RT_KEY,
        "family": RT_FAMILY
}}
RT_KEY := "classid" | "nexthop" | "mtu"
RT_FAMILY := "ip" | "ip6"

ایجاد ارجاع به داده‌های مسیریابی (routing data) بسته.

ویژگی family اختیاری است و به طور پیش‌فرض نامشخص رها می‌شود.

{ "ct": {
        "key": STRING,
        "family": CT_FAMILY,
        "dir": CT_DIRECTION
}}
CT_FAMILY := "ip" | "ip6"
CT_DIRECTION := "original" | "reply"

ایجاد ارجاع به داده‌های ردیابی اتصال (conntrack) بسته.

برخی از کلیدهای CT از جهت (direction) پشتیبانی نمی‌کنند. در این حالت، dir نباید داده شود.

{ "numgen": {
        "mode": NG_MODE,
        "mod": NUMBER,
        "offset": NUMBER
}}
NG_MODE := "inc" | "random"

ایجاد یک تولیدکننده عدد (number generator).

ویژگی offset اختیاری است و مقدار پیش‌فرض آن 0 می‌باشد.

{ "jhash": {
        "mod": NUMBER,
        "offset": NUMBER,
        "expr": EXPRESSION,
        "seed": NUMBER
}}
{ "symhash": {
        "mod": NUMBER,
        "offset": NUMBER
}}

درهم‌سازی (هش کردن) داده‌های بسته.

ویژگی‌های offset و seed اختیاری هستند و پیش‌فرض آن‌ها 0 است.

{ "fib": {
        "result": FIB_RESULT,
        "flags": FIB_FLAGS
}}
FIB_RESULT := "oif" | "oifname" | "type"
FIB_FLAGS := FIB_FLAG | [ FIB_FLAG_LIST ]
FIB_FLAG_LIST := FIB_FLAG [, FIB_FLAG_LIST ]
FIB_FLAG := "saddr" | "daddr" | "mark" | "iif" | "oif"

انجام جستجو در پایگاه اطلاعات هدایت کرنل (FIB - Forwarding Information Base).

{ "|": [ EXPRESSION, EXPRESSIONS ] }
{ "^": [ EXPRESSION, EXPRESSIONS ] }
{ "&": [ EXPRESSION, EXPRESSIONS ] }
{ "<<": [ EXPRESSION, EXPRESSIONS ] }
{ ">>": [ EXPRESSION, EXPRESSIONS ] }
EXPRESSIONS := EXPRESSION | EXPRESSION, EXPRESSIONS

تمام عملیات دودویی نیازمند آرایه‌ای شامل حداقل دو عبارت هستند که عنصر اول نشان‌دهنده سمت چپ و عنصر دوم نشان‌دهنده سمت راست است. عناصر اضافی در آرایه ارائه‌شده پذیرفته می‌شوند و به همان ترتیب به عبارت الحاق می‌گردند.

{ "accept": null }
{ "drop": null }
{ "continue": null }
{ "return": null }
{ "jump": { "target": STRING }}
{ "goto": { "target": STRING }}

مشابه گزاره verdict است، اما برای استفاده در نگاشت‌های حکم (verdict maps).

حکم‌های jump و goto به نام زنجیره مقصد نیاز دارند.

{ "elem": {
        "val": EXPRESSION,
        "timeout": NUMBER,
        "expires": NUMBER,
        "comment": STRING
}}

شیء عنصر صریح، در صورتی که ویژگی‌های timeout، expires یا comment مورد نظر باشند. در غیر این صورت، می‌توان آن را با مقدار val جایگزین کرد.

{ "socket": {
        "key": SOCKET_KEY
}}
SOCKET_KEY := "transparent"

ایجاد ارجاع به سوکت بسته.

{ "osf": {
        "key": OSF_KEY,
        "ttl": OSF_TTL
}}
OSF_KEY := "name"
OSF_TTL := "loose" | "skip"

انجام انگشت‌نگاری سیستم‌عامل (OS fingerprinting). این عبارت معمولاً در سمت چپ یک گزاره match استفاده می‌شود.

key

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

ttl

تعیین نحوه تطبیق مقدار TTL بسته. این ویژگی اختیاری است. در صورت حذف، مقدار TTL باید دقیقاً مطابقت داشته باشد. مقدار loose مقادیر TTL کمتر از مقدار انگشت‌نگاری را می‌پذیرد. مقدار skip مقایسه مقدار TTL را به طور کامل نادیده می‌گیرد.

Phil Sutter <phil@nwl.cc>

نویسنده.
09/01/2026