| 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
name
handle
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
newname
ویژگیهای زیر برای زنجیرههای پایه (base chains) الزامی هستند:
type
hook
prio
dev
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
handle
index
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
type
map
policy
flags
elem
timeout
gc-interval
size
count
auto-merge
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
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
hook
prio
dev
COUNTER
{ "counter": {
"family": STRING,
"table": STRING,
"name": STRING,
"handle": NUMBER,
"packets": NUMBER,
"bytes": NUMBER
}}
این شیء یک شمارنده (counter) نامگذاریشده را نشان میدهد.
family
table
name
handle
packets
bytes
QUOTA
{ "quota": {
"family": STRING,
"table": STRING,
"name": STRING,
"handle": NUMBER,
"bytes": NUMBER,
"used": NUMBER,
"inv": BOOLEAN
}}
این شیء یک سهمیه (quota) نامگذاریشده را نشان میدهد.
family
table
name
handle
bytes
used
inv
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
handle
type
protocol
l3proto
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
rate
per
burst
unit
inv
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
handle
protocol
state
value
l3proto
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
handle
l3proto
protocol
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) حل شود:
برای حالت اول غیربدیهی، JSON API از عملگر in پشتیبانی میکند.
COUNTER
{ "counter": {
"packets": NUMBER,
"bytes": NUMBER
}}
{ "counter": STRING }
این شیء یک شمارنده بایت/بسته را نشان میدهد. در ورودی، هیچ ویژگیای الزامی نیست. در صورت ارائه، به عنوان مقادیر اولیه برای شمارنده عمل میکنند.
فرم اول یک شمارنده ناشناس ایجاد میکند که درون قانونی که در آن ظاهر شده زندگی میکند. فرم دوم ارجاعی به یک شیء شمارنده نامگذاریشده را مشخص مینماید.
packets
bytes
MANGLE
{ "mangle": {
"key": EXPRESSION,
"value": EXPRESSION
}}
این گزاره دادههای بسته یا اطلاعات فراداده (meta info) آن را تغییر میدهد.
key
value
QUOTA
{ "quota": {
"val": NUMBER,
"val_unit": STRING,
"used": NUMBER,
"used_unit": STRING,
"inv": BOOLEAN
}}
{ "quota": STRING }
فرم اول یک سهمیه ناشناس ایجاد میکند که در قانونی که در آن ظاهر شده قرار دارد. فرم دوم ارجاعی به یک شیء سهمیه نامگذاریشده را مشخص میکند.
val
val_unit
used
used_unit
inv
LIMIT
{ "limit": {
"rate": NUMBER,
"rate_unit": STRING,
"per": STRING,
"burst": NUMBER,
"burst_unit": STRING,
"inv": BOOLEAN
}}
{ "limit": STRING }
فرم اول یک محدودیت ناشناس ایجاد میکند که درون قانونی که در آن ظاهر شده قرار دارد. فرم دوم ارجاعی به یک شیء محدودیت نامگذاریشده را مشخص میکند.
rate
rate_unit
per
burst
burst_unit
inv
FWD
{ "fwd": {
"dev": EXPRESSION,
"family": FWD_FAMILY,
"addr": EXPRESSION
}}
FWD_FAMILY := "ip" | "ip6"
هدایت بسته به مقصدی متفاوت.
dev
family
addr
هر دو ویژگی 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
port
flags
همه ویژگیها اختیاری هستند و پیشفرض آنها none است.
REJECT
{ "reject": {
"type": STRING,
"expr": EXPRESSION
}}
رد کردن بسته و ارسال پاسخ خطای مشخصشده.
type
expr
همه ویژگیها اختیاری هستند.
SET
{ "set": {
"op": STRING,
"elem": EXPRESSION,
"set": STRING
}}
افزودن یا بهروزرسانی پویای عناصر در یک مجموعه.
op
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
queue-threshold
level
flags
همه ویژگیها اختیاری هستند.
CT HELPER
{ "ct helper": EXPRESSION }
فعال کردن دستیار conntrack مشخصشده برای این بسته.
ct helper
METER
{ "meter": {
"name": STRING,
"key": EXPRESSION,
"stmt": STATEMENT
}}
اعمال یک گزاره مشخص با استفاده از یک سنجشگر (meter).
name
key
stmt
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
CT TIMEOUT
{ "ct timeout": EXPRESSION }
اختصاص سیاست مهلت زمانی ردیابی اتصال (conntrack timeout policy).
ct timeout
CT EXPECTATION
{ "ct expectation": EXPRESSION }
اختصاص انتظار ردیابی اتصال (conntrack 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
\*
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"
"nh"
"th"
فرم دوم امکان ارجاع به یک فیلد را بر اساس نام (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
نویسنده (AUTHOR)
Phil Sutter <phil@nwl.cc>
| 09/01/2026 |