LIBNFTABLES-JSON(5)   LIBNFTABLES-JSON(5) نام (NAME) libnftables-json - رابط ساختاریافته JSON برای مدیریت قوانین فایروال nftables خلاصه دستور (SYNOPSIS) { "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 توضیحات (DESCRIPTION) کتابخانه libnftables از ورودی و خروجی در قالب JSON پشتیبانی می‌کند. این قابلیت به عنوان یک پیشانه (frontend) جایگزین برای تجزیه‌کننده نحو استاندارد CLI پیاده‌سازی شده است، بنابراین رفتار پایه‌ای کاملاً یکسان بوده و تقریباً برای هر عملیاتی که در نحو استاندارد در دسترس است، یک معادل در نحو JSON وجود دارد. ورودی JSON می‌تواند در قالب یک رشته تکی به عنوان پارامتر به تابع nft_run_cmd_from_buffer() داده شود یا در فایلی قرار گیرد که با پارامتر filename در تابع nft_run_cmd_from_filename() مشخص می‌شود. خروجی JSON باید از طریق تابع nft_ctx_output_set_json() فعال شود که خروجی استاندارد کتابخانه را به قالب JSON تبدیل می‌کند. خروجی خطاها تحت تأثیر این تنظیم قرار نمی‌گیرد و دست‌نخورده می‌ماند. ساختار کلی (GLOBAL STRUCTURE) به طور کلی، هر ورودی یا خروجی JSON درون شیئی قرار دارد که شامل یک ویژگی منفرد به نام nftables است. مقدار این ویژگی آرایه‌ای شامل دستورها (برای ورودی) یا عناصر مجموعه قوانین (ruleset) (برای خروجی) می‌باشد. یک دستور، شیئی با یک ویژگی منفرد است که نام آن نوع دستور را مشخص می‌کند. مقدار آن یک عنصر از مجموعه قوانین است - که اساساً با عناصر خروجی یکسان است، به جز ویژگی‌های خاصی که ممکن است به شکل متفاوتی تفسیر شوند یا در ورودی الزامی باشند در حالی که خروجی به طور معمول آن‌ها را حذف می‌کند. شیء متاداده (METAINFO OBJECT) در خروجی، اولین شیء در آرایه nftables یک شیء ویژه حاوی اطلاعات کتابخانه است. محتوای آن به صورت زیر است: { "metainfo": { "version": STRING, "release_name": STRING, "json_schema_version": NUMBER }} مقادیر ویژگی‌های version و release_name برابر با نسخه بسته و نام انتشار همان‌طور که توسط دستور nft -v چاپ می‌شود است. مقدار ویژگی json_schema_version یک عدد صحیح است که نسخه شِمای JSON را نشان می‌دهد. اگر در ورودی کتابخانه ارائه شود، تجزیه‌کننده بررسی می‌کند که مقدار json_schema_version از نسخه کدگذاری‌شده درون کتابخانه فراتر نرود (تا اطمینان حاصل شود که شِمای ارائه‌شده کاملاً پشتیبانی می‌شود). در آینده، عددی کمتر از مقدار داخلی ممکن است حالت سازگاری را فعال کند تا ورودی‌های قدیمی و ناسازگار JSON را پردازش نماید. اشیای دستور (COMMAND OBJECTS) این ساختار تعداد دلخواهی از دستورها را می‌پذیرد که به ترتیب ظاهر شدن تفسیر می‌شوند. برای نمونه، ورودی با نحو استاندارد زیر: 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": ADD_OBJECT } ADD_OBJECT := TABLE | CHAIN | RULE | SET | MAP | ELEMENT | FLOWTABLE | COUNTER | QUOTA | CT_HELPER | LIMIT | CT_TIMEOUT | CT_EXPECTATION افزودن یک عنصر جدید از مجموعه قوانین به کرنل. برای قوانین، این دستور به طور پیش‌فرض قانون را به انتهای زنجیره اضافه می‌کند. اگر قانون حاوی ویژگی handle یا index باشد، پس از قانونی که توسط این ویژگی‌ها مشخص شده درج می‌شود. REPLACE { "replace": RULE } جایگزینی یک قانون. در RULE، ویژگی handle الزامی است و قانونی را که باید جایگزین شود مشخص می‌کند. CREATE { "create": ADD_OBJECT } مشابه دستور add است، اما اگر شیء از قبل وجود داشته باشد خطا برمی‌گرداند. INSERT { "insert": RULE } این دستور برای قوانین مشابه add است، اما به جای الحاق قانون به انتهای زنجیره، آن را در موقعیت اول درج می‌کند. اگر ویژگی handle یا index داده شده باشد، قانون قبل از قانونی که با این ویژگی‌ها مشخص شده درج می‌گردد. نکته در دستورهای صریح (add، insert، create با پوشش دستور)، فیلد handle برای موقعیت‌یابی استفاده می‌شود. در دستورهای ضمنی (اشیای خام rule بدون پوشش دستور، مانند آنچه در صدور/ورود استفاده می‌شود)، فیلد handle برای تضمین سازگاری در سیستم‌های مختلف نادیده گرفته می‌شود. DELETE { "delete": ADD_OBJECT } حذف یک شیء از مجموعه قوانین. به طور معمول در ADD_OBJECT تنها حداقل تعداد ویژگی‌های لازم برای شناسایی یکتای شیء مورد نیاز است. برای بیشتر عناصر مجموعه قوانین، این ویژگی‌ها شامل family و table به همراه handle یا name است (به جز قوانین، زیرا نام ندارند). LIST { "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": RESET_OBJECT } RESET_OBJECT := COUNTER | COUNTERS | QUOTA | QUOTAS | RULE | RULES | SET | MAP | ELEMENT بازنشانی وضعیت در اشیای سازگار، یعنی صفر کردن شمارنده داخلی آن‌ها. FLUSH { "flush": FLUSH_OBJECT } FLUSH_OBJECT := TABLE | CHAIN | SET | MAP | METER | RULESET خالی کردن محتوای شیء داده‌شده، به عنوان مثال حذف همه زنجیره‌ها از یک table مشخص یا حذف همه عناصر از یک set داده‌شده. RENAME { "rename": CHAIN } تغییر نام یک زنجیره. نام جدید در ویژگی اختصاصی با نام newname انتظار می‌رود. عناصر مجموعه قوانین (RULESET ELEMENTS) RULESET { "ruleset": RULSET_PROPERTIES } RULESET_PROPERTIES := null | { "family": STRING } این یک شیء ویژه برای استفاده با دستورهای list و flush است که روی کل مجموعه قوانین یا بخش‌هایی از آن که متعلق به خانواده داده‌شده هستند اعمال می‌شود. TABLE { "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 { "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 { "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 / MAP { "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 { "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 { "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 { "counter": { "family": STRING, "table": STRING, "name": STRING, "handle": NUMBER, "packets": NUMBER, "bytes": NUMBER }} این شیء یک شمارنده (counter) نام‌گذاری‌شده را نشان می‌دهد. family خانواده جدول. table نام جدول. name نام شمارنده. handle دستگیره شمارنده. در ورودی، تنها توسط دستور delete استفاده می‌شود. packets مقدار شمارنده بسته‌ها. bytes مقدار شمارنده بایت‌ها. QUOTA { "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 { "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 { "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 { "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 { "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) گزاره‌ها (statements) بلوک‌های سازنده قوانین هستند. هر قانون حداقل از یک گزاره تشکیل شده است. VERDICT { "accept": null } { "drop": null } { "continue": null } { "return": null } { "jump": { "target": * STRING *}} { "goto": { "target": * STRING *}} یک حکم (verdict) یا عبور بسته از زنجیره فعلی را خاتمه می‌دهد یا آن را به زنجیره دیگری واگذار می‌کند. گزاره‌های jump و goto به نام زنجیره مقصد نیاز دارند. MATCH { "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 { "counter": { "packets": NUMBER, "bytes": NUMBER }} { "counter": STRING } این شیء یک شمارنده بایت/بسته را نشان می‌دهد. در ورودی، هیچ ویژگی‌ای الزامی نیست. در صورت ارائه، به عنوان مقادیر اولیه برای شمارنده عمل می‌کنند. فرم اول یک شمارنده ناشناس ایجاد می‌کند که درون قانونی که در آن ظاهر شده زندگی می‌کند. فرم دوم ارجاعی به یک شیء شمارنده نام‌گذاری‌شده را مشخص می‌نماید. packets بسته‌های شمارش‌شده. bytes بایت‌های شمارش‌شده. MANGLE { "mangle": { "key": EXPRESSION, "value": EXPRESSION }} این گزاره داده‌های بسته یا اطلاعات فراداده (meta info) آن را تغییر می‌دهد. key داده بسته‌ای که باید تغییر کند، ارائه‌شده به عنوان یک عبارت exthdr، payload، meta، ct یا ct helper. value مقدار جدید برای تغییر داده‌ها. QUOTA { "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 { "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 { "fwd": { "dev": EXPRESSION, "family": FWD_FAMILY, "addr": EXPRESSION }} FWD_FAMILY := "ip" | "ip6" هدایت بسته به مقصدی متفاوت. dev رابطی که بسته باید روی آن هدایت شود. family خانواده addr. addr آدرس IP(v6) که بسته باید به آن هدایت شود. هر دو ویژگی family و addr اختیاری هستند، اما اگر حداقل یکی از آن‌ها داده شود، هر دو باید وجود داشته باشند. NOTRACK { "notrack": null } غیرفعال کردن ردیابی اتصال (connection tracking) برای بسته. DUP { "dup": { "addr": EXPRESSION, "dev": EXPRESSION }} تکثیر یک بسته به مقصدی متفاوت. addr آدرسی که بسته باید به آن تکثیر شود. dev رابطی که بسته باید روی آن تکثیر شود. می‌توان آن را حذف کرد تا رابط به طور صریح مشخص نشود. ترجمه نشانی شبکه (NETWORK ADDRESS TRANSLATION) { "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 { "reject": { "type": STRING, "expr": EXPRESSION }} رد کردن بسته و ارسال پاسخ خطای مشخص‌شده. type نوع رد کردن، یکی از مقادیر "tcp reset"، "icmpx"، "icmp" یا "icmpv6". expr کد ICMP که بسته با آن رد می‌شود. همه ویژگی‌ها اختیاری هستند. SET { "set": { "op": STRING, "elem": EXPRESSION, "set": STRING }} افزودن یا به‌روزرسانی پویای عناصر در یک مجموعه. op عملگر روی مجموعه، یکی از مقادیر "add" یا "update". elem عنصر مجموعه برای افزودن یا به‌روزرسانی. set ارجاع به مجموعه. LOG { "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 { "ct helper": EXPRESSION } فعال کردن دستیار conntrack مشخص‌شده برای این بسته. ct helper ارجاع به ct helper. METER { "meter": { "name": STRING, "key": EXPRESSION, "stmt": STATEMENT }} اعمال یک گزاره مشخص با استفاده از یک سنجش‌گر (meter). name نام meter. key کلید meter. stmt گزاره meter. QUEUE { "queue": { "num": EXPRESSION, "flags": FLAGS }} FLAGS := FLAG | [ FLAG_LIST ] FLAG_LIST := FLAG [, FLAG_LIST ] FLAG := "bypass" | "fanout" ارسال بسته به صف در فضای کاربری (userspace). num شماره صف. flags پرچم‌های صف. VERDICT MAP { "vmap": { "key": EXPRESSION, "data": EXPRESSION }} اعمال شرطی یک حکم (verdict). key کلید نگاشت. data عبارت نگاشت شامل جفت‌های مقدار/حکم. CT COUNT { "ct count": { "val": NUMBER, "inv": BOOLEAN }} محدود کردن تعداد اتصالات با استفاده از conntrack. val آستانه تعداد اتصالات. inv در صورت مقدار true، اگر از val فراتر رود مطابقت داده می‌شود. در صورت عدم ذکر، پیش‌فرض false است. CT TIMEOUT { "ct timeout": EXPRESSION } اختصاص سیاست مهلت زمانی ردیابی اتصال (conntrack timeout policy). ct timeout ارجاع به CT timeout. CT EXPECTATION { "ct expectation": EXPRESSION } اختصاص انتظار ردیابی اتصال (conntrack expectation). ct expectation ارجاع به CT expectation. XT { "xt": { "type": TYPENAME, "name": STRING }} TYPENAME := match | target | watcher این گزاره نمایانگر یک گزاره xt از رابط سازگاری xtables است. این یک سازوکار جایگزین (fallback) برای مواقعی است که ترجمه در دسترس نبوده یا کامل نیست. مشاهده این ساختار به این معنی است که مجموعه قوانین (یا بخش‌هایی از آن) توسط iptables-nft ایجاد شده‌اند و باید از همان ابزار برای مدیریت آن استفاده شود. هشدار: ابزار nftables این گزاره‌ها را بازیابی نخواهد کرد. عبارت‌ها (EXPRESSIONS) عبارت‌ها (expressions) بلوک‌های سازنده (اکثر) گزاره‌ها هستند. در پایه‌ای‌ترین شکل، آن‌ها صرفاً مقادیر بی‌واسطه‌ای هستند که به صورت نوع رشته‌ای، عددی یا بولی در JSON نمایش داده می‌شوند. IMMEDIATES STRING NUMBER BOOLEAN عبارت‌های بی‌واسطه (immediate) معمولاً برای مقادیر ثابت استفاده می‌شوند. برای رشته‌ها، دو حالت خاص وجود دارد: @STRING بخش باقی‌مانده به عنوان نام مجموعه برای ایجاد ارجاع به مجموعه در نظر گرفته می‌شود. \* ساخت یک عبارت نویسه عمومی (wildcard). LISTS ARRAY عبارت‌های فهرستی توسط آرایه‌های معمولی شامل تعداد دلخواهی از عبارت‌ها ساخته می‌شوند. CONCAT { "concat": CONCAT } CONCAT := [ EXPRESSION_LIST ] EXPRESSION_LIST := EXPRESSION [, EXPRESSION_LIST ] الحاق چندین عبارت به یکدیگر. SET { "set": SET } SET := EXPRESSION | [ EXPRESSION_LIST ] این شیء یک مجموعه ناشناس می‌سازد. برای نگاشت‌ها، آرایه‌ای از آرایه‌ها با دقیقاً دو عنصر انتظار می‌رود. MAP { "map": { "key": EXPRESSION, "data": EXPRESSION }} نگاشت یک کلید به یک مقدار. key کلید نگاشت. data عبارت نگاشت شامل جفت‌های مقدار/مقصد. PREFIX { "prefix": { "addr": EXPRESSION, "len": NUMBER }} ساخت یک پیشوند IPv4 یا IPv6 شامل بخش نشانی در addr و طول پیشوند در len. RANGE { "range": [ EXPRESSION , EXPRESSION ] } ساخت بازه‌ای از مقادیر. عنصر اول آرایه نشان‌دهنده کران پایین و عنصر دوم نشان‌دهنده کران بالا است. PAYLOAD { "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 { "exthdr": { "name": STRING, "field": STRING, "offset": NUMBER }} ایجاد ارجاع به یک فیلد (field) در یک هدر توسعه IPv6 با نام (name). مقدار offset تنها برای پروتکل rt0 استفاده می‌شود. اگر ویژگی field داده نشود، این عبارت به عنوان بررسی وجود هدر در گزاره match به همراه مقدار بولی در سمت راست استفاده می‌شود. TCP OPTION { "tcp option": { "name": STRING, "field": STRING }} ایجاد ارجاع به یک فیلد (field) از یک هدر گزینه TCP با نام (name). اگر ویژگی field داده نشود، عبارت به عنوان بررسی وجود گزینه TCP در یک گزاره match به همراه یک مقدار بولی در سمت راست استفاده می‌شود. SCTP CHUNK { "sctp chunk": { "name": STRING, "field": STRING }} ایجاد ارجاع به یک فیلد (field) از یک قطعه (chunk) پروتکل SCTP با نام (name). اگر ویژگی field داده نشود، عبارت به عنوان بررسی وجود قطعه SCTP در یک گزاره match به همراه یک مقدار بولی در سمت راست استفاده می‌شود. DCCP OPTION { "dccp option": { "type": NUMBER* }} ایجاد ارجاع به یک گزینه DCCP بر اساس (type). این عبارت به عنوان بررسی وجود گزینه DCCP در یک گزاره match با یک مقدار بولی در سمت راست استفاده می‌شود. META { "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 { "rt": { "key": RT_KEY, "family": RT_FAMILY }} RT_KEY := "classid" | "nexthop" | "mtu" RT_FAMILY := "ip" | "ip6" ایجاد ارجاع به داده‌های مسیریابی (routing data) بسته. ویژگی family اختیاری است و به طور پیش‌فرض نامشخص رها می‌شود. CT { "ct": { "key": STRING, "family": CT_FAMILY, "dir": CT_DIRECTION }} CT_FAMILY := "ip" | "ip6" CT_DIRECTION := "original" | "reply" ایجاد ارجاع به داده‌های ردیابی اتصال (conntrack) بسته. برخی از کلیدهای CT از جهت (direction) پشتیبانی نمی‌کنند. در این حالت، dir نباید داده شود. NUMGEN { "numgen": { "mode": NG_MODE, "mod": NUMBER, "offset": NUMBER }} NG_MODE := "inc" | "random" ایجاد یک تولیدکننده عدد (number generator). ویژگی offset اختیاری است و مقدار پیش‌فرض آن 0 می‌باشد. HASH { "jhash": { "mod": NUMBER, "offset": NUMBER, "expr": EXPRESSION, "seed": NUMBER }} { "symhash": { "mod": NUMBER, "offset": NUMBER }} درهم‌سازی (هش کردن) داده‌های بسته. ویژگی‌های offset و seed اختیاری هستند و پیش‌فرض آن‌ها 0 است. FIB { "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). عملیات دودویی (BINARY OPERATION) { "|": [ EXPRESSION, EXPRESSIONS ] } { "^": [ EXPRESSION, EXPRESSIONS ] } { "&": [ EXPRESSION, EXPRESSIONS ] } { "<<": [ EXPRESSION, EXPRESSIONS ] } { ">>": [ EXPRESSION, EXPRESSIONS ] } EXPRESSIONS := EXPRESSION | EXPRESSION, EXPRESSIONS تمام عملیات دودویی نیازمند آرایه‌ای شامل حداقل دو عبارت هستند که عنصر اول نشان‌دهنده سمت چپ و عنصر دوم نشان‌دهنده سمت راست است. عناصر اضافی در آرایه ارائه‌شده پذیرفته می‌شوند و به همان ترتیب به عبارت الحاق می‌گردند. VERDICT { "accept": null } { "drop": null } { "continue": null } { "return": null } { "jump": { "target": STRING }} { "goto": { "target": STRING }} مشابه گزاره verdict است، اما برای استفاده در نگاشت‌های حکم (verdict maps). حکم‌های jump و goto به نام زنجیره مقصد نیاز دارند. ELEM { "elem": { "val": EXPRESSION, "timeout": NUMBER, "expires": NUMBER, "comment": STRING }} شیء عنصر صریح، در صورتی که ویژگی‌های timeout، expires یا comment مورد نظر باشند. در غیر این صورت، می‌توان آن را با مقدار val جایگزین کرد. SOCKET { "socket": { "key": SOCKET_KEY }} SOCKET_KEY := "transparent" ایجاد ارجاع به سوکت بسته. OSF { "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 را به طور کامل نادیده می‌گیرد. نویسنده (AUTHOR) Phil Sutter نویسنده.   09/01/2026 LIBNFTABLES-JSON(5)