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) : o RHS : LHS & RHS != 0. o . 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)