*"list"* | *"reset"* | *"flush"* | *"rename"*
'LIST_OBJECT' := 'TABLE' | 'CHAIN' | 'RULE' | 'SET' | 'MAP' | 'ELEMENT' |
-'FLOWTABLE' | 'COUNTER' | 'QUOTA' | 'CT_HELPER' | 'LIMIT'
-
-'TABLE' := *{ "table":* 'TABLE_PROPERTIES' *}*
-
-'TABLE_PROPERTIES' := 'TABLE_PROPERTY' [ *,* 'TABLE_PROPERTIES' ]
-
-'TABLE_PROPERTY' := 'FAMILY' | 'NAME' | 'HANDLE'
-
-'FAMILY' := *"family":* 'FAMILY_VALUE'
-
-'FAMILY_VALUE' := *"ip"* | *"ip6"* | *"inet"* | *"bridge"* | *"arp"*
-
-'NAME' := *"name":* 'STRING'
-
-'HANDLE' := *"handle":* 'NUMBER'
+ 'FLOWTABLE' | 'COUNTER' | 'QUOTA' | 'CT_HELPER' | 'LIMIT'
== DESCRIPTION
libnftables supports JSON formatted input and output. This is implemented as an
=== TABLE
[verse]
-*{ "table":
+*{ "table": {
"family":* 'STRING'*,
"name":* 'STRING'*,
"handle":* 'NUMBER'
-*}*
+*}}*
This object describes a table.
=== CHAIN
[verse]
-*{ "chain":
+*{ "chain": {
"family":* 'STRING'*,
"table":* 'STRING'*,
"name":* 'STRING'*,
"prio":* 'NUMBER'*,
"dev":* 'STRING'*,
"policy":* 'STRING'
-*}*
+*}}*
This object describes a chain.
=== RULE
[verse]
____
-*{ "rule":
+*{ "rule": {
"family":* 'STRING'*,
"table":* 'STRING'*,
"chain":* 'STRING'*,
"handle":* 'NUMBER'*,
"index":* 'NUMBER'*,
"comment":* 'STRING'
-*}*
+*}}*
'STATEMENTS' := 'STATEMENT' [*,* 'STATEMENTS' ]
____
=== SET / MAP
[verse]
____
-*{ "set":
+*{ "set": {
"family":* 'STRING'*,
"table":* 'STRING'*,
"name":* 'STRING'*,
"timeout":* 'NUMBER'*,
"gc-interval":* 'NUMBER'*,
"size":* 'NUMBER'
-*}*
+*}}*
-*{ "map":
+*{ "map": {
"family":* 'STRING'*,
"table":* 'STRING'*,
"name":* 'STRING'*,
"timeout":* 'NUMBER'*,
"gc-interval":* 'NUMBER'*,
"size":* 'NUMBER'
-*}*
+*}}*
'SET_TYPE' := 'STRING' | *[* 'SET_TYPE_LIST' *]*
'SET_TYPE_LIST' := 'STRING' [*,* 'SET_TYPE_LIST' ]
=== ELEMENT
[verse]
____
-*{ "element":
+*{ "element": {
"family":* 'STRING'*,
"table":* 'STRING'*,
"name":* 'STRING'*,
"elem":* 'SET_ELEM'
-*}*
+*}}*
'SET_ELEM' := 'EXPRESSION' | *[* 'EXPRESSION_LIST' *]*
'EXPRESSION_LIST' := 'EXPRESSION' [*,* 'EXPRESSION' ]
=== FLOWTABLE
[verse]
____
-*{ "flowtable":
+*{ "flowtable": {
"family":* 'STRING'*,
"table":* 'STRING'*,
"name":* 'STRING'*,
"hook":* 'STRING'*,
"prio":* 'NUMBER'*,
"dev":* 'FT_INTERFACE'
-*}*
+*}}*
'FT_INTERFACE' := 'STRING' | *[* 'FT_INTERFACE_LIST' *]*
'FT_INTERFACE_LIST' := 'STRING' [*,* 'STRING' ]
=== COUNTER
[verse]
-*{ "counter":
+*{ "counter": {
"family":* 'STRING'*,
"table":* 'STRING'*,
"name":* 'STRING'*,
"handle":* 'NUMBER'*,
"packets":* 'NUMBER'*,
"bytes":* 'NUMBER'
-*}*
+*}}*
This object represents a named counter.
=== QUOTA
[verse]
-*{ "quota":
+*{ "quota": {
"family":* 'STRING'*,
"table":* 'STRING'*,
"name":* 'STRING'*,
"bytes":* 'NUMBER'*,
"used":* 'NUMBER'*,
"inv":* 'BOOLEAN'
-*}*
+*}}*
This object represents a named quota.
=== CT HELPER
[verse]
____
-*{ "ct helper":
+*{ "ct helper": {
"family":* 'STRING'*,
"table":* 'STRING'*,
"name":* 'STRING'*,
"type":* 'STRING'*,
"protocol":* 'CTH_PROTO'*,
"l3proto":* 'STRING'
-*}*
+*}}*
'CTH_PROTO' := *"tcp"* | *"udp"*
____
=== LIMIT
[verse]
____
-*{ "limit":
+*{ "limit": {
"family":* 'STRING'*,
"table":* 'STRING'*,
"name":* 'STRING'*,
"burst":* 'NUMBER'*,
"unit":* 'LIMIT_UNIT'*,
"inv":* 'BOOLEAN'
-*}*
+*}}*
'LIMIT_UNIT' := *"packets"* | *"bytes"*
____
=== MATCH
[verse]
-*{ "match":
+*{ "match": {
"left":* 'EXPRESSION'*,
"right":* 'EXPRESSION'*,
"op":* 'STRING'
-*}*
+*}}*
Match expression on left hand side (typically a packet header or packet meta
info) with expression on right hand side (typically a constant value). If the
=== COUNTER
[verse]
____
-*{ "counter":
+*{ "counter": {
"packets":* 'NUMBER'*,
"bytes":* 'NUMBER'
-*}*
+*}}*
*{ "counter":* 'STRING' *}*
____
=== MANGLE
[verse]
-*{ "mangle":
+*{ "mangle": {
"left":* 'EXPRESSION'*,
"right":* 'EXPRESSION'
-*}*
+*}}*
Change packet data or meta info.
=== QUOTA
[verse]
____
-*{ "quota":
+*{ "quota": {
"val":* 'NUMBER'*,
"val_unit":* 'STRING'*,
"used":* 'NUMBER'*,
"used_unit":* 'STRING'*,
"inv":* 'BOOLEAN'
-*}*
+*}}*
*{ "quota":* 'STRING' *}*
____
=== LIMIT
[verse]
____
-*{ "limit":
+*{ "limit": {
"rate":* 'NUMBER'*,
"rate_unit":* 'STRING'*,
"per":* 'STRING'*,
"burst":* 'NUMBER'*,
"burst_unit":* 'STRING'*,
"inv":* 'BOOLEAN'
-*}*
+*}}*
*{ "limit":* 'STRING' *}*
____
=== FWD
[verse]
____
-*{ "fwd":
+*{ "fwd": {
"dev":* 'EXPRESSION'*,
"family":* 'FWD_FAMILY'*,
"addr":* 'EXPRESSION'
-*}*
+*}}*
'FWD_FAMILY' := *"ip"* | *"ip6"*
____
=== DUP
[verse]
-*{ "dup":
+*{ "dup": {
"addr":* 'EXPRESSION'*,
"dev":* 'EXPRESSION'
-*}*
+*}}*
Duplicate a packet to a different destination.
=== NETWORK ADDRESS TRANSLATION
[verse]
____
-*{ "snat":
+*{ "snat": {
"addr":* 'EXPRESSION'*,
"port":* 'EXPRESSION'*,
"flags":* 'FLAGS'
-*}*
+*}}*
-*{ "dnat":
+*{ "dnat": {
"addr":* 'EXPRESSION'*,
"port":* 'EXPRESSION'*,
"flags":* 'FLAGS'
-*}*
+*}}*
-*{ "masquerade":
+*{ "masquerade": {
"port":* 'EXPRESSION'*,
"flags":* 'FLAGS'
-*}*
+*}}*
-*{ "redirect":
+*{ "redirect": {
"port":* 'EXPRESSION'*,
"flags":* 'FLAGS'
-*}*
+*}}*
'FLAGS' := 'FLAG' | *[* 'FLAG_LIST' *]*
'FLAG_LIST' := 'FLAG' [*,* 'FLAG_LIST' ]
=== REJECT
[verse]
-*{ "reject":
+*{ "reject": {
"type":* 'STRING'*,
"expr":* 'EXPRESSION'
-*}*
+*}}*
Reject the packet and send the given error reply.
=== SET
[verse]
-*{ "set":
+*{ "set": {
"op":* 'STRING'*,
"elem":* 'EXPRESSION'*,
"set":* 'STRING'
-*}*
+*}}*
Dynamically add/update elements to a set.
=== LOG
[verse]
____
-*{ "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"*
=== METER
[verse]
-*{ "meter":
+*{ "meter": {
"name":* 'STRING'*,
"key":* 'EXPRESSION'*,
"stmt":* 'STATEMENT'
-*}*
+*}}*
Apply given statement using a meter.
=== QUEUE
[verse]
____
-*{ "queue":
+*{ "queue": {
"num":* 'EXPRESSION'*,
"flags":* 'FLAGS'
-*}*
+*}}*
'FLAGS' := 'FLAG' | *[* 'FLAG_LIST' *]*
'FLAG_LIST' := 'FLAG' [*,* 'FLAG_LIST' ]
=== VERDICT MAP
[verse]
-*{ "vmap":
+*{ "vmap": {
"left":* 'EXPRESSION'*,
"right":* 'EXPRESSION'
-*}*
+*}}*
Apply a verdict conditionally.
=== CT COUNT
[verse]
-*{ "ct count":
+*{ "ct count": {
"val":* 'NUMBER'*,
"inv":* 'BOOLEAN'
-*}*
+*}}*
Limit number of connections using conntrack.
=== MAP
[verse]
-*{ "map":
+*{ "map": {
"left":* 'EXPRESSION'*,
"right":* 'EXPRESSION'
-*}*
+*}}*
Map a key to a value.
=== PREFIX
[verse]
-*{ "prefix":
+*{ "prefix": {
"addr":* 'EXPRESSION'*,
"len":* 'NUMBER'
-*}*
+*}}*
Construct an IPv4 or IPv6 prefix consisting of address part in *addr* and prefix
length in *len*.
=== PAYLOAD
[verse]
____
-*{ "payload":
+*{ "payload": {
"name": "raw",
"base":* 'BASE'*,
"offset":* 'NUMBER'*,
"len":* 'NUMBER'
-*}*
+*}}*
-*{ "payload":
+*{ "payload": {
"name":* 'STRING'*,
"field":* 'STRING'
-*}*
+*}}*
'BASE' := *"ll"* | *"nh"* | *"th"*
____
=== EXTHDR
[verse]
-*{ "exthdr":
+*{ "exthdr": {
"name":* 'STRING'*,
"field":* 'STRING'*,
"offset":* 'NUMBER'
-*}*
+*}}*
Create a reference to a field (*field*) in an IPv6 extension header (*name*).
*offset* is used only for *rt0* protocol.
=== TCP OPTION
[verse]
-*{ "tcp option":
+*{ "tcp option": {
"name":* 'STRING'*,
"field":* 'STRING'
-*}*
+*}}*
Create a reference to a field (*field*) of a TCP option header (*name*).
=== RT
[verse]
____
-*{ "rt":
+*{ "rt": {
"key":* 'RT_KEY'*,
"family":* 'RT_FAMILY'
-*}*
+*}}*
'RT_KEY' := *"classid"* | *"nexthop"* | *"mtu"*
'RT_FAMILY' := *"ip"* | *"ip6"*
=== CT
[verse]
____
-*{ "ct":
+*{ "ct": {
"key":* 'STRING'*,
"family":* 'CT_FAMILY'*,
"dir":* 'CT_DIRECTION'
-*}*
+*}}*
'CT_FAMILY' := *"ip"* | *"ip6"*
'CT_DIRECTION' := *"original"* | *"reply"*
=== NUMGEN
[verse]
____
-*{ "numgen":
+*{ "numgen": {
"mode":* 'NG_MODE'*,
"mod":* 'NUMBER'*,
"offset":* 'NUMBER'
-*}*
+*}}*
'NG_MODE' := *"inc"* | *"random"*
____
=== HASH
[verse]
____
-*{ "jhash":
+*{ "jhash": {
"mod":* 'NUMBER'*,
"offset":* 'NUMBER'*,
"expr":* 'EXPRESSION'*,
"seed":* 'NUMBER'
-*}*
+*}}*
-*{ "symhash":
+*{ "symhash": {
"mod":* 'NUMBER'*,
"offset":* 'NUMBER'
-*}*
+*}}*
____
Hash packet data.
=== FIB
[verse]
____
-*{ "fib":
+*{ "fib": {
"result":* 'FIB_RESULT'*,
"flags":* 'FIB_FLAGS'
-*}*
+*}}*
'FIB_RESULT' := *"oif"* | *"oifname"* | *"type"*
=== ELEM
[verse]
-*{ "elem":
+*{ "elem": {
"val":* 'EXPRESSION'*,
"timeout":* 'NUMBER'*,
"expires":* 'NUMBER'*,
"comment":* 'STRING'
-*}*
+*}}*
Explicit set element object, in case *timeout*, *expires* or *comment* are
desired. Otherwise may be replaced by the value of *val*.
=== SOCKET
[verse]
____
-*{ "socket":
+*{ "socket": {
"key":* 'SOCKET_KEY'
-*}*
+*}}*
'SOCKET_KEY' := *"transparent"*
____