<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.nftables.org/wiki-nftables/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pablo</id>
	<title>nftables wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.nftables.org/wiki-nftables/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pablo"/>
	<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php/Special:Contributions/Pablo"/>
	<updated>2026-04-12T16:24:52Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=1162</id>
		<title>Flowtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=1162"/>
		<updated>2025-04-18T00:53:59Z</updated>

		<summary type="html">&lt;p&gt;Pablo: remove ct state established in flow add rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flowtables allow you to accelerate packet forwarding in software (and in hardware if your NIC supports it) by using a conntrack-based network stack bypass.&lt;br /&gt;
&lt;br /&gt;
Entries are represented through a tuple that is composed of the input interface, source and destination address, source and destination port; and layer 3/4&lt;br /&gt;
protocols. Each entry also caches the destination interface and the gateway address (to update the destination link-layer address) to forward packets.&lt;br /&gt;
&lt;br /&gt;
The TTL and hoplimit fields are also decremented. Hence, flowtables provides an alternative path that allow packets to bypass the classic forwarding path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                         userspace process&lt;br /&gt;
                                          ^              |&lt;br /&gt;
                                          |              |&lt;br /&gt;
                                     _____|____     ____\/___&lt;br /&gt;
                                    /          \   /         \&lt;br /&gt;
                                    |   input  |   |  output |&lt;br /&gt;
                                    \__________/   \_________/&lt;br /&gt;
                                         ^               |&lt;br /&gt;
                                         |               |&lt;br /&gt;
      _________      __________      ---------     _____\/_____&lt;br /&gt;
     /         \    /          \     |Routing |   /            \&lt;br /&gt;
  --&amp;gt;  ingress  ---&amp;gt; prerouting ---&amp;gt; |decision|   | postrouting|--&amp;gt; neigh_xmit&lt;br /&gt;
     \_________/    \__________/     ----------   \____________/          ^&lt;br /&gt;
       |      ^                          |               ^                |&lt;br /&gt;
   flowtable  |                     ____\/___            |                |&lt;br /&gt;
       |      |                    /         \           |                |&lt;br /&gt;
    __\/___   |                    | forward |------------                |&lt;br /&gt;
    |-----|   |                    \_________/                            |&lt;br /&gt;
    |-----|   |                 &#039;flow add&#039; rule                           |&lt;br /&gt;
    |-----|   |                   adds entry to                           |&lt;br /&gt;
    |_____|   |                     flowtable                             |&lt;br /&gt;
       |      |                                                           |&lt;br /&gt;
      / \     |                                                           |&lt;br /&gt;
     /hit\_no_|                                                           |&lt;br /&gt;
     \ ? /                                                                |&lt;br /&gt;
      \ /                                                                 |&lt;br /&gt;
       |__yes_________________fastpath bypass ____________________________|&lt;br /&gt;
&lt;br /&gt;
               Fig.1 Netfilter hooks and flowtable interactions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Flowtables reside in the ingress hook that is located before the prerouting hook. You can select which flows you want to offload through the flow expression from the forward chain. Flowtables are identified by their address [[Nftables_families|family]] and their name. The address family must be one of ip, ip6, or inet. When no address family is specified, ip is used by default.&lt;br /&gt;
&lt;br /&gt;
Flows are offloaded after the state is created. That means that usually the first reply packet will create the flowtable entry.&lt;br /&gt;
A firewall rule to accept the initial traffic is required.&lt;br /&gt;
The flow expression on the forward chain must match the return traffic of the initial connection.&lt;br /&gt;
Be aware that the return route is deducted from the packet, that creates the flowtable entry.&lt;br /&gt;
This also means if you are using special ip rules, you need to make sure that they match the reply packet traffic as well as the original traffic.&lt;br /&gt;
&lt;br /&gt;
The *priority* can be a signed integer or *filter* which stands for 0. Addition and subtraction can be used to set relative priority, e.g. filter + 5 equals to 5.&lt;br /&gt;
&lt;br /&gt;
The *devices* are specified as [[Data_types|iifname]](s) of the input interface(s) of the traffic that should be offloaded. Devices are required for both traffic directions.&lt;br /&gt;
&lt;br /&gt;
An Example to offload HTTP traffic for a router:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define DEV_PRIVATE=eth0&lt;br /&gt;
define DEV_INTERNET=eth1&lt;br /&gt;
&lt;br /&gt;
table inet x {&lt;br /&gt;
&lt;br /&gt;
    flowtable f {&lt;br /&gt;
        hook ingress priority 0&lt;br /&gt;
        devices = { $DEV_PRIVATE, $DEV_INTERNET }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain forward {&lt;br /&gt;
        type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # offload established HTTP connections&lt;br /&gt;
        tcp dport { 80, 443 } flow add @f counter packets 0 bytes 0&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets, drop invalid&lt;br /&gt;
        ct state vmap { established : accept, related : accept, invalid : drop }&lt;br /&gt;
&lt;br /&gt;
        # connections from the internal net to the internet or to other&lt;br /&gt;
        # internal nets are allowed&lt;br /&gt;
        iifname $DEV_PRIVATE counter accept&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that:&lt;br /&gt;
&lt;br /&gt;
# The rule that uses the &#039;&#039;flow add&#039;&#039; statement determines what flows are added to the flowtable. This ruleset above adds entries to the flowtable for established HTTP connections.&lt;br /&gt;
# The devices you specify in the flowtable declaration determine where the flowtable hooks in the pipeline for lookups, in the example above, it registers a hook for devices eth0 and eth1 in the ingress hook at priority 0.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.kernel.org/doc/html/latest/networking/nf_flowtable.html Linux kernel documentation on Netfilter flowtable]&lt;br /&gt;
* [https://netdevconf.info/0x13/session.html?workshop-netfilter-mini Netfilter Mini-Workshop, Netdev 0x13, 2019-03]&lt;br /&gt;
* [https://lwn.net/Articles/804384/ Mellanox flowtable hardware offload]&lt;br /&gt;
* [https://www.programmersought.com/article/11833283913/ Some Mellanox flowtable hardware offload performance measurements by Wen Xu of UCloud]&lt;br /&gt;
* [https://linuxplumbersconf.org/event/4/contributions/463/ Netfilter hardware offloads, Pablo Neira Ayuso, Linux Plumbers Conference, 2019-09]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=1161</id>
		<title>Flowtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=1161"/>
		<updated>2025-04-04T17:37:07Z</updated>

		<summary type="html">&lt;p&gt;Pablo: replace flow offload by flow add&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flowtables allow you to accelerate packet forwarding in software (and in hardware if your NIC supports it) by using a conntrack-based network stack bypass.&lt;br /&gt;
&lt;br /&gt;
Entries are represented through a tuple that is composed of the input interface, source and destination address, source and destination port; and layer 3/4&lt;br /&gt;
protocols. Each entry also caches the destination interface and the gateway address (to update the destination link-layer address) to forward packets.&lt;br /&gt;
&lt;br /&gt;
The TTL and hoplimit fields are also decremented. Hence, flowtables provides an alternative path that allow packets to bypass the classic forwarding path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                         userspace process&lt;br /&gt;
                                          ^              |&lt;br /&gt;
                                          |              |&lt;br /&gt;
                                     _____|____     ____\/___&lt;br /&gt;
                                    /          \   /         \&lt;br /&gt;
                                    |   input  |   |  output |&lt;br /&gt;
                                    \__________/   \_________/&lt;br /&gt;
                                         ^               |&lt;br /&gt;
                                         |               |&lt;br /&gt;
      _________      __________      ---------     _____\/_____&lt;br /&gt;
     /         \    /          \     |Routing |   /            \&lt;br /&gt;
  --&amp;gt;  ingress  ---&amp;gt; prerouting ---&amp;gt; |decision|   | postrouting|--&amp;gt; neigh_xmit&lt;br /&gt;
     \_________/    \__________/     ----------   \____________/          ^&lt;br /&gt;
       |      ^                          |               ^                |&lt;br /&gt;
   flowtable  |                     ____\/___            |                |&lt;br /&gt;
       |      |                    /         \           |                |&lt;br /&gt;
    __\/___   |                    | forward |------------                |&lt;br /&gt;
    |-----|   |                    \_________/                            |&lt;br /&gt;
    |-----|   |                 &#039;flow add&#039; rule                           |&lt;br /&gt;
    |-----|   |                   adds entry to                           |&lt;br /&gt;
    |_____|   |                     flowtable                             |&lt;br /&gt;
       |      |                                                           |&lt;br /&gt;
      / \     |                                                           |&lt;br /&gt;
     /hit\_no_|                                                           |&lt;br /&gt;
     \ ? /                                                                |&lt;br /&gt;
      \ /                                                                 |&lt;br /&gt;
       |__yes_________________fastpath bypass ____________________________|&lt;br /&gt;
&lt;br /&gt;
               Fig.1 Netfilter hooks and flowtable interactions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Flowtables reside in the ingress hook that is located before the prerouting hook. You can select which flows you want to offload through the flow expression from the forward chain. Flowtables are identified by their address [[Nftables_families|family]] and their name. The address family must be one of ip, ip6, or inet. When no address family is specified, ip is used by default.&lt;br /&gt;
&lt;br /&gt;
Flows are offloaded after the state is created. That means that usually the first reply packet will create the flowtable entry.&lt;br /&gt;
A firewall rule to accept the initial traffic is required.&lt;br /&gt;
The flow expression on the forward chain must match the return traffic of the initial connection.&lt;br /&gt;
Be aware that the return route is deducted from the packet, that creates the flowtable entry.&lt;br /&gt;
This also means if you are using special ip rules, you need to make sure that they match the reply packet traffic as well as the original traffic.&lt;br /&gt;
&lt;br /&gt;
The *priority* can be a signed integer or *filter* which stands for 0. Addition and subtraction can be used to set relative priority, e.g. filter + 5 equals to 5.&lt;br /&gt;
&lt;br /&gt;
The *devices* are specified as [[Data_types|iifname]](s) of the input interface(s) of the traffic that should be offloaded. Devices are required for both traffic directions.&lt;br /&gt;
&lt;br /&gt;
An Example to offload HTTP traffic for a router:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define DEV_PRIVATE=eth0&lt;br /&gt;
define DEV_INTERNET=eth1&lt;br /&gt;
&lt;br /&gt;
table inet x {&lt;br /&gt;
&lt;br /&gt;
    flowtable f {&lt;br /&gt;
        hook ingress priority 0&lt;br /&gt;
        devices = { $DEV_PRIVATE, $DEV_INTERNET }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain forward {&lt;br /&gt;
        type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # offload established HTTP connections&lt;br /&gt;
        tcp dport { 80, 443 } ct state established flow add @f counter packets 0 bytes 0&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets, drop invalid&lt;br /&gt;
        ct state vmap { established : accept, related : accept, invalid : drop }&lt;br /&gt;
&lt;br /&gt;
        # connections from the internal net to the internet or to other&lt;br /&gt;
        # internal nets are allowed&lt;br /&gt;
        iifname $DEV_PRIVATE counter accept&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that:&lt;br /&gt;
&lt;br /&gt;
# The rule that uses the &#039;&#039;flow add&#039;&#039; statement determines what flows are added to the flowtable. This ruleset above adds entries to the flowtable for established HTTP connections.&lt;br /&gt;
# The devices you specify in the flowtable declaration determine where the flowtable hooks in the pipeline for lookups, in the example above, it registers a hook for devices eth0 and eth1 in the ingress hook at priority 0.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.kernel.org/doc/html/latest/networking/nf_flowtable.html Linux kernel documentation on Netfilter flowtable]&lt;br /&gt;
* [https://netdevconf.info/0x13/session.html?workshop-netfilter-mini Netfilter Mini-Workshop, Netdev 0x13, 2019-03]&lt;br /&gt;
* [https://lwn.net/Articles/804384/ Mellanox flowtable hardware offload]&lt;br /&gt;
* [https://www.programmersought.com/article/11833283913/ Some Mellanox flowtable hardware offload performance measurements by Wen Xu of UCloud]&lt;br /&gt;
* [https://linuxplumbersconf.org/event/4/contributions/463/ Netfilter hardware offloads, Pablo Neira Ayuso, Linux Plumbers Conference, 2019-09]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Nftables_families&amp;diff=1135</id>
		<title>Nftables families</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Nftables_families&amp;diff=1135"/>
		<updated>2024-05-29T17:13:46Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* inet */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://netfilter.org/ Netfilter] enables filtering at multiple [https://en.wikipedia.org/wiki/Internet_protocol_suite networking levels]. With iptables there is a separate tool for each level: &#039;&#039;iptables&#039;&#039;, &#039;&#039;ip6tables&#039;&#039;, &#039;&#039;arptables&#039;&#039;, &#039;&#039;ebtables&#039;&#039;. With nftables the multiple networking levels are abstracted into &#039;&#039;&#039;families&#039;&#039;&#039;, all of which are served by the single tool &#039;&#039;nft&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Please note that what traffic/packets you see and at which point in the network stack depends on the [[Netfilter_hooks|&#039;&#039;&#039;hook&#039;&#039;&#039;]] you are using.&lt;br /&gt;
&lt;br /&gt;
Following are descriptions of current nftables families. Additional families may be added in the future.&lt;br /&gt;
&lt;br /&gt;
== ip ==&lt;br /&gt;
&lt;br /&gt;
Tables of this family see [https://en.wikipedia.org/wiki/IPv4 IPv4] traffic/packets.&lt;br /&gt;
The &#039;&#039;iptables&#039;&#039; tool is the legacy x_tables equivalent.&lt;br /&gt;
&lt;br /&gt;
== ip6 ==&lt;br /&gt;
&lt;br /&gt;
Tables of this family see [https://en.wikipedia.org/wiki/IPv6 IPv6] traffic/packets.&lt;br /&gt;
The &#039;&#039;ip6tables&#039;&#039; tool is the legacy x_tables equivalent.&lt;br /&gt;
&lt;br /&gt;
== inet ==&lt;br /&gt;
&lt;br /&gt;
Tables of this family see both IPv4 and IPv6 traffic/packets, simplifying dual stack support.&lt;br /&gt;
&lt;br /&gt;
Within a table of &#039;&#039;inet&#039;&#039; family, both IPv4 and IPv6 packets traverse the same rules. Rules for IPv4 packets don&#039;t affect IPv6 packets and vice-versa. Rules for both layer 3 protocols affect both. Use [[Matching_packet_headers#Matching_transport_protocol|meta l4proto]] l4proto to match on the layer 4 protocol, regardless of whether the packet is IPv4 or IPv6.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
# This rule affects only IPv4 packets:&lt;br /&gt;
add rule inet filter input ip saddr 1.1.1.1 counter accept&lt;br /&gt;
&lt;br /&gt;
# This rule affects only IPv6 packets:&lt;br /&gt;
add rule inet filter input ip6 daddr fe00::2 counter accept&lt;br /&gt;
&lt;br /&gt;
# These rules affect both IPv4 and IPv6 packets:&lt;br /&gt;
add rule inet filter input ct state established,related counter accept&lt;br /&gt;
add rule inet filter input udp dport 53 accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
New in nftables 0.9.7 and Linux kernel 5.10 is the inet family [[Netfilter_hooks|&#039;&#039;ingress&#039;&#039;]] hook, which filters at the same location as the netdev &#039;&#039;ingress&#039;&#039; hook.&lt;br /&gt;
&lt;br /&gt;
== arp ==&lt;br /&gt;
&lt;br /&gt;
Tables of this family see [https://en.wikipedia.org/wiki/Address_Resolution_Protocol ARP]-level (i.e, L2) traffic, before any L3 handling is done by the kernel. The &#039;&#039;arptables&#039;&#039; tool is the legacy x_tables equivalent.&lt;br /&gt;
&lt;br /&gt;
== bridge ==&lt;br /&gt;
&lt;br /&gt;
Tables of this family see traffic/packets traversing [https://wiki.linuxfoundation.org/networking/bridge bridges] (i.e. switching). No assumptions are made about L3 protocols.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;ebtables&#039;&#039; tool is the legacy x_tables equivalent. Some old x_tables modules such as &#039;&#039;physdev&#039;&#039; will also eventually be served from the nftables &#039;&#039;bridge&#039;&#039; family.&lt;br /&gt;
&lt;br /&gt;
Note that there is no nf_conntrack integration for the nftables &#039;&#039;bridge&#039;&#039; family.&lt;br /&gt;
&lt;br /&gt;
== netdev ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;netdev&#039;&#039; family is different from the others in that it is used to create base chains attached to a &#039;&#039;&#039;single network interface&#039;&#039;&#039;. Such base chains see &#039;&#039;&#039;all&#039;&#039;&#039; network traffic on the specified interface, with no assumptions about L2 or L3 protocols. Therefore you can filter ARP traffic from here. There is no legacy x_tables equivalent to the &#039;&#039;netdev&#039;&#039; family.&lt;br /&gt;
&lt;br /&gt;
The principal (only?) use for this family is for base chains using the [[Netfilter_hooks|&#039;&#039;ingress&#039;&#039; hook]], new in Linux kernel 4.2. Such &#039;&#039;ingress&#039;&#039; chains see network packets just after the NIC driver passes them up to the networking stack. This very early location in the packet path is ideal for dropping packets associated with [https://en.wikipedia.org/wiki/Denial-of-service_attack#Distributed_attack DDoS] attacks. Dropping packets from an &#039;&#039;ingress&#039;&#039; chain is twice as efficient as doing so from a &#039;&#039;prerouting&#039;&#039; chain.  (Do note that in an &#039;&#039;ingress&#039;&#039; chain, fragmented datagrams have not yet been reassembled. So, for example, matching ip saddr and daddr works for all ip packets, but matching L4 headers like udp dport works only for unfragmented packets, or the first fragment.)&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;ingress&#039;&#039; hook provides an alternative to &#039;&#039;tc&#039;&#039; ingress filtering. You still need &#039;&#039;tc&#039;&#039; for traffic shaping/queue management. &lt;br /&gt;
&lt;br /&gt;
You can also use the &#039;&#039;ingress&#039;&#039; hook for [[load balancing]], including Direct Server Return (DSR), [https://netdevconf.org/1.2/slides/oct6/08_nftables_Load_Balancing_with_nftables_II_Slides.pdf that has been reported to be 10x faster].&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=1096</id>
		<title>Quick reference-nftables in 10 minutes</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=1096"/>
		<updated>2023-09-04T10:17:07Z</updated>

		<summary type="html">&lt;p&gt;Pablo: add mld2-listener-report per bz#1701&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Find below some basic concepts to know before using nftables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;table&#039;&#039;&#039; refers to a container of [[Configuring chains|chains]] with no specific semantics.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;chain&#039;&#039;&#039; within a [[Configuring tables|table]] refers to a container of [[Simple rule management|rules]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rule&#039;&#039;&#039; refers to an action to be configured within a &#039;&#039;chain&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= nft command line =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;nft&#039;&#039; is the command line tool in order to interact with nftables at userspace.&lt;br /&gt;
&lt;br /&gt;
== Tables ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;family&#039;&#039;&#039; refers to a one of the following table types: &#039;&#039;ip&#039;&#039;, &#039;&#039;arp&#039;&#039;, &#039;&#039;ip6&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;inet&#039;&#039;, &#039;&#039;netdev&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list tables [&amp;lt;family&amp;gt;]&lt;br /&gt;
% nft list table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt; [-n] [-a]&lt;br /&gt;
% nft (add | delete | flush) table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The argument &#039;&#039;-n&#039;&#039; shows the addresses and other information that uses names in numeric format. The &#039;&#039;-a&#039;&#039; argument is used to display the &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Chains ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;type&#039;&#039;&#039; refers to the kind of chain to be created. Possible types are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;filter&#039;&#039;: Supported by &#039;&#039;arp&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; table families.&lt;br /&gt;
* &#039;&#039;route&#039;&#039;: Mark packets (like mangle for the &#039;&#039;output&#039;&#039; hook, for other hooks use the type &#039;&#039;filter&#039;&#039; instead), supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
* &#039;&#039;nat&#039;&#039;: In order to perform Network Address Translation, supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hook&#039;&#039;&#039; refers to an specific stage of the packet while it&#039;s being processed through the kernel. More info in [[Netfilter_hooks|Netfilter hooks]].&lt;br /&gt;
&lt;br /&gt;
* The hooks for &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; families are: &#039;&#039;prerouting&#039;&#039;, &#039;&#039;input&#039;&#039;, &#039;&#039;forward&#039;&#039;, &#039;&#039;output&#039;&#039;, &#039;&#039;postrouting&#039;&#039;.&lt;br /&gt;
* The hooks for &#039;&#039;arp&#039;&#039; family are: &#039;&#039; input&#039;&#039;, &#039;&#039;output&#039;&#039;.&lt;br /&gt;
* The &#039;&#039;bridge&#039;&#039; family handles ethernet packets traversing bridge devices.&lt;br /&gt;
* The hook for &#039;&#039;netdev&#039;&#039; is: &#039;&#039;ingress&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;priority&#039;&#039;&#039; refers to a number used to order the chains or to set them between some Netfilter operations. Possible values are: &#039;&#039;NF_IP_PRI_CONNTRACK_DEFRAG (-400)&#039;&#039;, &#039;&#039;NF_IP_PRI_RAW (-300)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_FIRST (-225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK (-200)&#039;&#039;, &#039;&#039;NF_IP_PRI_MANGLE (-150)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_DST (-100)&#039;&#039;, &#039;&#039;NF_IP_PRI_FILTER (0)&#039;&#039;, &#039;&#039;NF_IP_PRI_SECURITY (50)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_SRC (100)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_LAST (225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK_HELPER (300)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;policy&#039;&#039;&#039; is the default verdict statement to control the flow in the base chain. Possible values are: &#039;&#039;accept&#039;&#039; (default) and &#039;&#039;drop&#039;&#039;. Warning: Setting the policy to &#039;&#039;drop&#039;&#039; discards all packets that&lt;br /&gt;
have not been accepted by the ruleset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ { type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy &amp;lt;policy&amp;gt; \;] } ]&lt;br /&gt;
% nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
% nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;handle&#039;&#039;&#039; is an internal number that identifies a certain &#039;&#039;rule&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;position&#039;&#039;&#039; is an internal number that is used to insert a &#039;&#039;rule&#039;&#039; before a certain &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft insert rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [position &amp;lt;position&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft replace rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft delete rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matches ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;matches&#039;&#039;&#039; are clues used to access to certain packet information and create filters according to them.&lt;br /&gt;
&lt;br /&gt;
==== Ip ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip match&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip dscp cs1&lt;br /&gt;
ip dscp != cs1&lt;br /&gt;
ip dscp 0x38&lt;br /&gt;
ip dscp != 0x20&lt;br /&gt;
ip dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, &lt;br /&gt;
af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip length 232&lt;br /&gt;
ip length != 233&lt;br /&gt;
ip length 333-435&lt;br /&gt;
ip length != 333-453&lt;br /&gt;
ip length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;id&amp;gt;&#039;&#039;&lt;br /&gt;
| IP ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip id 22&lt;br /&gt;
ip id != 233&lt;br /&gt;
ip id 33-45&lt;br /&gt;
ip id != 33-45&lt;br /&gt;
ip id { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Fragmentation offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip frag-off &amp;amp; 0x1fff != 0 # match fragments&lt;br /&gt;
ip frag-off &amp;amp; 0x2000 != 0 # match MF flag                                                  &lt;br /&gt;
ip frag-off &amp;amp; 0x4000 != 0 # match DF flag &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ttl &amp;lt;ttl&amp;gt;&#039;&#039;&lt;br /&gt;
| Time to live&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip ttl 0&lt;br /&gt;
ip ttl 233&lt;br /&gt;
ip ttl 33-55&lt;br /&gt;
ip ttl != 45-50&lt;br /&gt;
ip ttl { 43, 53, 45 }&lt;br /&gt;
ip ttl { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Upper layer protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip protocol tcp&lt;br /&gt;
ip protocol 6&lt;br /&gt;
ip protocol != tcp&lt;br /&gt;
ip protocol { icmp, esp, ah, comp, udp, udplite, tcp, dccp, sctp }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip checksum 13172&lt;br /&gt;
ip checksum 22&lt;br /&gt;
ip checksum != 233&lt;br /&gt;
ip checksum 33-45&lt;br /&gt;
ip checksum != 33-45&lt;br /&gt;
ip checksum { 33, 55, 67, 88 }&lt;br /&gt;
ip checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip saddr 192.168.2.0/24&lt;br /&gt;
ip saddr != 192.168.2.0/24&lt;br /&gt;
ip saddr 192.168.3.1 ip daddr 192.168.3.100&lt;br /&gt;
ip saddr != 1.1.1.1&lt;br /&gt;
ip saddr 1.1.1.1&lt;br /&gt;
ip saddr &amp;amp; 0xff == 1&lt;br /&gt;
ip saddr &amp;amp; 0.0.0.255 &amp;lt; 0.0.0.127&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip daddr 192.168.0.1&lt;br /&gt;
ip daddr != 192.168.0.1&lt;br /&gt;
ip daddr 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr 10.0.0.0-10.255.255.255&lt;br /&gt;
ip daddr 172.16.0.0-172.31.255.255&lt;br /&gt;
ip daddr 192.168.3.1-192.168.4.250&lt;br /&gt;
ip daddr != 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr { 192.168.0.1-192.168.0.250 }&lt;br /&gt;
ip daddr { 192.168.5.1, 192.168.5.2, 192.168.5.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| Ip Header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip version 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;header length&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip hdrlength 0&lt;br /&gt;
ip hdrlength 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ip6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 dscp cs1&lt;br /&gt;
ip6 dscp != cs1&lt;br /&gt;
ip6 dscp 0x38&lt;br /&gt;
ip6 dscp != 0x20&lt;br /&gt;
ip6 dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flowlabel &amp;lt;label&amp;gt;&#039;&#039;&lt;br /&gt;
| Flow label&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 flowlabel 22&lt;br /&gt;
ip6 flowlabel != 233&lt;br /&gt;
ip6 flowlabel { 33, 55, 67, 88 }&lt;br /&gt;
ip6 flowlabel { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 length 232&lt;br /&gt;
ip6 length != 233&lt;br /&gt;
ip6 length 333-435&lt;br /&gt;
ip6 length != 333-453&lt;br /&gt;
ip6 length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;header&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header type (Upper layer protocol number)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 nexthdr {esp, udp, ah, comp, udplite, tcp, dccp, sctp, icmpv6}&lt;br /&gt;
ip6 nexthdr esp&lt;br /&gt;
ip6 nexthdr != esp&lt;br /&gt;
ip6 nexthdr { 33-44 }&lt;br /&gt;
ip6 nexthdr 33-44&lt;br /&gt;
ip6 nexthdr != 33-44&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hoplimit &amp;lt;hoplimit&amp;gt;&#039;&#039;&lt;br /&gt;
| Hop limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 hoplimit 1&lt;br /&gt;
ip6 hoplimit != 233&lt;br /&gt;
ip6 hoplimit 33-45&lt;br /&gt;
ip6 hoplimit != 33-45&lt;br /&gt;
ip6 hoplimit {33, 55, 67, 88}&lt;br /&gt;
ip6 hoplimit {33-55}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 saddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::/64&lt;br /&gt;
ip6 saddr ::1 ip6 daddr ::2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 daddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 daddr != ::1234:1234:1234:1234:1234:1234:1234-1234:1234::1234:1234:1234:1234:1234&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 version 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Tcp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|tcp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp dport 22&lt;br /&gt;
tcp dport != 33-45&lt;br /&gt;
tcp dport { 33-55 }&lt;br /&gt;
tcp dport {telnet, http, https }&lt;br /&gt;
tcp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
tcp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sport 22&lt;br /&gt;
tcp sport != 33-45&lt;br /&gt;
tcp sport { 33, 55, 67, 88}&lt;br /&gt;
tcp sport { 33-55}&lt;br /&gt;
tcp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
tcp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sequence 22&lt;br /&gt;
tcp sequence != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ackseq &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Acknowledgement number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp ackseq 22&lt;br /&gt;
tcp ackseq != 33-45&lt;br /&gt;
tcp ackseq { 33, 55, 67, 88 }&lt;br /&gt;
tcp ackseq { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| TCP flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp flags { fin, syn, rst, psh, ack, urg, ecn, cwr}&lt;br /&gt;
tcp flags cwr&lt;br /&gt;
tcp flags != cwr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;window &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Window&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp window 22&lt;br /&gt;
tcp window != 33-45&lt;br /&gt;
tcp window { 33, 55, 67, 88 }&lt;br /&gt;
tcp window { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp checksum 22&lt;br /&gt;
tcp checksum != 33-45&lt;br /&gt;
tcp checksum { 33, 55, 67, 88 }&lt;br /&gt;
tcp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;urgptr &amp;lt;pointer&amp;gt;&#039;&#039;&lt;br /&gt;
| Urgent pointer&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp urgptr 22&lt;br /&gt;
tcp urgptr != 33-45&lt;br /&gt;
tcp urgptr { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;doff &amp;lt;offset&amp;gt;&#039;&#039;&lt;br /&gt;
| Data offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp doff 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp dport 22&lt;br /&gt;
udp dport != 33-45&lt;br /&gt;
udp dport { 33-55 }&lt;br /&gt;
udp dport {telnet, http, https }&lt;br /&gt;
udp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp sport 22&lt;br /&gt;
udp sport != 33-45&lt;br /&gt;
udp sport { 33, 55, 67, 88}&lt;br /&gt;
udp sport { 33-55}&lt;br /&gt;
udp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udp sport 1024 udp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp length 6666&lt;br /&gt;
udp length != 50-65&lt;br /&gt;
udp length { 50, 65 }&lt;br /&gt;
udp length { 35-50 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| UDP checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp checksum 22&lt;br /&gt;
udp checksum != 33-45&lt;br /&gt;
udp checksum { 33, 55, 67, 88 }&lt;br /&gt;
udp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udplite ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udplite match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite dport 22&lt;br /&gt;
udplite dport != 33-45&lt;br /&gt;
udplite dport { 33-55 }&lt;br /&gt;
udplite dport {telnet, http, https }&lt;br /&gt;
udplite dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udplite dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite sport 22&lt;br /&gt;
udplite sport != 33-45&lt;br /&gt;
udplite sport { 33, 55, 67, 88}&lt;br /&gt;
udplite sport { 33-55}&lt;br /&gt;
udplite sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udplite sport 1024 udplite dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite checksum 22&lt;br /&gt;
udplite checksum != 33-45&lt;br /&gt;
udplite checksum { 33, 55, 67, 88 }&lt;br /&gt;
udplite checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sctp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|sctp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp dport 22&lt;br /&gt;
sctp dport != 33-45&lt;br /&gt;
sctp dport { 33-55 }&lt;br /&gt;
sctp dport {telnet, http, https }&lt;br /&gt;
sctp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
sctp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp sport 22&lt;br /&gt;
sctp sport != 33-45&lt;br /&gt;
sctp sport { 33, 55, 67, 88}&lt;br /&gt;
sctp sport { 33-55}&lt;br /&gt;
sctp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
sctp sport 1024 sctp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp checksum 22&lt;br /&gt;
sctp checksum != 33-45&lt;br /&gt;
sctp checksum { 33, 55, 67, 88 }&lt;br /&gt;
sctp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;vtag &amp;lt;tag&amp;gt;&#039;&#039;&lt;br /&gt;
| Verification tag&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp vtag 22&lt;br /&gt;
sctp vtag != 33-45&lt;br /&gt;
sctp vtag { 33, 55, 67, 88 }&lt;br /&gt;
sctp vtag { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;chunk &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Existence of a chunk with given type in packet&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp chunk init exists&lt;br /&gt;
sctp chunk error missing&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;chunk &amp;lt;type&amp;gt; &amp;lt;field&amp;gt;&#039;&#039;&lt;br /&gt;
| A chunk&#039;s field value (implies chunk existence)&lt;br /&gt;
|&amp;lt;sourcex lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp chunk init flags 0x1&lt;br /&gt;
sctp chunk data tsn 0x23&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Dccp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dccp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp dport 22&lt;br /&gt;
dccp dport != 33-45&lt;br /&gt;
dccp dport { 33-55 }&lt;br /&gt;
dccp dport {telnet, http, https }&lt;br /&gt;
dccp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
dccp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp sport 22&lt;br /&gt;
dccp sport != 33-45&lt;br /&gt;
dccp sport { 33, 55, 67, 88}&lt;br /&gt;
dccp sport { 33-55}&lt;br /&gt;
dccp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
dccp sport 1024 dccp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Type of packet&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp type {request, response, data, ack, dataack, closereq, close, reset, sync, syncack}&lt;br /&gt;
dccp type request&lt;br /&gt;
dccp type != request&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ah ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ah match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| AH header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah hdrlength 11-23&lt;br /&gt;
ah hdrlength != 11-23&lt;br /&gt;
ah hdrlength {11, 23, 44 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah reserved 22&lt;br /&gt;
ah reserved != 33-45&lt;br /&gt;
ah reserved {23, 100 }&lt;br /&gt;
ah reserved { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah spi 111&lt;br /&gt;
ah spi != 111-222&lt;br /&gt;
ah spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah sequence 123&lt;br /&gt;
ah sequence {23, 25, 33}&lt;br /&gt;
ah sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Esp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|esp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp spi 111&lt;br /&gt;
esp spi != 111-222&lt;br /&gt;
esp spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp sequence 123&lt;br /&gt;
esp sequence {23, 25, 33}&lt;br /&gt;
esp sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Comp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|comp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header protocol (Upper layer protocol)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp nexthdr != esp&lt;br /&gt;
comp nexthdr {esp, ah, comp, udp, udplite, tcp, tcp, dccp, sctp}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| Flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp flags 0x0&lt;br /&gt;
comp flags != 0x33-0x45&lt;br /&gt;
comp flags {0x33, 0x55, 0x67, 0x88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Compression Parameter Index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp cpi 22&lt;br /&gt;
comp cpi != 33-45&lt;br /&gt;
comp cpi {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp type {echo-reply, destination-unreachable, source-quench, redirect, echo-request, time-exceeded, parameter-problem, timestamp-request, timestamp-reply, info-request, info-reply, address-mask-request, address-mask-reply, router-advertisement, router-solicitation}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp code 111&lt;br /&gt;
icmp code != 33-55&lt;br /&gt;
icmp code { 2, 4, 54, 33, 56}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp checksum 12343&lt;br /&gt;
icmp checksum != 11-343&lt;br /&gt;
icmp checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp id 12343&lt;br /&gt;
icmp id != 11-343&lt;br /&gt;
icmp id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp sequence 12343&lt;br /&gt;
icmp sequence != 11-343&lt;br /&gt;
icmp sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp mtu 12343&lt;br /&gt;
icmp mtu != 11-343&lt;br /&gt;
icmp mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;gateway &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet gateway&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp gateway 12343&lt;br /&gt;
icmp gateway != 11-343&lt;br /&gt;
icmp gateway { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmpv6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmpv6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 type {destination-unreachable, packet-too-big, time-exceeded, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, parameter-problem, mld2-listener-report }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 code 4&lt;br /&gt;
icmpv6 code 3-66&lt;br /&gt;
icmpv6 code {5, 6, 7}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 checksum 12343&lt;br /&gt;
icmpv6 checksum != 11-343&lt;br /&gt;
icmpv6 checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 id 12343&lt;br /&gt;
icmpv6 id != 11-343&lt;br /&gt;
icmpv6 id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 sequence 12343&lt;br /&gt;
icmpv6 sequence != 11-343&lt;br /&gt;
icmpv6 sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 mtu 12343&lt;br /&gt;
icmpv6 mtu != 11-343&lt;br /&gt;
icmpv6 mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;max-delay &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet max delay&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 max-delay 33-45&lt;br /&gt;
icmpv6 max-delay != 33-45&lt;br /&gt;
icmpv6 max-delay {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ether ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ether match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;mac address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source mac address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether saddr 00:0f:54:0c:11:04&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether type vlan&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Dst ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dst match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp}&lt;br /&gt;
dst nexthdr 22&lt;br /&gt;
dst nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst hdrlength 22&lt;br /&gt;
dst hdrlength != 33-45&lt;br /&gt;
dst hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Frag ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|frag match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp, icmp}&lt;br /&gt;
frag nexthdr 6&lt;br /&gt;
frag nexthdr != 50-51&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag reserved 22&lt;br /&gt;
frag reserved != 33-45&lt;br /&gt;
frag reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag frag-off 22&lt;br /&gt;
frag frag-off != 33-45&lt;br /&gt;
frag frag-off { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;more-fragments &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag id 1&lt;br /&gt;
frag id 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Hbh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|hbh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, icmpv6}&lt;br /&gt;
hbh nexthdr 22&lt;br /&gt;
hbh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh hdrlength 22&lt;br /&gt;
hbh hdrlength != 33-45&lt;br /&gt;
hbh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Mh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|mh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
mh nexthdr 22&lt;br /&gt;
mh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh hdrlength 22&lt;br /&gt;
mh hdrlength != 33-45&lt;br /&gt;
mh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh type {binding-refresh-request, home-test-init, careof-test-init, home-test, careof-test, binding-update, binding-acknowledgement, binding-error, fast-binding-update, fast-binding-acknowledgement, fast-binding-advertisement, experimental-mobility-header, home-agent-switch-message}&lt;br /&gt;
mh type home-agent-switch-message&lt;br /&gt;
mh type != home-agent-switch-message&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh reserved 22&lt;br /&gt;
mh reserved != 33-45&lt;br /&gt;
mh reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh checksum 22&lt;br /&gt;
mh checksum != 33-45&lt;br /&gt;
mh checksum { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Rt ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|rt match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
rt nexthdr 22&lt;br /&gt;
rt nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt hdrlength 22&lt;br /&gt;
rt hdrlength != 33-45&lt;br /&gt;
rt hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt type 22&lt;br /&gt;
rt type != 33-45&lt;br /&gt;
rt type { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;seg-left &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt seg-left 22&lt;br /&gt;
rt seg-left != 33-45&lt;br /&gt;
rt seg-left { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Vlan ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|vlan match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Vlan tag ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan id 4094&lt;br /&gt;
vlan id 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cfi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan cfi 0&lt;br /&gt;
vlan cfi 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pcp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan pcp 7&lt;br /&gt;
vlan pcp 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Arp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|arp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ptype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp ptype 0x0800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;htype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Header type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp htype 1&lt;br /&gt;
arp htype != 33-45&lt;br /&gt;
arp htype { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hlen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp hlen 1&lt;br /&gt;
arp hlen != 33-45&lt;br /&gt;
arp hlen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;plen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp plen 1&lt;br /&gt;
arp plen != 33-45&lt;br /&gt;
arp plen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;operation &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp operation {nak, inreply, inrequest, rreply, rrequest, reply, request}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ct ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ct match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;state &amp;lt;state&amp;gt;&#039;&#039;&lt;br /&gt;
| State of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct state { new, established, related, untracked }&lt;br /&gt;
ct state != related&lt;br /&gt;
ct state established&lt;br /&gt;
ct state 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;direction &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Direction of the packet relative to the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct direction original&lt;br /&gt;
ct direction != original&lt;br /&gt;
ct direction {reply, original}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;status &amp;lt;status&amp;gt;&#039;&#039;&lt;br /&gt;
| Status of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct status expected&lt;br /&gt;
(ct status &amp;amp; expected) != expected&lt;br /&gt;
ct status {expected,seen-reply,assured,confirmed,snat,dnat,dying}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Mark of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct mark 0&lt;br /&gt;
ct mark or 0x23 == 0x11&lt;br /&gt;
ct mark or 0x3 != 0x1&lt;br /&gt;
ct mark and 0x23 == 0x11&lt;br /&gt;
ct mark and 0x3 != 0x1&lt;br /&gt;
ct mark xor 0x23 == 0x11&lt;br /&gt;
ct mark xor 0x3 != 0x1&lt;br /&gt;
ct mark 0x00000032&lt;br /&gt;
ct mark != 0x00000032&lt;br /&gt;
ct mark 0x00000032-0x00000045&lt;br /&gt;
ct mark != 0x00000032-0x00000045&lt;br /&gt;
ct mark {0x32, 0x2222, 0x42de3}&lt;br /&gt;
ct mark {0x32-0x2222, 0x4444-0x42de3}&lt;br /&gt;
ct mark set 0x11 xor 0x1331&lt;br /&gt;
ct mark set 0x11333 and 0x11&lt;br /&gt;
ct mark set 0x12 or 0x11&lt;br /&gt;
ct mark set 0x11&lt;br /&gt;
ct mark set mark&lt;br /&gt;
ct mark set mark map { 1 : 10, 2 : 20, 3 : 30 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;expiration &amp;lt;time&amp;gt;&#039;&#039;&lt;br /&gt;
| Connection expiration time&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct expiration 30&lt;br /&gt;
ct expiration 30s&lt;br /&gt;
ct expiration != 233&lt;br /&gt;
ct expiration != 3m53s&lt;br /&gt;
ct expiration 33-45&lt;br /&gt;
ct expiration 33s-45s&lt;br /&gt;
ct expiration != 33-45&lt;br /&gt;
ct expiration != 33s-45s&lt;br /&gt;
ct expiration {33, 55, 67, 88}&lt;br /&gt;
ct expiration { 1m7s, 33s, 55s, 1m28s}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;helper &amp;quot;&amp;lt;helper&amp;gt;&amp;quot;&#039;&#039;&lt;br /&gt;
| Helper associated with the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct helper &amp;quot;ftp&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] bytes &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original bytes &amp;gt; 100000&lt;br /&gt;
ct bytes &amp;gt; 100000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] packets &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply packets &amp;lt; 100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip saddr 192.168.0.1&lt;br /&gt;
ct reply ip saddr 192.168.0.1&lt;br /&gt;
ct original ip saddr 192.168.1.0/24&lt;br /&gt;
ct reply ip saddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip daddr 192.168.0.1&lt;br /&gt;
ct reply ip daddr 192.168.0.1&lt;br /&gt;
ct original ip daddr 192.168.1.0/24&lt;br /&gt;
ct reply ip daddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] l3proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original l3proto ipv4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original protocol 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-dst &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original proto-dst 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-src &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply proto-src 53&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;count [over] &amp;lt;number of connections&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct count over 2&lt;br /&gt;
&lt;br /&gt;
tcp dport 22 add @ssh_flood { ip saddr ct count over 2 } reject&lt;br /&gt;
[ which requires an existing ssh_flood set, ie. add set filter ssh_flood { type ipv4_addr; flags dynamic; } ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Meta ====&lt;br /&gt;
&lt;br /&gt;
[[Matching packet metainformation|&#039;&#039;meta&#039;&#039;]] matches packet by metainformation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|meta match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifname &amp;lt;input interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta iifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifname &amp;lt;output interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta oifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iif &amp;lt;input interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iif eth0&lt;br /&gt;
meta iif != eth0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oif &amp;lt;output interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oif lo&lt;br /&gt;
meta oif != lo&lt;br /&gt;
meta oif {eth0, lo}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iiftype &amp;lt;input interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta iiftype != ether&lt;br /&gt;
meta iiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oiftype &amp;lt;output interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface hardware type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta oiftype != ether&lt;br /&gt;
meta oiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Length of the packet in bytes&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta length 1000&lt;br /&gt;
meta length != 1000&lt;br /&gt;
meta length &amp;gt; 1000&lt;br /&gt;
meta length 33-45&lt;br /&gt;
meta length != 33-45&lt;br /&gt;
meta length { 33, 55, 67, 88 }&lt;br /&gt;
meta length { 33-55, 67-88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| ethertype protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta protocol ip&lt;br /&gt;
meta protocol != ip&lt;br /&gt;
meta protocol { ip, arp, ip6, vlan }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nfproto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta nfproto ipv4&lt;br /&gt;
meta nfproto != ipv6&lt;br /&gt;
meta nfproto { ipv4, ipv6 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;l4proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta l4proto 22&lt;br /&gt;
meta l4proto != 233&lt;br /&gt;
meta l4proto 33-45&lt;br /&gt;
meta l4proto { 33, 55, 67, 88 }&lt;br /&gt;
meta l4proto { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet mark&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta mark 0x4&lt;br /&gt;
meta mark 0x00000032&lt;br /&gt;
meta mark and 0x03 == 0x01&lt;br /&gt;
meta mark and 0x03 != 0x01&lt;br /&gt;
meta mark != 0x10&lt;br /&gt;
meta mark or 0x03 == 0x01&lt;br /&gt;
meta mark or 0x03 != 0x01&lt;br /&gt;
meta mark xor 0x03 == 0x01&lt;br /&gt;
meta mark xor 0x03 != 0x01&lt;br /&gt;
meta mark set 0xffffffc8 xor 0x16&lt;br /&gt;
meta mark set 0x16 and 0x16&lt;br /&gt;
meta mark set 0xffffffe9 or 0x16&lt;br /&gt;
meta mark set 0xffffffde and 0x16&lt;br /&gt;
meta mark set 0x32 or 0xfffff&lt;br /&gt;
meta mark set 0xfffe xor 0x16&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;priority [set] &amp;lt;priority&amp;gt;&#039;&#039;&lt;br /&gt;
| tc class id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta priority none&lt;br /&gt;
meta priority 0x1:0x1&lt;br /&gt;
meta priority 0x1:0xffff&lt;br /&gt;
meta priority 0xffff:0xffff&lt;br /&gt;
meta priority set 0x1:0x1&lt;br /&gt;
meta priority set 0x1:0xffff&lt;br /&gt;
meta priority set 0xffff:0xffff&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skuid &amp;lt;user id&amp;gt;&#039;&#039;&lt;br /&gt;
| UID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skuid {bin, root, daemon}&lt;br /&gt;
meta skuid root&lt;br /&gt;
meta skuid != root&lt;br /&gt;
meta skuid lt 3000&lt;br /&gt;
meta skuid gt 3000&lt;br /&gt;
meta skuid eq 3000&lt;br /&gt;
meta skuid 3001-3005&lt;br /&gt;
meta skuid != 2001-2005&lt;br /&gt;
meta skuid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skgid &amp;lt;group id&amp;gt;&#039;&#039;&lt;br /&gt;
| GID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skgid {bin, root, daemon}&lt;br /&gt;
meta skgid root&lt;br /&gt;
meta skgid != root&lt;br /&gt;
meta skgid lt 3000&lt;br /&gt;
meta skgid gt 3000&lt;br /&gt;
meta skgid eq 3000&lt;br /&gt;
meta skgid 3001-3005&lt;br /&gt;
meta skgid != 2001-2005&lt;br /&gt;
meta skgid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rtclassid &amp;lt;class&amp;gt;&#039;&#039;&lt;br /&gt;
| Routing realm&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta rtclassid cosmos&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pkttype &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta pkttype broadcast&lt;br /&gt;
meta pkttype != broadcast&lt;br /&gt;
meta pkttype { broadcast, unicast, multicast}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpu &amp;lt;cpu index&amp;gt;&#039;&#039;&lt;br /&gt;
| CPU ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cpu 1&lt;br /&gt;
meta cpu != 1&lt;br /&gt;
meta cpu 1-3&lt;br /&gt;
meta cpu != 1-2&lt;br /&gt;
meta cpu { 2,3 }&lt;br /&gt;
meta cpu { 2-3, 5-7 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifgroup &amp;lt;input group&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifgroup 0&lt;br /&gt;
meta iifgroup != 0&lt;br /&gt;
meta iifgroup default&lt;br /&gt;
meta iifgroup != default&lt;br /&gt;
meta iifgroup {default}&lt;br /&gt;
meta iifgroup { 11,33 }&lt;br /&gt;
meta iifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifgroup 0&lt;br /&gt;
meta oifgroup != 0&lt;br /&gt;
meta oifgroup default&lt;br /&gt;
meta oifgroup != default&lt;br /&gt;
meta oifgroup {default}&lt;br /&gt;
meta oifgroup { 11,33 }&lt;br /&gt;
meta oifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cgroup 1048577&lt;br /&gt;
meta cgroup != 1048577&lt;br /&gt;
meta cgroup { 1048577, 1048578 }&lt;br /&gt;
meta cgroup 1048577-1048578&lt;br /&gt;
meta cgroup != 1048577-1048578&lt;br /&gt;
meta cgroup {1048577-1048578}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Statements ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;statement&#039;&#039;&#039; is the action performed when the packet match the rule. It could be &#039;&#039;terminal&#039;&#039; and &#039;&#039;non-terminal&#039;&#039;. In a certain rule we can consider several non-terminal statements but only a single terminal statement.&lt;br /&gt;
&lt;br /&gt;
==== Verdict statements ====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;verdict statement&#039;&#039;&#039; alters control flow in the ruleset and issues policy decisions for packets. The valid verdict statements are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;accept&#039;&#039;: Accept the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;drop&#039;&#039;: Drop the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;queue&#039;&#039;: Queue the packet to userspace and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;continue&#039;&#039;: Continue the ruleset evaluation with the next rule.&lt;br /&gt;
* &#039;&#039;return&#039;&#039;: Return from the current chain and continue at the next rule of the last chain. In a base chain it is equivalent to accept&lt;br /&gt;
* &#039;&#039;jump &amp;lt;chain&amp;gt;&#039;&#039;: Continue at the first rule of &amp;lt;chain&amp;gt;. It will continue at the next rule after a return statement is issued&lt;br /&gt;
* &#039;&#039;goto &amp;lt;chain&amp;gt;&#039;&#039;: Similar to jump, but after the new chain the evaluation will continue at the last chain instead of the one containing the goto statement&lt;br /&gt;
&lt;br /&gt;
==== Log ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|log statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;level [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Log level&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log&lt;br /&gt;
log level emerg&lt;br /&gt;
log level alert&lt;br /&gt;
log level crit&lt;br /&gt;
log level err&lt;br /&gt;
log level warn&lt;br /&gt;
log level notice&lt;br /&gt;
log level info&lt;br /&gt;
log level debug&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;group &amp;lt;value&amp;gt; [queue-threshold &amp;lt;value&amp;gt;] [snaplen &amp;lt;value&amp;gt;] [prefix &amp;quot;&amp;lt;prefix&amp;gt;&amp;quot;]&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log prefix aaaaa-aaaaaa group 2 snaplen 33&lt;br /&gt;
log group 2 queue-threshold 2&lt;br /&gt;
log group 2 snaplen 33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reject ====&lt;br /&gt;
&lt;br /&gt;
The default &#039;&#039;&#039;reject&#039;&#039;&#039; will be the ICMP type &#039;&#039;&#039;port-unreachable&#039;&#039;&#039;. The &#039;&#039;&#039;icmpx&#039;&#039;&#039; is only used for inet family support.&lt;br /&gt;
&lt;br /&gt;
More information on the [[Rejecting_traffic]] page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|reject statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;with &amp;lt;protocol&amp;gt; type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
reject&lt;br /&gt;
reject with icmp type host-unreachable&lt;br /&gt;
reject with icmp type net-unreachable&lt;br /&gt;
reject with icmp type prot-unreachable&lt;br /&gt;
reject with icmp type port-unreachable&lt;br /&gt;
reject with icmp type net-prohibited&lt;br /&gt;
reject with icmp type host-prohibited&lt;br /&gt;
reject with icmp type admin-prohibited&lt;br /&gt;
reject with icmpv6 type no-route&lt;br /&gt;
reject with icmpv6 type admin-prohibited&lt;br /&gt;
reject with icmpv6 type addr-unreachable&lt;br /&gt;
reject with icmpv6 type port-unreachable&lt;br /&gt;
reject with icmpx type host-unreachable&lt;br /&gt;
reject with icmpx type no-route&lt;br /&gt;
reject with icmpx type admin-prohibited&lt;br /&gt;
reject with icmpx type port-unreachable&lt;br /&gt;
ip protocol tcp reject with tcp reset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Counter ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|counter statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;packets &amp;lt;packets&amp;gt; bytes &amp;lt;bytes&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
counter&lt;br /&gt;
counter packets 0 bytes 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Limit ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|limit statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rate [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Rate limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
limit rate 400/minute&lt;br /&gt;
limit rate 400/hour&lt;br /&gt;
limit rate over 40/day&lt;br /&gt;
limit rate over 400/week&lt;br /&gt;
limit rate over 1023/second burst 10 packets&lt;br /&gt;
limit rate 1025 kbytes/second&lt;br /&gt;
limit rate 1023000 mbytes/second&lt;br /&gt;
limit rate 1025 bytes/second burst 512 bytes&lt;br /&gt;
limit rate 1025 kbytes/second burst 1023 kbytes&lt;br /&gt;
limit rate 1025 mbytes/second burst 1025 kbytes&lt;br /&gt;
limit rate 1025000 mbytes/second burst 1023 mbytes&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nat ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|nat statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dnat to &amp;lt;destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dnat to 192.168.3.2&lt;br /&gt;
dnat to ct mark map { 0x00000014 : 1.2.3.4}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;snat to &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
snat to 192.168.3.2&lt;br /&gt;
snat to 2001:838:35f:1::-2001:838:35f:2:::100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;masquerade [&amp;lt;type&amp;gt;] [to :&amp;lt;port&amp;gt;]&#039;&#039;&lt;br /&gt;
| Masquerade&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
masquerade&lt;br /&gt;
masquerade persistent,fully-random,random&lt;br /&gt;
masquerade to :1024&lt;br /&gt;
masquerade to :1024-2048&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Queue ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|queue statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;num &amp;lt;value&amp;gt; &amp;lt;scheduler&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
queue&lt;br /&gt;
queue num 2&lt;br /&gt;
queue num 2-3&lt;br /&gt;
queue num 4-5 fanout bypass&lt;br /&gt;
queue num 4-5 fanout&lt;br /&gt;
queue num 4-5 bypass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Export Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft export (xml | json)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monitor Events ===&lt;br /&gt;
&lt;br /&gt;
Monitor events from Netlink creating filters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft monitor [new | destroy] [tables | chains | sets | rules | elements] [xml | json]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Nft scripting =&lt;br /&gt;
&lt;br /&gt;
== List ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flush ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Load ruleset ==&lt;br /&gt;
&lt;br /&gt;
Create a command batch file and load it with the nft interpreter,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% echo &amp;quot;flush ruleset&amp;quot; &amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add table filter&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add chain filter input&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add rule filter input meta iifname lo accept&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/nftables.rules&lt;br /&gt;
&amp;gt; #!/usr/local/sbin/nft -f&lt;br /&gt;
&amp;gt; flush ruleset&lt;br /&gt;
&amp;gt; add table filter&lt;br /&gt;
&amp;gt; add chain filter input&lt;br /&gt;
&amp;gt; add rule filter input meta iifname lo accept&lt;br /&gt;
&amp;gt; EOF&lt;br /&gt;
% chmod u+x /etc/nftables.rules&lt;br /&gt;
% /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file from an already created ruleset,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset &amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
== Simple IP/IPv6 Firewall ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    icmp type echo-request accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table ip6 firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # invalid connections&lt;br /&gt;
    ct state invalid drop&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    # routers may also want: mld-listener-query, nd-router-solicit&lt;br /&gt;
    icmpv6 type {echo-request,nd-neighbor-solicit} accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=1095</id>
		<title>Quick reference-nftables in 10 minutes</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=1095"/>
		<updated>2023-08-29T16:34:07Z</updated>

		<summary type="html">&lt;p&gt;Pablo: add more useful examples for ip frag-off&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Find below some basic concepts to know before using nftables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;table&#039;&#039;&#039; refers to a container of [[Configuring chains|chains]] with no specific semantics.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;chain&#039;&#039;&#039; within a [[Configuring tables|table]] refers to a container of [[Simple rule management|rules]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rule&#039;&#039;&#039; refers to an action to be configured within a &#039;&#039;chain&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= nft command line =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;nft&#039;&#039; is the command line tool in order to interact with nftables at userspace.&lt;br /&gt;
&lt;br /&gt;
== Tables ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;family&#039;&#039;&#039; refers to a one of the following table types: &#039;&#039;ip&#039;&#039;, &#039;&#039;arp&#039;&#039;, &#039;&#039;ip6&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;inet&#039;&#039;, &#039;&#039;netdev&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list tables [&amp;lt;family&amp;gt;]&lt;br /&gt;
% nft list table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt; [-n] [-a]&lt;br /&gt;
% nft (add | delete | flush) table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The argument &#039;&#039;-n&#039;&#039; shows the addresses and other information that uses names in numeric format. The &#039;&#039;-a&#039;&#039; argument is used to display the &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Chains ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;type&#039;&#039;&#039; refers to the kind of chain to be created. Possible types are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;filter&#039;&#039;: Supported by &#039;&#039;arp&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; table families.&lt;br /&gt;
* &#039;&#039;route&#039;&#039;: Mark packets (like mangle for the &#039;&#039;output&#039;&#039; hook, for other hooks use the type &#039;&#039;filter&#039;&#039; instead), supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
* &#039;&#039;nat&#039;&#039;: In order to perform Network Address Translation, supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hook&#039;&#039;&#039; refers to an specific stage of the packet while it&#039;s being processed through the kernel. More info in [[Netfilter_hooks|Netfilter hooks]].&lt;br /&gt;
&lt;br /&gt;
* The hooks for &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; families are: &#039;&#039;prerouting&#039;&#039;, &#039;&#039;input&#039;&#039;, &#039;&#039;forward&#039;&#039;, &#039;&#039;output&#039;&#039;, &#039;&#039;postrouting&#039;&#039;.&lt;br /&gt;
* The hooks for &#039;&#039;arp&#039;&#039; family are: &#039;&#039; input&#039;&#039;, &#039;&#039;output&#039;&#039;.&lt;br /&gt;
* The &#039;&#039;bridge&#039;&#039; family handles ethernet packets traversing bridge devices.&lt;br /&gt;
* The hook for &#039;&#039;netdev&#039;&#039; is: &#039;&#039;ingress&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;priority&#039;&#039;&#039; refers to a number used to order the chains or to set them between some Netfilter operations. Possible values are: &#039;&#039;NF_IP_PRI_CONNTRACK_DEFRAG (-400)&#039;&#039;, &#039;&#039;NF_IP_PRI_RAW (-300)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_FIRST (-225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK (-200)&#039;&#039;, &#039;&#039;NF_IP_PRI_MANGLE (-150)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_DST (-100)&#039;&#039;, &#039;&#039;NF_IP_PRI_FILTER (0)&#039;&#039;, &#039;&#039;NF_IP_PRI_SECURITY (50)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_SRC (100)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_LAST (225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK_HELPER (300)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;policy&#039;&#039;&#039; is the default verdict statement to control the flow in the base chain. Possible values are: &#039;&#039;accept&#039;&#039; (default) and &#039;&#039;drop&#039;&#039;. Warning: Setting the policy to &#039;&#039;drop&#039;&#039; discards all packets that&lt;br /&gt;
have not been accepted by the ruleset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ { type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy &amp;lt;policy&amp;gt; \;] } ]&lt;br /&gt;
% nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
% nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;handle&#039;&#039;&#039; is an internal number that identifies a certain &#039;&#039;rule&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;position&#039;&#039;&#039; is an internal number that is used to insert a &#039;&#039;rule&#039;&#039; before a certain &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft insert rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [position &amp;lt;position&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft replace rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft delete rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matches ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;matches&#039;&#039;&#039; are clues used to access to certain packet information and create filters according to them.&lt;br /&gt;
&lt;br /&gt;
==== Ip ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip match&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip dscp cs1&lt;br /&gt;
ip dscp != cs1&lt;br /&gt;
ip dscp 0x38&lt;br /&gt;
ip dscp != 0x20&lt;br /&gt;
ip dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, &lt;br /&gt;
af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip length 232&lt;br /&gt;
ip length != 233&lt;br /&gt;
ip length 333-435&lt;br /&gt;
ip length != 333-453&lt;br /&gt;
ip length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;id&amp;gt;&#039;&#039;&lt;br /&gt;
| IP ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip id 22&lt;br /&gt;
ip id != 233&lt;br /&gt;
ip id 33-45&lt;br /&gt;
ip id != 33-45&lt;br /&gt;
ip id { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Fragmentation offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip frag-off &amp;amp; 0x1fff != 0 # match fragments&lt;br /&gt;
ip frag-off &amp;amp; 0x2000 != 0 # match MF flag                                                  &lt;br /&gt;
ip frag-off &amp;amp; 0x4000 != 0 # match DF flag &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ttl &amp;lt;ttl&amp;gt;&#039;&#039;&lt;br /&gt;
| Time to live&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip ttl 0&lt;br /&gt;
ip ttl 233&lt;br /&gt;
ip ttl 33-55&lt;br /&gt;
ip ttl != 45-50&lt;br /&gt;
ip ttl { 43, 53, 45 }&lt;br /&gt;
ip ttl { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Upper layer protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip protocol tcp&lt;br /&gt;
ip protocol 6&lt;br /&gt;
ip protocol != tcp&lt;br /&gt;
ip protocol { icmp, esp, ah, comp, udp, udplite, tcp, dccp, sctp }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip checksum 13172&lt;br /&gt;
ip checksum 22&lt;br /&gt;
ip checksum != 233&lt;br /&gt;
ip checksum 33-45&lt;br /&gt;
ip checksum != 33-45&lt;br /&gt;
ip checksum { 33, 55, 67, 88 }&lt;br /&gt;
ip checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip saddr 192.168.2.0/24&lt;br /&gt;
ip saddr != 192.168.2.0/24&lt;br /&gt;
ip saddr 192.168.3.1 ip daddr 192.168.3.100&lt;br /&gt;
ip saddr != 1.1.1.1&lt;br /&gt;
ip saddr 1.1.1.1&lt;br /&gt;
ip saddr &amp;amp; 0xff == 1&lt;br /&gt;
ip saddr &amp;amp; 0.0.0.255 &amp;lt; 0.0.0.127&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip daddr 192.168.0.1&lt;br /&gt;
ip daddr != 192.168.0.1&lt;br /&gt;
ip daddr 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr 10.0.0.0-10.255.255.255&lt;br /&gt;
ip daddr 172.16.0.0-172.31.255.255&lt;br /&gt;
ip daddr 192.168.3.1-192.168.4.250&lt;br /&gt;
ip daddr != 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr { 192.168.0.1-192.168.0.250 }&lt;br /&gt;
ip daddr { 192.168.5.1, 192.168.5.2, 192.168.5.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| Ip Header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip version 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;header length&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip hdrlength 0&lt;br /&gt;
ip hdrlength 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ip6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 dscp cs1&lt;br /&gt;
ip6 dscp != cs1&lt;br /&gt;
ip6 dscp 0x38&lt;br /&gt;
ip6 dscp != 0x20&lt;br /&gt;
ip6 dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flowlabel &amp;lt;label&amp;gt;&#039;&#039;&lt;br /&gt;
| Flow label&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 flowlabel 22&lt;br /&gt;
ip6 flowlabel != 233&lt;br /&gt;
ip6 flowlabel { 33, 55, 67, 88 }&lt;br /&gt;
ip6 flowlabel { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 length 232&lt;br /&gt;
ip6 length != 233&lt;br /&gt;
ip6 length 333-435&lt;br /&gt;
ip6 length != 333-453&lt;br /&gt;
ip6 length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;header&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header type (Upper layer protocol number)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 nexthdr {esp, udp, ah, comp, udplite, tcp, dccp, sctp, icmpv6}&lt;br /&gt;
ip6 nexthdr esp&lt;br /&gt;
ip6 nexthdr != esp&lt;br /&gt;
ip6 nexthdr { 33-44 }&lt;br /&gt;
ip6 nexthdr 33-44&lt;br /&gt;
ip6 nexthdr != 33-44&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hoplimit &amp;lt;hoplimit&amp;gt;&#039;&#039;&lt;br /&gt;
| Hop limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 hoplimit 1&lt;br /&gt;
ip6 hoplimit != 233&lt;br /&gt;
ip6 hoplimit 33-45&lt;br /&gt;
ip6 hoplimit != 33-45&lt;br /&gt;
ip6 hoplimit {33, 55, 67, 88}&lt;br /&gt;
ip6 hoplimit {33-55}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 saddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::/64&lt;br /&gt;
ip6 saddr ::1 ip6 daddr ::2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 daddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 daddr != ::1234:1234:1234:1234:1234:1234:1234-1234:1234::1234:1234:1234:1234:1234&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 version 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Tcp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|tcp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp dport 22&lt;br /&gt;
tcp dport != 33-45&lt;br /&gt;
tcp dport { 33-55 }&lt;br /&gt;
tcp dport {telnet, http, https }&lt;br /&gt;
tcp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
tcp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sport 22&lt;br /&gt;
tcp sport != 33-45&lt;br /&gt;
tcp sport { 33, 55, 67, 88}&lt;br /&gt;
tcp sport { 33-55}&lt;br /&gt;
tcp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
tcp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sequence 22&lt;br /&gt;
tcp sequence != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ackseq &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Acknowledgement number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp ackseq 22&lt;br /&gt;
tcp ackseq != 33-45&lt;br /&gt;
tcp ackseq { 33, 55, 67, 88 }&lt;br /&gt;
tcp ackseq { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| TCP flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp flags { fin, syn, rst, psh, ack, urg, ecn, cwr}&lt;br /&gt;
tcp flags cwr&lt;br /&gt;
tcp flags != cwr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;window &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Window&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp window 22&lt;br /&gt;
tcp window != 33-45&lt;br /&gt;
tcp window { 33, 55, 67, 88 }&lt;br /&gt;
tcp window { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp checksum 22&lt;br /&gt;
tcp checksum != 33-45&lt;br /&gt;
tcp checksum { 33, 55, 67, 88 }&lt;br /&gt;
tcp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;urgptr &amp;lt;pointer&amp;gt;&#039;&#039;&lt;br /&gt;
| Urgent pointer&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp urgptr 22&lt;br /&gt;
tcp urgptr != 33-45&lt;br /&gt;
tcp urgptr { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;doff &amp;lt;offset&amp;gt;&#039;&#039;&lt;br /&gt;
| Data offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp doff 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp dport 22&lt;br /&gt;
udp dport != 33-45&lt;br /&gt;
udp dport { 33-55 }&lt;br /&gt;
udp dport {telnet, http, https }&lt;br /&gt;
udp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp sport 22&lt;br /&gt;
udp sport != 33-45&lt;br /&gt;
udp sport { 33, 55, 67, 88}&lt;br /&gt;
udp sport { 33-55}&lt;br /&gt;
udp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udp sport 1024 udp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp length 6666&lt;br /&gt;
udp length != 50-65&lt;br /&gt;
udp length { 50, 65 }&lt;br /&gt;
udp length { 35-50 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| UDP checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp checksum 22&lt;br /&gt;
udp checksum != 33-45&lt;br /&gt;
udp checksum { 33, 55, 67, 88 }&lt;br /&gt;
udp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udplite ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udplite match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite dport 22&lt;br /&gt;
udplite dport != 33-45&lt;br /&gt;
udplite dport { 33-55 }&lt;br /&gt;
udplite dport {telnet, http, https }&lt;br /&gt;
udplite dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udplite dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite sport 22&lt;br /&gt;
udplite sport != 33-45&lt;br /&gt;
udplite sport { 33, 55, 67, 88}&lt;br /&gt;
udplite sport { 33-55}&lt;br /&gt;
udplite sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udplite sport 1024 udplite dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite checksum 22&lt;br /&gt;
udplite checksum != 33-45&lt;br /&gt;
udplite checksum { 33, 55, 67, 88 }&lt;br /&gt;
udplite checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sctp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|sctp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp dport 22&lt;br /&gt;
sctp dport != 33-45&lt;br /&gt;
sctp dport { 33-55 }&lt;br /&gt;
sctp dport {telnet, http, https }&lt;br /&gt;
sctp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
sctp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp sport 22&lt;br /&gt;
sctp sport != 33-45&lt;br /&gt;
sctp sport { 33, 55, 67, 88}&lt;br /&gt;
sctp sport { 33-55}&lt;br /&gt;
sctp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
sctp sport 1024 sctp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp checksum 22&lt;br /&gt;
sctp checksum != 33-45&lt;br /&gt;
sctp checksum { 33, 55, 67, 88 }&lt;br /&gt;
sctp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;vtag &amp;lt;tag&amp;gt;&#039;&#039;&lt;br /&gt;
| Verification tag&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp vtag 22&lt;br /&gt;
sctp vtag != 33-45&lt;br /&gt;
sctp vtag { 33, 55, 67, 88 }&lt;br /&gt;
sctp vtag { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;chunk &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Existence of a chunk with given type in packet&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp chunk init exists&lt;br /&gt;
sctp chunk error missing&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;chunk &amp;lt;type&amp;gt; &amp;lt;field&amp;gt;&#039;&#039;&lt;br /&gt;
| A chunk&#039;s field value (implies chunk existence)&lt;br /&gt;
|&amp;lt;sourcex lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp chunk init flags 0x1&lt;br /&gt;
sctp chunk data tsn 0x23&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Dccp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dccp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp dport 22&lt;br /&gt;
dccp dport != 33-45&lt;br /&gt;
dccp dport { 33-55 }&lt;br /&gt;
dccp dport {telnet, http, https }&lt;br /&gt;
dccp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
dccp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp sport 22&lt;br /&gt;
dccp sport != 33-45&lt;br /&gt;
dccp sport { 33, 55, 67, 88}&lt;br /&gt;
dccp sport { 33-55}&lt;br /&gt;
dccp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
dccp sport 1024 dccp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Type of packet&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp type {request, response, data, ack, dataack, closereq, close, reset, sync, syncack}&lt;br /&gt;
dccp type request&lt;br /&gt;
dccp type != request&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ah ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ah match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| AH header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah hdrlength 11-23&lt;br /&gt;
ah hdrlength != 11-23&lt;br /&gt;
ah hdrlength {11, 23, 44 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah reserved 22&lt;br /&gt;
ah reserved != 33-45&lt;br /&gt;
ah reserved {23, 100 }&lt;br /&gt;
ah reserved { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah spi 111&lt;br /&gt;
ah spi != 111-222&lt;br /&gt;
ah spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah sequence 123&lt;br /&gt;
ah sequence {23, 25, 33}&lt;br /&gt;
ah sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Esp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|esp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp spi 111&lt;br /&gt;
esp spi != 111-222&lt;br /&gt;
esp spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp sequence 123&lt;br /&gt;
esp sequence {23, 25, 33}&lt;br /&gt;
esp sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Comp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|comp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header protocol (Upper layer protocol)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp nexthdr != esp&lt;br /&gt;
comp nexthdr {esp, ah, comp, udp, udplite, tcp, tcp, dccp, sctp}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| Flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp flags 0x0&lt;br /&gt;
comp flags != 0x33-0x45&lt;br /&gt;
comp flags {0x33, 0x55, 0x67, 0x88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Compression Parameter Index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp cpi 22&lt;br /&gt;
comp cpi != 33-45&lt;br /&gt;
comp cpi {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp type {echo-reply, destination-unreachable, source-quench, redirect, echo-request, time-exceeded, parameter-problem, timestamp-request, timestamp-reply, info-request, info-reply, address-mask-request, address-mask-reply, router-advertisement, router-solicitation}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp code 111&lt;br /&gt;
icmp code != 33-55&lt;br /&gt;
icmp code { 2, 4, 54, 33, 56}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp checksum 12343&lt;br /&gt;
icmp checksum != 11-343&lt;br /&gt;
icmp checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp id 12343&lt;br /&gt;
icmp id != 11-343&lt;br /&gt;
icmp id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp sequence 12343&lt;br /&gt;
icmp sequence != 11-343&lt;br /&gt;
icmp sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp mtu 12343&lt;br /&gt;
icmp mtu != 11-343&lt;br /&gt;
icmp mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;gateway &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet gateway&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp gateway 12343&lt;br /&gt;
icmp gateway != 11-343&lt;br /&gt;
icmp gateway { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmpv6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmpv6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 type {destination-unreachable, packet-too-big, time-exceeded, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, nd-redirect, parameter-problem, router-renumbering}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 code 4&lt;br /&gt;
icmpv6 code 3-66&lt;br /&gt;
icmpv6 code {5, 6, 7}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 checksum 12343&lt;br /&gt;
icmpv6 checksum != 11-343&lt;br /&gt;
icmpv6 checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 id 12343&lt;br /&gt;
icmpv6 id != 11-343&lt;br /&gt;
icmpv6 id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 sequence 12343&lt;br /&gt;
icmpv6 sequence != 11-343&lt;br /&gt;
icmpv6 sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 mtu 12343&lt;br /&gt;
icmpv6 mtu != 11-343&lt;br /&gt;
icmpv6 mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;max-delay &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet max delay&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 max-delay 33-45&lt;br /&gt;
icmpv6 max-delay != 33-45&lt;br /&gt;
icmpv6 max-delay {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ether ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ether match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;mac address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source mac address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether saddr 00:0f:54:0c:11:04&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether type vlan&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Dst ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dst match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp}&lt;br /&gt;
dst nexthdr 22&lt;br /&gt;
dst nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst hdrlength 22&lt;br /&gt;
dst hdrlength != 33-45&lt;br /&gt;
dst hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Frag ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|frag match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp, icmp}&lt;br /&gt;
frag nexthdr 6&lt;br /&gt;
frag nexthdr != 50-51&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag reserved 22&lt;br /&gt;
frag reserved != 33-45&lt;br /&gt;
frag reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag frag-off 22&lt;br /&gt;
frag frag-off != 33-45&lt;br /&gt;
frag frag-off { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;more-fragments &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag id 1&lt;br /&gt;
frag id 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Hbh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|hbh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, icmpv6}&lt;br /&gt;
hbh nexthdr 22&lt;br /&gt;
hbh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh hdrlength 22&lt;br /&gt;
hbh hdrlength != 33-45&lt;br /&gt;
hbh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Mh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|mh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
mh nexthdr 22&lt;br /&gt;
mh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh hdrlength 22&lt;br /&gt;
mh hdrlength != 33-45&lt;br /&gt;
mh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh type {binding-refresh-request, home-test-init, careof-test-init, home-test, careof-test, binding-update, binding-acknowledgement, binding-error, fast-binding-update, fast-binding-acknowledgement, fast-binding-advertisement, experimental-mobility-header, home-agent-switch-message}&lt;br /&gt;
mh type home-agent-switch-message&lt;br /&gt;
mh type != home-agent-switch-message&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh reserved 22&lt;br /&gt;
mh reserved != 33-45&lt;br /&gt;
mh reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh checksum 22&lt;br /&gt;
mh checksum != 33-45&lt;br /&gt;
mh checksum { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Rt ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|rt match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
rt nexthdr 22&lt;br /&gt;
rt nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt hdrlength 22&lt;br /&gt;
rt hdrlength != 33-45&lt;br /&gt;
rt hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt type 22&lt;br /&gt;
rt type != 33-45&lt;br /&gt;
rt type { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;seg-left &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt seg-left 22&lt;br /&gt;
rt seg-left != 33-45&lt;br /&gt;
rt seg-left { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Vlan ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|vlan match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Vlan tag ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan id 4094&lt;br /&gt;
vlan id 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cfi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan cfi 0&lt;br /&gt;
vlan cfi 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pcp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan pcp 7&lt;br /&gt;
vlan pcp 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Arp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|arp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ptype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp ptype 0x0800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;htype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Header type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp htype 1&lt;br /&gt;
arp htype != 33-45&lt;br /&gt;
arp htype { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hlen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp hlen 1&lt;br /&gt;
arp hlen != 33-45&lt;br /&gt;
arp hlen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;plen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp plen 1&lt;br /&gt;
arp plen != 33-45&lt;br /&gt;
arp plen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;operation &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp operation {nak, inreply, inrequest, rreply, rrequest, reply, request}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ct ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ct match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;state &amp;lt;state&amp;gt;&#039;&#039;&lt;br /&gt;
| State of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct state { new, established, related, untracked }&lt;br /&gt;
ct state != related&lt;br /&gt;
ct state established&lt;br /&gt;
ct state 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;direction &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Direction of the packet relative to the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct direction original&lt;br /&gt;
ct direction != original&lt;br /&gt;
ct direction {reply, original}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;status &amp;lt;status&amp;gt;&#039;&#039;&lt;br /&gt;
| Status of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct status expected&lt;br /&gt;
(ct status &amp;amp; expected) != expected&lt;br /&gt;
ct status {expected,seen-reply,assured,confirmed,snat,dnat,dying}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Mark of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct mark 0&lt;br /&gt;
ct mark or 0x23 == 0x11&lt;br /&gt;
ct mark or 0x3 != 0x1&lt;br /&gt;
ct mark and 0x23 == 0x11&lt;br /&gt;
ct mark and 0x3 != 0x1&lt;br /&gt;
ct mark xor 0x23 == 0x11&lt;br /&gt;
ct mark xor 0x3 != 0x1&lt;br /&gt;
ct mark 0x00000032&lt;br /&gt;
ct mark != 0x00000032&lt;br /&gt;
ct mark 0x00000032-0x00000045&lt;br /&gt;
ct mark != 0x00000032-0x00000045&lt;br /&gt;
ct mark {0x32, 0x2222, 0x42de3}&lt;br /&gt;
ct mark {0x32-0x2222, 0x4444-0x42de3}&lt;br /&gt;
ct mark set 0x11 xor 0x1331&lt;br /&gt;
ct mark set 0x11333 and 0x11&lt;br /&gt;
ct mark set 0x12 or 0x11&lt;br /&gt;
ct mark set 0x11&lt;br /&gt;
ct mark set mark&lt;br /&gt;
ct mark set mark map { 1 : 10, 2 : 20, 3 : 30 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;expiration &amp;lt;time&amp;gt;&#039;&#039;&lt;br /&gt;
| Connection expiration time&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct expiration 30&lt;br /&gt;
ct expiration 30s&lt;br /&gt;
ct expiration != 233&lt;br /&gt;
ct expiration != 3m53s&lt;br /&gt;
ct expiration 33-45&lt;br /&gt;
ct expiration 33s-45s&lt;br /&gt;
ct expiration != 33-45&lt;br /&gt;
ct expiration != 33s-45s&lt;br /&gt;
ct expiration {33, 55, 67, 88}&lt;br /&gt;
ct expiration { 1m7s, 33s, 55s, 1m28s}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;helper &amp;quot;&amp;lt;helper&amp;gt;&amp;quot;&#039;&#039;&lt;br /&gt;
| Helper associated with the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct helper &amp;quot;ftp&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] bytes &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original bytes &amp;gt; 100000&lt;br /&gt;
ct bytes &amp;gt; 100000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] packets &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply packets &amp;lt; 100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip saddr 192.168.0.1&lt;br /&gt;
ct reply ip saddr 192.168.0.1&lt;br /&gt;
ct original ip saddr 192.168.1.0/24&lt;br /&gt;
ct reply ip saddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip daddr 192.168.0.1&lt;br /&gt;
ct reply ip daddr 192.168.0.1&lt;br /&gt;
ct original ip daddr 192.168.1.0/24&lt;br /&gt;
ct reply ip daddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] l3proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original l3proto ipv4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original protocol 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-dst &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original proto-dst 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-src &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply proto-src 53&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;count [over] &amp;lt;number of connections&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct count over 2&lt;br /&gt;
&lt;br /&gt;
tcp dport 22 add @ssh_flood { ip saddr ct count over 2 } reject&lt;br /&gt;
[ which requires an existing ssh_flood set, ie. add set filter ssh_flood { type ipv4_addr; flags dynamic; } ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Meta ====&lt;br /&gt;
&lt;br /&gt;
[[Matching packet metainformation|&#039;&#039;meta&#039;&#039;]] matches packet by metainformation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|meta match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifname &amp;lt;input interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta iifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifname &amp;lt;output interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta oifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iif &amp;lt;input interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iif eth0&lt;br /&gt;
meta iif != eth0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oif &amp;lt;output interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oif lo&lt;br /&gt;
meta oif != lo&lt;br /&gt;
meta oif {eth0, lo}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iiftype &amp;lt;input interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta iiftype != ether&lt;br /&gt;
meta iiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oiftype &amp;lt;output interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface hardware type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta oiftype != ether&lt;br /&gt;
meta oiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Length of the packet in bytes&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta length 1000&lt;br /&gt;
meta length != 1000&lt;br /&gt;
meta length &amp;gt; 1000&lt;br /&gt;
meta length 33-45&lt;br /&gt;
meta length != 33-45&lt;br /&gt;
meta length { 33, 55, 67, 88 }&lt;br /&gt;
meta length { 33-55, 67-88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| ethertype protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta protocol ip&lt;br /&gt;
meta protocol != ip&lt;br /&gt;
meta protocol { ip, arp, ip6, vlan }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nfproto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta nfproto ipv4&lt;br /&gt;
meta nfproto != ipv6&lt;br /&gt;
meta nfproto { ipv4, ipv6 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;l4proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta l4proto 22&lt;br /&gt;
meta l4proto != 233&lt;br /&gt;
meta l4proto 33-45&lt;br /&gt;
meta l4proto { 33, 55, 67, 88 }&lt;br /&gt;
meta l4proto { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet mark&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta mark 0x4&lt;br /&gt;
meta mark 0x00000032&lt;br /&gt;
meta mark and 0x03 == 0x01&lt;br /&gt;
meta mark and 0x03 != 0x01&lt;br /&gt;
meta mark != 0x10&lt;br /&gt;
meta mark or 0x03 == 0x01&lt;br /&gt;
meta mark or 0x03 != 0x01&lt;br /&gt;
meta mark xor 0x03 == 0x01&lt;br /&gt;
meta mark xor 0x03 != 0x01&lt;br /&gt;
meta mark set 0xffffffc8 xor 0x16&lt;br /&gt;
meta mark set 0x16 and 0x16&lt;br /&gt;
meta mark set 0xffffffe9 or 0x16&lt;br /&gt;
meta mark set 0xffffffde and 0x16&lt;br /&gt;
meta mark set 0x32 or 0xfffff&lt;br /&gt;
meta mark set 0xfffe xor 0x16&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;priority [set] &amp;lt;priority&amp;gt;&#039;&#039;&lt;br /&gt;
| tc class id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta priority none&lt;br /&gt;
meta priority 0x1:0x1&lt;br /&gt;
meta priority 0x1:0xffff&lt;br /&gt;
meta priority 0xffff:0xffff&lt;br /&gt;
meta priority set 0x1:0x1&lt;br /&gt;
meta priority set 0x1:0xffff&lt;br /&gt;
meta priority set 0xffff:0xffff&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skuid &amp;lt;user id&amp;gt;&#039;&#039;&lt;br /&gt;
| UID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skuid {bin, root, daemon}&lt;br /&gt;
meta skuid root&lt;br /&gt;
meta skuid != root&lt;br /&gt;
meta skuid lt 3000&lt;br /&gt;
meta skuid gt 3000&lt;br /&gt;
meta skuid eq 3000&lt;br /&gt;
meta skuid 3001-3005&lt;br /&gt;
meta skuid != 2001-2005&lt;br /&gt;
meta skuid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skgid &amp;lt;group id&amp;gt;&#039;&#039;&lt;br /&gt;
| GID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skgid {bin, root, daemon}&lt;br /&gt;
meta skgid root&lt;br /&gt;
meta skgid != root&lt;br /&gt;
meta skgid lt 3000&lt;br /&gt;
meta skgid gt 3000&lt;br /&gt;
meta skgid eq 3000&lt;br /&gt;
meta skgid 3001-3005&lt;br /&gt;
meta skgid != 2001-2005&lt;br /&gt;
meta skgid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rtclassid &amp;lt;class&amp;gt;&#039;&#039;&lt;br /&gt;
| Routing realm&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta rtclassid cosmos&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pkttype &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta pkttype broadcast&lt;br /&gt;
meta pkttype != broadcast&lt;br /&gt;
meta pkttype { broadcast, unicast, multicast}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpu &amp;lt;cpu index&amp;gt;&#039;&#039;&lt;br /&gt;
| CPU ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cpu 1&lt;br /&gt;
meta cpu != 1&lt;br /&gt;
meta cpu 1-3&lt;br /&gt;
meta cpu != 1-2&lt;br /&gt;
meta cpu { 2,3 }&lt;br /&gt;
meta cpu { 2-3, 5-7 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifgroup &amp;lt;input group&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifgroup 0&lt;br /&gt;
meta iifgroup != 0&lt;br /&gt;
meta iifgroup default&lt;br /&gt;
meta iifgroup != default&lt;br /&gt;
meta iifgroup {default}&lt;br /&gt;
meta iifgroup { 11,33 }&lt;br /&gt;
meta iifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifgroup 0&lt;br /&gt;
meta oifgroup != 0&lt;br /&gt;
meta oifgroup default&lt;br /&gt;
meta oifgroup != default&lt;br /&gt;
meta oifgroup {default}&lt;br /&gt;
meta oifgroup { 11,33 }&lt;br /&gt;
meta oifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cgroup 1048577&lt;br /&gt;
meta cgroup != 1048577&lt;br /&gt;
meta cgroup { 1048577, 1048578 }&lt;br /&gt;
meta cgroup 1048577-1048578&lt;br /&gt;
meta cgroup != 1048577-1048578&lt;br /&gt;
meta cgroup {1048577-1048578}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Statements ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;statement&#039;&#039;&#039; is the action performed when the packet match the rule. It could be &#039;&#039;terminal&#039;&#039; and &#039;&#039;non-terminal&#039;&#039;. In a certain rule we can consider several non-terminal statements but only a single terminal statement.&lt;br /&gt;
&lt;br /&gt;
==== Verdict statements ====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;verdict statement&#039;&#039;&#039; alters control flow in the ruleset and issues policy decisions for packets. The valid verdict statements are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;accept&#039;&#039;: Accept the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;drop&#039;&#039;: Drop the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;queue&#039;&#039;: Queue the packet to userspace and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;continue&#039;&#039;: Continue the ruleset evaluation with the next rule.&lt;br /&gt;
* &#039;&#039;return&#039;&#039;: Return from the current chain and continue at the next rule of the last chain. In a base chain it is equivalent to accept&lt;br /&gt;
* &#039;&#039;jump &amp;lt;chain&amp;gt;&#039;&#039;: Continue at the first rule of &amp;lt;chain&amp;gt;. It will continue at the next rule after a return statement is issued&lt;br /&gt;
* &#039;&#039;goto &amp;lt;chain&amp;gt;&#039;&#039;: Similar to jump, but after the new chain the evaluation will continue at the last chain instead of the one containing the goto statement&lt;br /&gt;
&lt;br /&gt;
==== Log ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|log statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;level [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Log level&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log&lt;br /&gt;
log level emerg&lt;br /&gt;
log level alert&lt;br /&gt;
log level crit&lt;br /&gt;
log level err&lt;br /&gt;
log level warn&lt;br /&gt;
log level notice&lt;br /&gt;
log level info&lt;br /&gt;
log level debug&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;group &amp;lt;value&amp;gt; [queue-threshold &amp;lt;value&amp;gt;] [snaplen &amp;lt;value&amp;gt;] [prefix &amp;quot;&amp;lt;prefix&amp;gt;&amp;quot;]&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log prefix aaaaa-aaaaaa group 2 snaplen 33&lt;br /&gt;
log group 2 queue-threshold 2&lt;br /&gt;
log group 2 snaplen 33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reject ====&lt;br /&gt;
&lt;br /&gt;
The default &#039;&#039;&#039;reject&#039;&#039;&#039; will be the ICMP type &#039;&#039;&#039;port-unreachable&#039;&#039;&#039;. The &#039;&#039;&#039;icmpx&#039;&#039;&#039; is only used for inet family support.&lt;br /&gt;
&lt;br /&gt;
More information on the [[Rejecting_traffic]] page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|reject statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;with &amp;lt;protocol&amp;gt; type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
reject&lt;br /&gt;
reject with icmp type host-unreachable&lt;br /&gt;
reject with icmp type net-unreachable&lt;br /&gt;
reject with icmp type prot-unreachable&lt;br /&gt;
reject with icmp type port-unreachable&lt;br /&gt;
reject with icmp type net-prohibited&lt;br /&gt;
reject with icmp type host-prohibited&lt;br /&gt;
reject with icmp type admin-prohibited&lt;br /&gt;
reject with icmpv6 type no-route&lt;br /&gt;
reject with icmpv6 type admin-prohibited&lt;br /&gt;
reject with icmpv6 type addr-unreachable&lt;br /&gt;
reject with icmpv6 type port-unreachable&lt;br /&gt;
reject with icmpx type host-unreachable&lt;br /&gt;
reject with icmpx type no-route&lt;br /&gt;
reject with icmpx type admin-prohibited&lt;br /&gt;
reject with icmpx type port-unreachable&lt;br /&gt;
ip protocol tcp reject with tcp reset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Counter ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|counter statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;packets &amp;lt;packets&amp;gt; bytes &amp;lt;bytes&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
counter&lt;br /&gt;
counter packets 0 bytes 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Limit ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|limit statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rate [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Rate limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
limit rate 400/minute&lt;br /&gt;
limit rate 400/hour&lt;br /&gt;
limit rate over 40/day&lt;br /&gt;
limit rate over 400/week&lt;br /&gt;
limit rate over 1023/second burst 10 packets&lt;br /&gt;
limit rate 1025 kbytes/second&lt;br /&gt;
limit rate 1023000 mbytes/second&lt;br /&gt;
limit rate 1025 bytes/second burst 512 bytes&lt;br /&gt;
limit rate 1025 kbytes/second burst 1023 kbytes&lt;br /&gt;
limit rate 1025 mbytes/second burst 1025 kbytes&lt;br /&gt;
limit rate 1025000 mbytes/second burst 1023 mbytes&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nat ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|nat statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dnat to &amp;lt;destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dnat to 192.168.3.2&lt;br /&gt;
dnat to ct mark map { 0x00000014 : 1.2.3.4}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;snat to &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
snat to 192.168.3.2&lt;br /&gt;
snat to 2001:838:35f:1::-2001:838:35f:2:::100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;masquerade [&amp;lt;type&amp;gt;] [to :&amp;lt;port&amp;gt;]&#039;&#039;&lt;br /&gt;
| Masquerade&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
masquerade&lt;br /&gt;
masquerade persistent,fully-random,random&lt;br /&gt;
masquerade to :1024&lt;br /&gt;
masquerade to :1024-2048&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Queue ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|queue statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;num &amp;lt;value&amp;gt; &amp;lt;scheduler&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
queue&lt;br /&gt;
queue num 2&lt;br /&gt;
queue num 2-3&lt;br /&gt;
queue num 4-5 fanout bypass&lt;br /&gt;
queue num 4-5 fanout&lt;br /&gt;
queue num 4-5 bypass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Export Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft export (xml | json)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monitor Events ===&lt;br /&gt;
&lt;br /&gt;
Monitor events from Netlink creating filters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft monitor [new | destroy] [tables | chains | sets | rules | elements] [xml | json]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Nft scripting =&lt;br /&gt;
&lt;br /&gt;
== List ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flush ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Load ruleset ==&lt;br /&gt;
&lt;br /&gt;
Create a command batch file and load it with the nft interpreter,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% echo &amp;quot;flush ruleset&amp;quot; &amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add table filter&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add chain filter input&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add rule filter input meta iifname lo accept&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/nftables.rules&lt;br /&gt;
&amp;gt; #!/usr/local/sbin/nft -f&lt;br /&gt;
&amp;gt; flush ruleset&lt;br /&gt;
&amp;gt; add table filter&lt;br /&gt;
&amp;gt; add chain filter input&lt;br /&gt;
&amp;gt; add rule filter input meta iifname lo accept&lt;br /&gt;
&amp;gt; EOF&lt;br /&gt;
% chmod u+x /etc/nftables.rules&lt;br /&gt;
% /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file from an already created ruleset,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset &amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
== Simple IP/IPv6 Firewall ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    icmp type echo-request accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table ip6 firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # invalid connections&lt;br /&gt;
    ct state invalid drop&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    # routers may also want: mld-listener-query, nd-router-solicit&lt;br /&gt;
    icmpv6 type {echo-request,nd-neighbor-solicit} accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=1094</id>
		<title>Quick reference-nftables in 10 minutes</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=1094"/>
		<updated>2023-08-29T13:44:14Z</updated>

		<summary type="html">&lt;p&gt;Pablo: incorrect copy, paste and mangle&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Find below some basic concepts to know before using nftables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;table&#039;&#039;&#039; refers to a container of [[Configuring chains|chains]] with no specific semantics.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;chain&#039;&#039;&#039; within a [[Configuring tables|table]] refers to a container of [[Simple rule management|rules]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rule&#039;&#039;&#039; refers to an action to be configured within a &#039;&#039;chain&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= nft command line =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;nft&#039;&#039; is the command line tool in order to interact with nftables at userspace.&lt;br /&gt;
&lt;br /&gt;
== Tables ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;family&#039;&#039;&#039; refers to a one of the following table types: &#039;&#039;ip&#039;&#039;, &#039;&#039;arp&#039;&#039;, &#039;&#039;ip6&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;inet&#039;&#039;, &#039;&#039;netdev&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list tables [&amp;lt;family&amp;gt;]&lt;br /&gt;
% nft list table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt; [-n] [-a]&lt;br /&gt;
% nft (add | delete | flush) table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The argument &#039;&#039;-n&#039;&#039; shows the addresses and other information that uses names in numeric format. The &#039;&#039;-a&#039;&#039; argument is used to display the &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Chains ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;type&#039;&#039;&#039; refers to the kind of chain to be created. Possible types are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;filter&#039;&#039;: Supported by &#039;&#039;arp&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; table families.&lt;br /&gt;
* &#039;&#039;route&#039;&#039;: Mark packets (like mangle for the &#039;&#039;output&#039;&#039; hook, for other hooks use the type &#039;&#039;filter&#039;&#039; instead), supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
* &#039;&#039;nat&#039;&#039;: In order to perform Network Address Translation, supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hook&#039;&#039;&#039; refers to an specific stage of the packet while it&#039;s being processed through the kernel. More info in [[Netfilter_hooks|Netfilter hooks]].&lt;br /&gt;
&lt;br /&gt;
* The hooks for &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; families are: &#039;&#039;prerouting&#039;&#039;, &#039;&#039;input&#039;&#039;, &#039;&#039;forward&#039;&#039;, &#039;&#039;output&#039;&#039;, &#039;&#039;postrouting&#039;&#039;.&lt;br /&gt;
* The hooks for &#039;&#039;arp&#039;&#039; family are: &#039;&#039; input&#039;&#039;, &#039;&#039;output&#039;&#039;.&lt;br /&gt;
* The &#039;&#039;bridge&#039;&#039; family handles ethernet packets traversing bridge devices.&lt;br /&gt;
* The hook for &#039;&#039;netdev&#039;&#039; is: &#039;&#039;ingress&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;priority&#039;&#039;&#039; refers to a number used to order the chains or to set them between some Netfilter operations. Possible values are: &#039;&#039;NF_IP_PRI_CONNTRACK_DEFRAG (-400)&#039;&#039;, &#039;&#039;NF_IP_PRI_RAW (-300)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_FIRST (-225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK (-200)&#039;&#039;, &#039;&#039;NF_IP_PRI_MANGLE (-150)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_DST (-100)&#039;&#039;, &#039;&#039;NF_IP_PRI_FILTER (0)&#039;&#039;, &#039;&#039;NF_IP_PRI_SECURITY (50)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_SRC (100)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_LAST (225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK_HELPER (300)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;policy&#039;&#039;&#039; is the default verdict statement to control the flow in the base chain. Possible values are: &#039;&#039;accept&#039;&#039; (default) and &#039;&#039;drop&#039;&#039;. Warning: Setting the policy to &#039;&#039;drop&#039;&#039; discards all packets that&lt;br /&gt;
have not been accepted by the ruleset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ { type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy &amp;lt;policy&amp;gt; \;] } ]&lt;br /&gt;
% nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
% nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;handle&#039;&#039;&#039; is an internal number that identifies a certain &#039;&#039;rule&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;position&#039;&#039;&#039; is an internal number that is used to insert a &#039;&#039;rule&#039;&#039; before a certain &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft insert rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [position &amp;lt;position&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft replace rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft delete rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matches ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;matches&#039;&#039;&#039; are clues used to access to certain packet information and create filters according to them.&lt;br /&gt;
&lt;br /&gt;
==== Ip ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip match&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip dscp cs1&lt;br /&gt;
ip dscp != cs1&lt;br /&gt;
ip dscp 0x38&lt;br /&gt;
ip dscp != 0x20&lt;br /&gt;
ip dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, &lt;br /&gt;
af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip length 232&lt;br /&gt;
ip length != 233&lt;br /&gt;
ip length 333-435&lt;br /&gt;
ip length != 333-453&lt;br /&gt;
ip length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;id&amp;gt;&#039;&#039;&lt;br /&gt;
| IP ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip id 22&lt;br /&gt;
ip id != 233&lt;br /&gt;
ip id 33-45&lt;br /&gt;
ip id != 33-45&lt;br /&gt;
ip id { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Fragmentation offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip frag-off 222&lt;br /&gt;
ip frag-off != 233&lt;br /&gt;
ip frag-off 33-45&lt;br /&gt;
ip frag-off != 33-45&lt;br /&gt;
ip frag-off { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ttl &amp;lt;ttl&amp;gt;&#039;&#039;&lt;br /&gt;
| Time to live&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip ttl 0&lt;br /&gt;
ip ttl 233&lt;br /&gt;
ip ttl 33-55&lt;br /&gt;
ip ttl != 45-50&lt;br /&gt;
ip ttl { 43, 53, 45 }&lt;br /&gt;
ip ttl { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Upper layer protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip protocol tcp&lt;br /&gt;
ip protocol 6&lt;br /&gt;
ip protocol != tcp&lt;br /&gt;
ip protocol { icmp, esp, ah, comp, udp, udplite, tcp, dccp, sctp }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip checksum 13172&lt;br /&gt;
ip checksum 22&lt;br /&gt;
ip checksum != 233&lt;br /&gt;
ip checksum 33-45&lt;br /&gt;
ip checksum != 33-45&lt;br /&gt;
ip checksum { 33, 55, 67, 88 }&lt;br /&gt;
ip checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip saddr 192.168.2.0/24&lt;br /&gt;
ip saddr != 192.168.2.0/24&lt;br /&gt;
ip saddr 192.168.3.1 ip daddr 192.168.3.100&lt;br /&gt;
ip saddr != 1.1.1.1&lt;br /&gt;
ip saddr 1.1.1.1&lt;br /&gt;
ip saddr &amp;amp; 0xff == 1&lt;br /&gt;
ip saddr &amp;amp; 0.0.0.255 &amp;lt; 0.0.0.127&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip daddr 192.168.0.1&lt;br /&gt;
ip daddr != 192.168.0.1&lt;br /&gt;
ip daddr 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr 10.0.0.0-10.255.255.255&lt;br /&gt;
ip daddr 172.16.0.0-172.31.255.255&lt;br /&gt;
ip daddr 192.168.3.1-192.168.4.250&lt;br /&gt;
ip daddr != 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr { 192.168.0.1-192.168.0.250 }&lt;br /&gt;
ip daddr { 192.168.5.1, 192.168.5.2, 192.168.5.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| Ip Header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip version 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;header length&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip hdrlength 0&lt;br /&gt;
ip hdrlength 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ip6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 dscp cs1&lt;br /&gt;
ip6 dscp != cs1&lt;br /&gt;
ip6 dscp 0x38&lt;br /&gt;
ip6 dscp != 0x20&lt;br /&gt;
ip6 dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flowlabel &amp;lt;label&amp;gt;&#039;&#039;&lt;br /&gt;
| Flow label&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 flowlabel 22&lt;br /&gt;
ip6 flowlabel != 233&lt;br /&gt;
ip6 flowlabel { 33, 55, 67, 88 }&lt;br /&gt;
ip6 flowlabel { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 length 232&lt;br /&gt;
ip6 length != 233&lt;br /&gt;
ip6 length 333-435&lt;br /&gt;
ip6 length != 333-453&lt;br /&gt;
ip6 length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;header&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header type (Upper layer protocol number)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 nexthdr {esp, udp, ah, comp, udplite, tcp, dccp, sctp, icmpv6}&lt;br /&gt;
ip6 nexthdr esp&lt;br /&gt;
ip6 nexthdr != esp&lt;br /&gt;
ip6 nexthdr { 33-44 }&lt;br /&gt;
ip6 nexthdr 33-44&lt;br /&gt;
ip6 nexthdr != 33-44&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hoplimit &amp;lt;hoplimit&amp;gt;&#039;&#039;&lt;br /&gt;
| Hop limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 hoplimit 1&lt;br /&gt;
ip6 hoplimit != 233&lt;br /&gt;
ip6 hoplimit 33-45&lt;br /&gt;
ip6 hoplimit != 33-45&lt;br /&gt;
ip6 hoplimit {33, 55, 67, 88}&lt;br /&gt;
ip6 hoplimit {33-55}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 saddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::/64&lt;br /&gt;
ip6 saddr ::1 ip6 daddr ::2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 daddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 daddr != ::1234:1234:1234:1234:1234:1234:1234-1234:1234::1234:1234:1234:1234:1234&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 version 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Tcp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|tcp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp dport 22&lt;br /&gt;
tcp dport != 33-45&lt;br /&gt;
tcp dport { 33-55 }&lt;br /&gt;
tcp dport {telnet, http, https }&lt;br /&gt;
tcp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
tcp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sport 22&lt;br /&gt;
tcp sport != 33-45&lt;br /&gt;
tcp sport { 33, 55, 67, 88}&lt;br /&gt;
tcp sport { 33-55}&lt;br /&gt;
tcp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
tcp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sequence 22&lt;br /&gt;
tcp sequence != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ackseq &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Acknowledgement number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp ackseq 22&lt;br /&gt;
tcp ackseq != 33-45&lt;br /&gt;
tcp ackseq { 33, 55, 67, 88 }&lt;br /&gt;
tcp ackseq { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| TCP flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp flags { fin, syn, rst, psh, ack, urg, ecn, cwr}&lt;br /&gt;
tcp flags cwr&lt;br /&gt;
tcp flags != cwr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;window &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Window&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp window 22&lt;br /&gt;
tcp window != 33-45&lt;br /&gt;
tcp window { 33, 55, 67, 88 }&lt;br /&gt;
tcp window { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp checksum 22&lt;br /&gt;
tcp checksum != 33-45&lt;br /&gt;
tcp checksum { 33, 55, 67, 88 }&lt;br /&gt;
tcp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;urgptr &amp;lt;pointer&amp;gt;&#039;&#039;&lt;br /&gt;
| Urgent pointer&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp urgptr 22&lt;br /&gt;
tcp urgptr != 33-45&lt;br /&gt;
tcp urgptr { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;doff &amp;lt;offset&amp;gt;&#039;&#039;&lt;br /&gt;
| Data offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp doff 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp dport 22&lt;br /&gt;
udp dport != 33-45&lt;br /&gt;
udp dport { 33-55 }&lt;br /&gt;
udp dport {telnet, http, https }&lt;br /&gt;
udp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp sport 22&lt;br /&gt;
udp sport != 33-45&lt;br /&gt;
udp sport { 33, 55, 67, 88}&lt;br /&gt;
udp sport { 33-55}&lt;br /&gt;
udp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udp sport 1024 udp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp length 6666&lt;br /&gt;
udp length != 50-65&lt;br /&gt;
udp length { 50, 65 }&lt;br /&gt;
udp length { 35-50 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| UDP checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp checksum 22&lt;br /&gt;
udp checksum != 33-45&lt;br /&gt;
udp checksum { 33, 55, 67, 88 }&lt;br /&gt;
udp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udplite ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udplite match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite dport 22&lt;br /&gt;
udplite dport != 33-45&lt;br /&gt;
udplite dport { 33-55 }&lt;br /&gt;
udplite dport {telnet, http, https }&lt;br /&gt;
udplite dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udplite dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite sport 22&lt;br /&gt;
udplite sport != 33-45&lt;br /&gt;
udplite sport { 33, 55, 67, 88}&lt;br /&gt;
udplite sport { 33-55}&lt;br /&gt;
udplite sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udplite sport 1024 udplite dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite checksum 22&lt;br /&gt;
udplite checksum != 33-45&lt;br /&gt;
udplite checksum { 33, 55, 67, 88 }&lt;br /&gt;
udplite checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sctp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|sctp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp dport 22&lt;br /&gt;
sctp dport != 33-45&lt;br /&gt;
sctp dport { 33-55 }&lt;br /&gt;
sctp dport {telnet, http, https }&lt;br /&gt;
sctp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
sctp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp sport 22&lt;br /&gt;
sctp sport != 33-45&lt;br /&gt;
sctp sport { 33, 55, 67, 88}&lt;br /&gt;
sctp sport { 33-55}&lt;br /&gt;
sctp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
sctp sport 1024 sctp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp checksum 22&lt;br /&gt;
sctp checksum != 33-45&lt;br /&gt;
sctp checksum { 33, 55, 67, 88 }&lt;br /&gt;
sctp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;vtag &amp;lt;tag&amp;gt;&#039;&#039;&lt;br /&gt;
| Verification tag&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp vtag 22&lt;br /&gt;
sctp vtag != 33-45&lt;br /&gt;
sctp vtag { 33, 55, 67, 88 }&lt;br /&gt;
sctp vtag { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;chunk &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Existence of a chunk with given type in packet&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp chunk init exists&lt;br /&gt;
sctp chunk error missing&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;chunk &amp;lt;type&amp;gt; &amp;lt;field&amp;gt;&#039;&#039;&lt;br /&gt;
| A chunk&#039;s field value (implies chunk existence)&lt;br /&gt;
|&amp;lt;sourcex lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp chunk init flags 0x1&lt;br /&gt;
sctp chunk data tsn 0x23&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Dccp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dccp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp dport 22&lt;br /&gt;
dccp dport != 33-45&lt;br /&gt;
dccp dport { 33-55 }&lt;br /&gt;
dccp dport {telnet, http, https }&lt;br /&gt;
dccp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
dccp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp sport 22&lt;br /&gt;
dccp sport != 33-45&lt;br /&gt;
dccp sport { 33, 55, 67, 88}&lt;br /&gt;
dccp sport { 33-55}&lt;br /&gt;
dccp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
dccp sport 1024 dccp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Type of packet&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp type {request, response, data, ack, dataack, closereq, close, reset, sync, syncack}&lt;br /&gt;
dccp type request&lt;br /&gt;
dccp type != request&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ah ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ah match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| AH header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah hdrlength 11-23&lt;br /&gt;
ah hdrlength != 11-23&lt;br /&gt;
ah hdrlength {11, 23, 44 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah reserved 22&lt;br /&gt;
ah reserved != 33-45&lt;br /&gt;
ah reserved {23, 100 }&lt;br /&gt;
ah reserved { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah spi 111&lt;br /&gt;
ah spi != 111-222&lt;br /&gt;
ah spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah sequence 123&lt;br /&gt;
ah sequence {23, 25, 33}&lt;br /&gt;
ah sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Esp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|esp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp spi 111&lt;br /&gt;
esp spi != 111-222&lt;br /&gt;
esp spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp sequence 123&lt;br /&gt;
esp sequence {23, 25, 33}&lt;br /&gt;
esp sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Comp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|comp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header protocol (Upper layer protocol)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp nexthdr != esp&lt;br /&gt;
comp nexthdr {esp, ah, comp, udp, udplite, tcp, tcp, dccp, sctp}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| Flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp flags 0x0&lt;br /&gt;
comp flags != 0x33-0x45&lt;br /&gt;
comp flags {0x33, 0x55, 0x67, 0x88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Compression Parameter Index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp cpi 22&lt;br /&gt;
comp cpi != 33-45&lt;br /&gt;
comp cpi {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp type {echo-reply, destination-unreachable, source-quench, redirect, echo-request, time-exceeded, parameter-problem, timestamp-request, timestamp-reply, info-request, info-reply, address-mask-request, address-mask-reply, router-advertisement, router-solicitation}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp code 111&lt;br /&gt;
icmp code != 33-55&lt;br /&gt;
icmp code { 2, 4, 54, 33, 56}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp checksum 12343&lt;br /&gt;
icmp checksum != 11-343&lt;br /&gt;
icmp checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp id 12343&lt;br /&gt;
icmp id != 11-343&lt;br /&gt;
icmp id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp sequence 12343&lt;br /&gt;
icmp sequence != 11-343&lt;br /&gt;
icmp sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp mtu 12343&lt;br /&gt;
icmp mtu != 11-343&lt;br /&gt;
icmp mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;gateway &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet gateway&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp gateway 12343&lt;br /&gt;
icmp gateway != 11-343&lt;br /&gt;
icmp gateway { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmpv6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmpv6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 type {destination-unreachable, packet-too-big, time-exceeded, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, nd-redirect, parameter-problem, router-renumbering}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 code 4&lt;br /&gt;
icmpv6 code 3-66&lt;br /&gt;
icmpv6 code {5, 6, 7}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 checksum 12343&lt;br /&gt;
icmpv6 checksum != 11-343&lt;br /&gt;
icmpv6 checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 id 12343&lt;br /&gt;
icmpv6 id != 11-343&lt;br /&gt;
icmpv6 id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 sequence 12343&lt;br /&gt;
icmpv6 sequence != 11-343&lt;br /&gt;
icmpv6 sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 mtu 12343&lt;br /&gt;
icmpv6 mtu != 11-343&lt;br /&gt;
icmpv6 mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;max-delay &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet max delay&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 max-delay 33-45&lt;br /&gt;
icmpv6 max-delay != 33-45&lt;br /&gt;
icmpv6 max-delay {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ether ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ether match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;mac address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source mac address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether saddr 00:0f:54:0c:11:04&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether type vlan&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Dst ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dst match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp}&lt;br /&gt;
dst nexthdr 22&lt;br /&gt;
dst nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst hdrlength 22&lt;br /&gt;
dst hdrlength != 33-45&lt;br /&gt;
dst hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Frag ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|frag match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp, icmp}&lt;br /&gt;
frag nexthdr 6&lt;br /&gt;
frag nexthdr != 50-51&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag reserved 22&lt;br /&gt;
frag reserved != 33-45&lt;br /&gt;
frag reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag frag-off 22&lt;br /&gt;
frag frag-off != 33-45&lt;br /&gt;
frag frag-off { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;more-fragments &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag id 1&lt;br /&gt;
frag id 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Hbh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|hbh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, icmpv6}&lt;br /&gt;
hbh nexthdr 22&lt;br /&gt;
hbh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh hdrlength 22&lt;br /&gt;
hbh hdrlength != 33-45&lt;br /&gt;
hbh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Mh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|mh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
mh nexthdr 22&lt;br /&gt;
mh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh hdrlength 22&lt;br /&gt;
mh hdrlength != 33-45&lt;br /&gt;
mh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh type {binding-refresh-request, home-test-init, careof-test-init, home-test, careof-test, binding-update, binding-acknowledgement, binding-error, fast-binding-update, fast-binding-acknowledgement, fast-binding-advertisement, experimental-mobility-header, home-agent-switch-message}&lt;br /&gt;
mh type home-agent-switch-message&lt;br /&gt;
mh type != home-agent-switch-message&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh reserved 22&lt;br /&gt;
mh reserved != 33-45&lt;br /&gt;
mh reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh checksum 22&lt;br /&gt;
mh checksum != 33-45&lt;br /&gt;
mh checksum { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Rt ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|rt match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
rt nexthdr 22&lt;br /&gt;
rt nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt hdrlength 22&lt;br /&gt;
rt hdrlength != 33-45&lt;br /&gt;
rt hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt type 22&lt;br /&gt;
rt type != 33-45&lt;br /&gt;
rt type { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;seg-left &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt seg-left 22&lt;br /&gt;
rt seg-left != 33-45&lt;br /&gt;
rt seg-left { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Vlan ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|vlan match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Vlan tag ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan id 4094&lt;br /&gt;
vlan id 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cfi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan cfi 0&lt;br /&gt;
vlan cfi 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pcp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan pcp 7&lt;br /&gt;
vlan pcp 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Arp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|arp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ptype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp ptype 0x0800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;htype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Header type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp htype 1&lt;br /&gt;
arp htype != 33-45&lt;br /&gt;
arp htype { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hlen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp hlen 1&lt;br /&gt;
arp hlen != 33-45&lt;br /&gt;
arp hlen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;plen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp plen 1&lt;br /&gt;
arp plen != 33-45&lt;br /&gt;
arp plen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;operation &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp operation {nak, inreply, inrequest, rreply, rrequest, reply, request}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ct ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ct match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;state &amp;lt;state&amp;gt;&#039;&#039;&lt;br /&gt;
| State of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct state { new, established, related, untracked }&lt;br /&gt;
ct state != related&lt;br /&gt;
ct state established&lt;br /&gt;
ct state 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;direction &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Direction of the packet relative to the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct direction original&lt;br /&gt;
ct direction != original&lt;br /&gt;
ct direction {reply, original}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;status &amp;lt;status&amp;gt;&#039;&#039;&lt;br /&gt;
| Status of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct status expected&lt;br /&gt;
(ct status &amp;amp; expected) != expected&lt;br /&gt;
ct status {expected,seen-reply,assured,confirmed,snat,dnat,dying}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Mark of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct mark 0&lt;br /&gt;
ct mark or 0x23 == 0x11&lt;br /&gt;
ct mark or 0x3 != 0x1&lt;br /&gt;
ct mark and 0x23 == 0x11&lt;br /&gt;
ct mark and 0x3 != 0x1&lt;br /&gt;
ct mark xor 0x23 == 0x11&lt;br /&gt;
ct mark xor 0x3 != 0x1&lt;br /&gt;
ct mark 0x00000032&lt;br /&gt;
ct mark != 0x00000032&lt;br /&gt;
ct mark 0x00000032-0x00000045&lt;br /&gt;
ct mark != 0x00000032-0x00000045&lt;br /&gt;
ct mark {0x32, 0x2222, 0x42de3}&lt;br /&gt;
ct mark {0x32-0x2222, 0x4444-0x42de3}&lt;br /&gt;
ct mark set 0x11 xor 0x1331&lt;br /&gt;
ct mark set 0x11333 and 0x11&lt;br /&gt;
ct mark set 0x12 or 0x11&lt;br /&gt;
ct mark set 0x11&lt;br /&gt;
ct mark set mark&lt;br /&gt;
ct mark set mark map { 1 : 10, 2 : 20, 3 : 30 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;expiration &amp;lt;time&amp;gt;&#039;&#039;&lt;br /&gt;
| Connection expiration time&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct expiration 30&lt;br /&gt;
ct expiration 30s&lt;br /&gt;
ct expiration != 233&lt;br /&gt;
ct expiration != 3m53s&lt;br /&gt;
ct expiration 33-45&lt;br /&gt;
ct expiration 33s-45s&lt;br /&gt;
ct expiration != 33-45&lt;br /&gt;
ct expiration != 33s-45s&lt;br /&gt;
ct expiration {33, 55, 67, 88}&lt;br /&gt;
ct expiration { 1m7s, 33s, 55s, 1m28s}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;helper &amp;quot;&amp;lt;helper&amp;gt;&amp;quot;&#039;&#039;&lt;br /&gt;
| Helper associated with the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct helper &amp;quot;ftp&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] bytes &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original bytes &amp;gt; 100000&lt;br /&gt;
ct bytes &amp;gt; 100000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] packets &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply packets &amp;lt; 100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip saddr 192.168.0.1&lt;br /&gt;
ct reply ip saddr 192.168.0.1&lt;br /&gt;
ct original ip saddr 192.168.1.0/24&lt;br /&gt;
ct reply ip saddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip daddr 192.168.0.1&lt;br /&gt;
ct reply ip daddr 192.168.0.1&lt;br /&gt;
ct original ip daddr 192.168.1.0/24&lt;br /&gt;
ct reply ip daddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] l3proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original l3proto ipv4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original protocol 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-dst &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original proto-dst 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-src &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply proto-src 53&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;count [over] &amp;lt;number of connections&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct count over 2&lt;br /&gt;
&lt;br /&gt;
tcp dport 22 add @ssh_flood { ip saddr ct count over 2 } reject&lt;br /&gt;
[ which requires an existing ssh_flood set, ie. add set filter ssh_flood { type ipv4_addr; flags dynamic; } ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Meta ====&lt;br /&gt;
&lt;br /&gt;
[[Matching packet metainformation|&#039;&#039;meta&#039;&#039;]] matches packet by metainformation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|meta match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifname &amp;lt;input interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta iifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifname &amp;lt;output interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta oifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iif &amp;lt;input interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iif eth0&lt;br /&gt;
meta iif != eth0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oif &amp;lt;output interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oif lo&lt;br /&gt;
meta oif != lo&lt;br /&gt;
meta oif {eth0, lo}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iiftype &amp;lt;input interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta iiftype != ether&lt;br /&gt;
meta iiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oiftype &amp;lt;output interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface hardware type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta oiftype != ether&lt;br /&gt;
meta oiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Length of the packet in bytes&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta length 1000&lt;br /&gt;
meta length != 1000&lt;br /&gt;
meta length &amp;gt; 1000&lt;br /&gt;
meta length 33-45&lt;br /&gt;
meta length != 33-45&lt;br /&gt;
meta length { 33, 55, 67, 88 }&lt;br /&gt;
meta length { 33-55, 67-88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| ethertype protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta protocol ip&lt;br /&gt;
meta protocol != ip&lt;br /&gt;
meta protocol { ip, arp, ip6, vlan }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nfproto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta nfproto ipv4&lt;br /&gt;
meta nfproto != ipv6&lt;br /&gt;
meta nfproto { ipv4, ipv6 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;l4proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta l4proto 22&lt;br /&gt;
meta l4proto != 233&lt;br /&gt;
meta l4proto 33-45&lt;br /&gt;
meta l4proto { 33, 55, 67, 88 }&lt;br /&gt;
meta l4proto { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet mark&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta mark 0x4&lt;br /&gt;
meta mark 0x00000032&lt;br /&gt;
meta mark and 0x03 == 0x01&lt;br /&gt;
meta mark and 0x03 != 0x01&lt;br /&gt;
meta mark != 0x10&lt;br /&gt;
meta mark or 0x03 == 0x01&lt;br /&gt;
meta mark or 0x03 != 0x01&lt;br /&gt;
meta mark xor 0x03 == 0x01&lt;br /&gt;
meta mark xor 0x03 != 0x01&lt;br /&gt;
meta mark set 0xffffffc8 xor 0x16&lt;br /&gt;
meta mark set 0x16 and 0x16&lt;br /&gt;
meta mark set 0xffffffe9 or 0x16&lt;br /&gt;
meta mark set 0xffffffde and 0x16&lt;br /&gt;
meta mark set 0x32 or 0xfffff&lt;br /&gt;
meta mark set 0xfffe xor 0x16&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;priority [set] &amp;lt;priority&amp;gt;&#039;&#039;&lt;br /&gt;
| tc class id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta priority none&lt;br /&gt;
meta priority 0x1:0x1&lt;br /&gt;
meta priority 0x1:0xffff&lt;br /&gt;
meta priority 0xffff:0xffff&lt;br /&gt;
meta priority set 0x1:0x1&lt;br /&gt;
meta priority set 0x1:0xffff&lt;br /&gt;
meta priority set 0xffff:0xffff&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skuid &amp;lt;user id&amp;gt;&#039;&#039;&lt;br /&gt;
| UID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skuid {bin, root, daemon}&lt;br /&gt;
meta skuid root&lt;br /&gt;
meta skuid != root&lt;br /&gt;
meta skuid lt 3000&lt;br /&gt;
meta skuid gt 3000&lt;br /&gt;
meta skuid eq 3000&lt;br /&gt;
meta skuid 3001-3005&lt;br /&gt;
meta skuid != 2001-2005&lt;br /&gt;
meta skuid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skgid &amp;lt;group id&amp;gt;&#039;&#039;&lt;br /&gt;
| GID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skgid {bin, root, daemon}&lt;br /&gt;
meta skgid root&lt;br /&gt;
meta skgid != root&lt;br /&gt;
meta skgid lt 3000&lt;br /&gt;
meta skgid gt 3000&lt;br /&gt;
meta skgid eq 3000&lt;br /&gt;
meta skgid 3001-3005&lt;br /&gt;
meta skgid != 2001-2005&lt;br /&gt;
meta skgid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rtclassid &amp;lt;class&amp;gt;&#039;&#039;&lt;br /&gt;
| Routing realm&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta rtclassid cosmos&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pkttype &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta pkttype broadcast&lt;br /&gt;
meta pkttype != broadcast&lt;br /&gt;
meta pkttype { broadcast, unicast, multicast}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpu &amp;lt;cpu index&amp;gt;&#039;&#039;&lt;br /&gt;
| CPU ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cpu 1&lt;br /&gt;
meta cpu != 1&lt;br /&gt;
meta cpu 1-3&lt;br /&gt;
meta cpu != 1-2&lt;br /&gt;
meta cpu { 2,3 }&lt;br /&gt;
meta cpu { 2-3, 5-7 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifgroup &amp;lt;input group&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifgroup 0&lt;br /&gt;
meta iifgroup != 0&lt;br /&gt;
meta iifgroup default&lt;br /&gt;
meta iifgroup != default&lt;br /&gt;
meta iifgroup {default}&lt;br /&gt;
meta iifgroup { 11,33 }&lt;br /&gt;
meta iifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifgroup 0&lt;br /&gt;
meta oifgroup != 0&lt;br /&gt;
meta oifgroup default&lt;br /&gt;
meta oifgroup != default&lt;br /&gt;
meta oifgroup {default}&lt;br /&gt;
meta oifgroup { 11,33 }&lt;br /&gt;
meta oifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cgroup 1048577&lt;br /&gt;
meta cgroup != 1048577&lt;br /&gt;
meta cgroup { 1048577, 1048578 }&lt;br /&gt;
meta cgroup 1048577-1048578&lt;br /&gt;
meta cgroup != 1048577-1048578&lt;br /&gt;
meta cgroup {1048577-1048578}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Statements ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;statement&#039;&#039;&#039; is the action performed when the packet match the rule. It could be &#039;&#039;terminal&#039;&#039; and &#039;&#039;non-terminal&#039;&#039;. In a certain rule we can consider several non-terminal statements but only a single terminal statement.&lt;br /&gt;
&lt;br /&gt;
==== Verdict statements ====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;verdict statement&#039;&#039;&#039; alters control flow in the ruleset and issues policy decisions for packets. The valid verdict statements are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;accept&#039;&#039;: Accept the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;drop&#039;&#039;: Drop the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;queue&#039;&#039;: Queue the packet to userspace and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;continue&#039;&#039;: Continue the ruleset evaluation with the next rule.&lt;br /&gt;
* &#039;&#039;return&#039;&#039;: Return from the current chain and continue at the next rule of the last chain. In a base chain it is equivalent to accept&lt;br /&gt;
* &#039;&#039;jump &amp;lt;chain&amp;gt;&#039;&#039;: Continue at the first rule of &amp;lt;chain&amp;gt;. It will continue at the next rule after a return statement is issued&lt;br /&gt;
* &#039;&#039;goto &amp;lt;chain&amp;gt;&#039;&#039;: Similar to jump, but after the new chain the evaluation will continue at the last chain instead of the one containing the goto statement&lt;br /&gt;
&lt;br /&gt;
==== Log ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|log statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;level [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Log level&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log&lt;br /&gt;
log level emerg&lt;br /&gt;
log level alert&lt;br /&gt;
log level crit&lt;br /&gt;
log level err&lt;br /&gt;
log level warn&lt;br /&gt;
log level notice&lt;br /&gt;
log level info&lt;br /&gt;
log level debug&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;group &amp;lt;value&amp;gt; [queue-threshold &amp;lt;value&amp;gt;] [snaplen &amp;lt;value&amp;gt;] [prefix &amp;quot;&amp;lt;prefix&amp;gt;&amp;quot;]&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log prefix aaaaa-aaaaaa group 2 snaplen 33&lt;br /&gt;
log group 2 queue-threshold 2&lt;br /&gt;
log group 2 snaplen 33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reject ====&lt;br /&gt;
&lt;br /&gt;
The default &#039;&#039;&#039;reject&#039;&#039;&#039; will be the ICMP type &#039;&#039;&#039;port-unreachable&#039;&#039;&#039;. The &#039;&#039;&#039;icmpx&#039;&#039;&#039; is only used for inet family support.&lt;br /&gt;
&lt;br /&gt;
More information on the [[Rejecting_traffic]] page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|reject statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;with &amp;lt;protocol&amp;gt; type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
reject&lt;br /&gt;
reject with icmp type host-unreachable&lt;br /&gt;
reject with icmp type net-unreachable&lt;br /&gt;
reject with icmp type prot-unreachable&lt;br /&gt;
reject with icmp type port-unreachable&lt;br /&gt;
reject with icmp type net-prohibited&lt;br /&gt;
reject with icmp type host-prohibited&lt;br /&gt;
reject with icmp type admin-prohibited&lt;br /&gt;
reject with icmpv6 type no-route&lt;br /&gt;
reject with icmpv6 type admin-prohibited&lt;br /&gt;
reject with icmpv6 type addr-unreachable&lt;br /&gt;
reject with icmpv6 type port-unreachable&lt;br /&gt;
reject with icmpx type host-unreachable&lt;br /&gt;
reject with icmpx type no-route&lt;br /&gt;
reject with icmpx type admin-prohibited&lt;br /&gt;
reject with icmpx type port-unreachable&lt;br /&gt;
ip protocol tcp reject with tcp reset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Counter ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|counter statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;packets &amp;lt;packets&amp;gt; bytes &amp;lt;bytes&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
counter&lt;br /&gt;
counter packets 0 bytes 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Limit ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|limit statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rate [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Rate limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
limit rate 400/minute&lt;br /&gt;
limit rate 400/hour&lt;br /&gt;
limit rate over 40/day&lt;br /&gt;
limit rate over 400/week&lt;br /&gt;
limit rate over 1023/second burst 10 packets&lt;br /&gt;
limit rate 1025 kbytes/second&lt;br /&gt;
limit rate 1023000 mbytes/second&lt;br /&gt;
limit rate 1025 bytes/second burst 512 bytes&lt;br /&gt;
limit rate 1025 kbytes/second burst 1023 kbytes&lt;br /&gt;
limit rate 1025 mbytes/second burst 1025 kbytes&lt;br /&gt;
limit rate 1025000 mbytes/second burst 1023 mbytes&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nat ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|nat statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dnat to &amp;lt;destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dnat to 192.168.3.2&lt;br /&gt;
dnat to ct mark map { 0x00000014 : 1.2.3.4}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;snat to &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
snat to 192.168.3.2&lt;br /&gt;
snat to 2001:838:35f:1::-2001:838:35f:2:::100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;masquerade [&amp;lt;type&amp;gt;] [to :&amp;lt;port&amp;gt;]&#039;&#039;&lt;br /&gt;
| Masquerade&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
masquerade&lt;br /&gt;
masquerade persistent,fully-random,random&lt;br /&gt;
masquerade to :1024&lt;br /&gt;
masquerade to :1024-2048&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Queue ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|queue statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;num &amp;lt;value&amp;gt; &amp;lt;scheduler&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
queue&lt;br /&gt;
queue num 2&lt;br /&gt;
queue num 2-3&lt;br /&gt;
queue num 4-5 fanout bypass&lt;br /&gt;
queue num 4-5 fanout&lt;br /&gt;
queue num 4-5 bypass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Export Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft export (xml | json)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monitor Events ===&lt;br /&gt;
&lt;br /&gt;
Monitor events from Netlink creating filters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft monitor [new | destroy] [tables | chains | sets | rules | elements] [xml | json]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Nft scripting =&lt;br /&gt;
&lt;br /&gt;
== List ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flush ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Load ruleset ==&lt;br /&gt;
&lt;br /&gt;
Create a command batch file and load it with the nft interpreter,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% echo &amp;quot;flush ruleset&amp;quot; &amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add table filter&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add chain filter input&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add rule filter input meta iifname lo accept&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/nftables.rules&lt;br /&gt;
&amp;gt; #!/usr/local/sbin/nft -f&lt;br /&gt;
&amp;gt; flush ruleset&lt;br /&gt;
&amp;gt; add table filter&lt;br /&gt;
&amp;gt; add chain filter input&lt;br /&gt;
&amp;gt; add rule filter input meta iifname lo accept&lt;br /&gt;
&amp;gt; EOF&lt;br /&gt;
% chmod u+x /etc/nftables.rules&lt;br /&gt;
% /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file from an already created ruleset,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset &amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
== Simple IP/IPv6 Firewall ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    icmp type echo-request accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table ip6 firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # invalid connections&lt;br /&gt;
    ct state invalid drop&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    # routers may also want: mld-listener-query, nd-router-solicit&lt;br /&gt;
    icmpv6 type {echo-request,nd-neighbor-solicit} accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Counters&amp;diff=1092</id>
		<title>Counters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Counters&amp;diff=1092"/>
		<updated>2023-08-27T20:56:13Z</updated>

		<summary type="html">&lt;p&gt;Pablo: incorrect syntax with protocol matching&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A counter counts both the total number of packets and the total bytes it has seen since it was last reset. With nftables you need to explicitly specify a counter for each rule you want to count.&lt;br /&gt;
&lt;br /&gt;
= Anonymous counters =&lt;br /&gt;
&lt;br /&gt;
An anonymous counter is local to the single rule in which it appears. The following example uses an anonymous counter to count all tcp traffic routed to the local host:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
table ip counter_demo {&lt;br /&gt;
    chain IN {&lt;br /&gt;
        type filter hook input priority filter; policy drop;&lt;br /&gt;
&lt;br /&gt;
        ip protocol tcp counter&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039; that the position of the &#039;&#039;counter&#039;&#039; statement within your rule is significant, because nftables evaluates expressions and statements linearly from left to right. If the above rule were written instead:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
        counter ip protocol tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then &#039;&#039;&#039;every packet&#039;&#039;&#039; routed to your host (not just tcp packets) will update the counter!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Named counters =&lt;br /&gt;
&lt;br /&gt;
== Declaring and using named counters ==&lt;br /&gt;
&lt;br /&gt;
You can also declare named counters, which can be used in multiple rules, e.g.:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
table inet named_counter_demo {&lt;br /&gt;
&lt;br /&gt;
    counter cnt_http {&lt;br /&gt;
        comment &amp;quot;count both http and https packets&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    counter cnt_smtp {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain IN {&lt;br /&gt;
        type filter hook input priority filter; policy drop;&lt;br /&gt;
&lt;br /&gt;
        tcp dport   25 counter name cnt_smtp&lt;br /&gt;
        tcp dport   80 counter name cnt_http&lt;br /&gt;
        tcp dport  443 counter name cnt_http&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above example defines two counters named &#039;&#039;cnt_http&#039;&#039; and &#039;&#039;cnt_smtp&#039;&#039; and uses them in rules to count http(s) and smtp packets routed to the local host. (This example is contrived to show using a single named counter in multiple rules; the two rules using cnt_http can easily be combined by using an anonymous [[Sets|set]].) The optional &#039;&#039;comment&#039;&#039; attribute requires at least nftables 0.9.7 and kernel 5.10.&lt;br /&gt;
&lt;br /&gt;
== Listing / reading named counters ==&lt;br /&gt;
&lt;br /&gt;
=== Listing named counters from nft command line ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;nft list [counter | counters]&#039;&#039; (as per below) returns the current value(s) of the selected counter(s).&lt;br /&gt;
&lt;br /&gt;
* List a particular counter:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft list counter inet named_counter_demo cnt_http&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* List all counters in a particular table:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft list counters table inet named_counter_demo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* List all counters in ruleset:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft list counters&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading named counters from Python ===&lt;br /&gt;
&lt;br /&gt;
The following partial ruleset (note the absence of a [[Configuring_chains#Adding_base_chains|base chain]]) defines two named counters &#039;&#039;voip1&#039;&#039; and &#039;&#039;voip2&#039;&#039; and uses them to count VoIP traffic to udp/5160 and udp/5161. The commented-out rules show how to do this in simple fashion, while the 2 final rules in the &#039;&#039;FORWARD&#039;&#039; chain do the same thing using the &#039;&#039;voipcounters&#039;&#039; [[Maps|map]]. The approach using the map becomes increasingly advantageous when more ports (map elements) are added.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
define ipvoipbox=192.168.0.8&lt;br /&gt;
&lt;br /&gt;
table ip filter {&lt;br /&gt;
    counter voip1 {&lt;br /&gt;
    }&lt;br /&gt;
    counter voip2 {&lt;br /&gt;
    }&lt;br /&gt;
    map voipcounters {&lt;br /&gt;
        type inet_service : counter&lt;br /&gt;
        elements = {&lt;br /&gt;
            5160 : &amp;quot;voip1&amp;quot;, &lt;br /&gt;
            5161 : &amp;quot;voip2&amp;quot; &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    chain FORWARD {&lt;br /&gt;
        #ip saddr $ipvoipbox udp dport 5160 counter name voip1 comment &amp;quot;counting packets for SIP1&amp;quot;&lt;br /&gt;
        #ip daddr $ipvoipbox udp dport 5160 counter name voip1 comment &amp;quot;counting packets for SIP1&amp;quot;&lt;br /&gt;
        #ip saddr $ipvoipbox udp sport 5161 counter name voip2 comment &amp;quot;counting packets for SIP2&amp;quot;&lt;br /&gt;
        #ip daddr $ipvoipbox udp dport 5161 counter name voip2 comment &amp;quot;counting packets for SIP2&amp;quot;&lt;br /&gt;
        ip saddr $ipvoipbox counter name udp sport map @voipcounters&lt;br /&gt;
        ip daddr $ipvoipbox counter name udp dport map @voipcounters&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can read current counter values from [[Scripting#Using_nftables_from_Python|Python using the libnftables library]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
from nftables import Nftables&lt;br /&gt;
from nftables import json&lt;br /&gt;
&lt;br /&gt;
def getCounter(countername, family=&#039;ip&#039;):&lt;br /&gt;
    nft = Nftables()&lt;br /&gt;
    nft.set_json_output(True)&lt;br /&gt;
    _, output, _ = nft.cmd(f&amp;quot;list counter {family} filter {countername}&amp;quot;)&lt;br /&gt;
    j = json.loads(output)&lt;br /&gt;
    return j[&#039;nftables&#039;][1][&amp;quot;counter&amp;quot;][&amp;quot;bytes&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
print(getCounter(&#039;voip1&#039;), &#039;bytes&#039;)&lt;br /&gt;
print(getCounter(&#039;voip2&#039;), &#039;bytes&#039;) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Resetting named counters ==&lt;br /&gt;
&lt;br /&gt;
Resetting a counter dumps its current packet and byte counts and then resets the counts to their initial values.&lt;br /&gt;
&lt;br /&gt;
* Reset a particular counter:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft reset counter inet named_counter_demo cnt_http&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reset all counters in a particular table:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft reset counters table inet named_counter_demo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reset all counters in ruleset:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft reset counters&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Resetting counters does not reset anonymous counters, see [https://bugzilla.netfilter.org/show_bug.cgi?id=1401 bug #1401].&lt;br /&gt;
A workaround to achieve that is to restore the current ruleset with all stateful information dropped:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% (echo &amp;quot;flush ruleset&amp;quot;; nft --stateless list ruleset) | nft -f -&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Obviously, this drops all state so might have undesired side-effects, like, e.g. resetting quotas.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=1091</id>
		<title>Flowtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=1091"/>
		<updated>2023-08-22T18:26:44Z</updated>

		<summary type="html">&lt;p&gt;Pablo: update notes according to HTTP connection offload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flowtables allow you to accelerate packet forwarding in software (and in hardware if your NIC supports it) by using a conntrack-based network stack bypass.&lt;br /&gt;
&lt;br /&gt;
Entries are represented through a tuple that is composed of the input interface, source and destination address, source and destination port; and layer 3/4&lt;br /&gt;
protocols. Each entry also caches the destination interface and the gateway address (to update the destination link-layer address) to forward packets.&lt;br /&gt;
&lt;br /&gt;
The TTL and hoplimit fields are also decremented. Hence, flowtables provides an alternative path that allow packets to bypass the classic forwarding path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                         userspace process&lt;br /&gt;
                                          ^              |&lt;br /&gt;
                                          |              |&lt;br /&gt;
                                     _____|____     ____\/___&lt;br /&gt;
                                    /          \   /         \&lt;br /&gt;
                                    |   input  |   |  output |&lt;br /&gt;
                                    \__________/   \_________/&lt;br /&gt;
                                         ^               |&lt;br /&gt;
                                         |               |&lt;br /&gt;
      _________      __________      ---------     _____\/_____&lt;br /&gt;
     /         \    /          \     |Routing |   /            \&lt;br /&gt;
  --&amp;gt;  ingress  ---&amp;gt; prerouting ---&amp;gt; |decision|   | postrouting|--&amp;gt; neigh_xmit&lt;br /&gt;
     \_________/    \__________/     ----------   \____________/          ^&lt;br /&gt;
       |      ^                          |               ^                |&lt;br /&gt;
   flowtable  |                     ____\/___            |                |&lt;br /&gt;
       |      |                    /         \           |                |&lt;br /&gt;
    __\/___   |                    | forward |------------                |&lt;br /&gt;
    |-----|   |                    \_________/                            |&lt;br /&gt;
    |-----|   |                 &#039;flow offload&#039; rule                       |&lt;br /&gt;
    |-----|   |                   adds entry to                           |&lt;br /&gt;
    |_____|   |                     flowtable                             |&lt;br /&gt;
       |      |                                                           |&lt;br /&gt;
      / \     |                                                           |&lt;br /&gt;
     /hit\_no_|                                                           |&lt;br /&gt;
     \ ? /                                                                |&lt;br /&gt;
      \ /                                                                 |&lt;br /&gt;
       |__yes_________________fastpath bypass ____________________________|&lt;br /&gt;
&lt;br /&gt;
               Fig.1 Netfilter hooks and flowtable interactions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Flowtables reside in the ingress hook that is located before the prerouting hook. You can select which flows you want to offload through the flow expression from the forward chain. Flowtables are identified by their address [[Nftables_families|family]] and their name. The address family must be one of ip, ip6, or inet. When no address family is specified, ip is used by default.&lt;br /&gt;
&lt;br /&gt;
Flows are offloaded after the state is created. That means that usually the first reply packet will create the flowtable entry.&lt;br /&gt;
A firewall rule to accept the initial traffic is required.&lt;br /&gt;
The flow expression on the forward chain must match the return traffic of the initial connection.&lt;br /&gt;
Be aware that the return route is deducted from the packet, that creates the flowtable entry.&lt;br /&gt;
This also means if you are using special ip rules, you need to make sure that they match the reply packet traffic as well as the original traffic.&lt;br /&gt;
&lt;br /&gt;
The *priority* can be a signed integer or *filter* which stands for 0. Addition and subtraction can be used to set relative priority, e.g. filter + 5 equals to 5.&lt;br /&gt;
&lt;br /&gt;
The *devices* are specified as [[Data_types|iifname]](s) of the input interface(s) of the traffic that should be offloaded. Devices are required for both traffic directions.&lt;br /&gt;
&lt;br /&gt;
An Example to offload HTTP traffic for a router:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define DEV_PRIVATE=eth0&lt;br /&gt;
define DEV_INTERNET=eth1&lt;br /&gt;
&lt;br /&gt;
table inet x {&lt;br /&gt;
&lt;br /&gt;
    flowtable f {&lt;br /&gt;
        hook ingress priority 0&lt;br /&gt;
        devices = { $DEV_PRIVATE, $DEV_INTERNET }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain forward {&lt;br /&gt;
        type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # offload established HTTP connections&lt;br /&gt;
        tcp dport { 80, 443 } ct state established flow offload @f counter packets 0 bytes 0&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets, drop invalid&lt;br /&gt;
        ct state vmap { established : accept, related : accept, invalid : drop }&lt;br /&gt;
&lt;br /&gt;
        # connections from the internal net to the internet or to other&lt;br /&gt;
        # internal nets are allowed&lt;br /&gt;
        iifname $DEV_PRIVATE counter accept&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that:&lt;br /&gt;
&lt;br /&gt;
# The rule that uses the &#039;&#039;flow offload&#039;&#039; statement determines what flows are added to the flowtable. This ruleset above adds entries to the flowtable for established HTTP connections.&lt;br /&gt;
# The devices you specify in the flowtable declaration determine where the flowtable hooks in the pipeline for lookups, in the example above, it registers a hook for devices eth0 and eth0 in the ingress hook at priority 0.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.kernel.org/doc/html/latest/networking/nf_flowtable.html Linux kernel documentation on Netfilter flowtable]&lt;br /&gt;
* [https://netdevconf.info/0x13/session.html?workshop-netfilter-mini Netfilter Mini-Workshop, Netdev 0x13, 2019-03]&lt;br /&gt;
* [https://lwn.net/Articles/804384/ Mellanox flowtable hardware offload]&lt;br /&gt;
* [https://www.programmersought.com/article/11833283913/ Some Mellanox flowtable hardware offload performance measurements by Wen Xu of UCloud]&lt;br /&gt;
* [https://linuxplumbersconf.org/event/4/contributions/463/ Netfilter hardware offloads, Pablo Neira Ayuso, Linux Plumbers Conference, 2019-09]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=1090</id>
		<title>Flowtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=1090"/>
		<updated>2023-08-22T18:25:19Z</updated>

		<summary type="html">&lt;p&gt;Pablo: provide an example that offload HTTP traffic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flowtables allow you to accelerate packet forwarding in software (and in hardware if your NIC supports it) by using a conntrack-based network stack bypass.&lt;br /&gt;
&lt;br /&gt;
Entries are represented through a tuple that is composed of the input interface, source and destination address, source and destination port; and layer 3/4&lt;br /&gt;
protocols. Each entry also caches the destination interface and the gateway address (to update the destination link-layer address) to forward packets.&lt;br /&gt;
&lt;br /&gt;
The TTL and hoplimit fields are also decremented. Hence, flowtables provides an alternative path that allow packets to bypass the classic forwarding path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                         userspace process&lt;br /&gt;
                                          ^              |&lt;br /&gt;
                                          |              |&lt;br /&gt;
                                     _____|____     ____\/___&lt;br /&gt;
                                    /          \   /         \&lt;br /&gt;
                                    |   input  |   |  output |&lt;br /&gt;
                                    \__________/   \_________/&lt;br /&gt;
                                         ^               |&lt;br /&gt;
                                         |               |&lt;br /&gt;
      _________      __________      ---------     _____\/_____&lt;br /&gt;
     /         \    /          \     |Routing |   /            \&lt;br /&gt;
  --&amp;gt;  ingress  ---&amp;gt; prerouting ---&amp;gt; |decision|   | postrouting|--&amp;gt; neigh_xmit&lt;br /&gt;
     \_________/    \__________/     ----------   \____________/          ^&lt;br /&gt;
       |      ^                          |               ^                |&lt;br /&gt;
   flowtable  |                     ____\/___            |                |&lt;br /&gt;
       |      |                    /         \           |                |&lt;br /&gt;
    __\/___   |                    | forward |------------                |&lt;br /&gt;
    |-----|   |                    \_________/                            |&lt;br /&gt;
    |-----|   |                 &#039;flow offload&#039; rule                       |&lt;br /&gt;
    |-----|   |                   adds entry to                           |&lt;br /&gt;
    |_____|   |                     flowtable                             |&lt;br /&gt;
       |      |                                                           |&lt;br /&gt;
      / \     |                                                           |&lt;br /&gt;
     /hit\_no_|                                                           |&lt;br /&gt;
     \ ? /                                                                |&lt;br /&gt;
      \ /                                                                 |&lt;br /&gt;
       |__yes_________________fastpath bypass ____________________________|&lt;br /&gt;
&lt;br /&gt;
               Fig.1 Netfilter hooks and flowtable interactions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Flowtables reside in the ingress hook that is located before the prerouting hook. You can select which flows you want to offload through the flow expression from the forward chain. Flowtables are identified by their address [[Nftables_families|family]] and their name. The address family must be one of ip, ip6, or inet. When no address family is specified, ip is used by default.&lt;br /&gt;
&lt;br /&gt;
Flows are offloaded after the state is created. That means that usually the first reply packet will create the flowtable entry.&lt;br /&gt;
A firewall rule to accept the initial traffic is required.&lt;br /&gt;
The flow expression on the forward chain must match the return traffic of the initial connection.&lt;br /&gt;
Be aware that the return route is deducted from the packet, that creates the flowtable entry.&lt;br /&gt;
This also means if you are using special ip rules, you need to make sure that they match the reply packet traffic as well as the original traffic.&lt;br /&gt;
&lt;br /&gt;
The *priority* can be a signed integer or *filter* which stands for 0. Addition and subtraction can be used to set relative priority, e.g. filter + 5 equals to 5.&lt;br /&gt;
&lt;br /&gt;
The *devices* are specified as [[Data_types|iifname]](s) of the input interface(s) of the traffic that should be offloaded. Devices are required for both traffic directions.&lt;br /&gt;
&lt;br /&gt;
An Example to offload HTTP traffic for a router:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define DEV_PRIVATE=eth0&lt;br /&gt;
define DEV_INTERNET=eth1&lt;br /&gt;
&lt;br /&gt;
table inet x {&lt;br /&gt;
&lt;br /&gt;
    flowtable f {&lt;br /&gt;
        hook ingress priority 0&lt;br /&gt;
        devices = { $DEV_PRIVATE, $DEV_INTERNET }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain forward {&lt;br /&gt;
        type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # offload established HTTP connections&lt;br /&gt;
        tcp dport { 80, 443 } ct state established flow offload @f counter packets 0 bytes 0&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets, drop invalid&lt;br /&gt;
        ct state vmap { established : accept, related : accept, invalid : drop }&lt;br /&gt;
&lt;br /&gt;
        # connections from the internal net to the internet or to other&lt;br /&gt;
        # internal nets are allowed&lt;br /&gt;
        iifname $DEV_PRIVATE counter accept&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that:&lt;br /&gt;
&lt;br /&gt;
# The rule that uses the &#039;&#039;flow offload&#039;&#039; statement determines what flows are added to the flowtable. This ruleset above adds entries to the flowtable for TCP and UDP packets.&lt;br /&gt;
# The devices you specify in the flowtable declaration determine where the flowtable hooks in the pipeline for lookups, in the example above, it registers a hook for devices eth0 and eth0 in the ingress hook at priority 0.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.kernel.org/doc/html/latest/networking/nf_flowtable.html Linux kernel documentation on Netfilter flowtable]&lt;br /&gt;
* [https://netdevconf.info/0x13/session.html?workshop-netfilter-mini Netfilter Mini-Workshop, Netdev 0x13, 2019-03]&lt;br /&gt;
* [https://lwn.net/Articles/804384/ Mellanox flowtable hardware offload]&lt;br /&gt;
* [https://www.programmersought.com/article/11833283913/ Some Mellanox flowtable hardware offload performance measurements by Wen Xu of UCloud]&lt;br /&gt;
* [https://linuxplumbersconf.org/event/4/contributions/463/ Netfilter hardware offloads, Pablo Neira Ayuso, Linux Plumbers Conference, 2019-09]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=1089</id>
		<title>Flowtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=1089"/>
		<updated>2023-08-22T18:05:50Z</updated>

		<summary type="html">&lt;p&gt;Pablo: add a few notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flowtables allow you to accelerate packet forwarding in software (and in hardware if your NIC supports it) by using a conntrack-based network stack bypass.&lt;br /&gt;
&lt;br /&gt;
Entries are represented through a tuple that is composed of the input interface, source and destination address, source and destination port; and layer 3/4&lt;br /&gt;
protocols. Each entry also caches the destination interface and the gateway address (to update the destination link-layer address) to forward packets.&lt;br /&gt;
&lt;br /&gt;
The TTL and hoplimit fields are also decremented. Hence, flowtables provides an alternative path that allow packets to bypass the classic forwarding path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                         userspace process&lt;br /&gt;
                                          ^              |&lt;br /&gt;
                                          |              |&lt;br /&gt;
                                     _____|____     ____\/___&lt;br /&gt;
                                    /          \   /         \&lt;br /&gt;
                                    |   input  |   |  output |&lt;br /&gt;
                                    \__________/   \_________/&lt;br /&gt;
                                         ^               |&lt;br /&gt;
                                         |               |&lt;br /&gt;
      _________      __________      ---------     _____\/_____&lt;br /&gt;
     /         \    /          \     |Routing |   /            \&lt;br /&gt;
  --&amp;gt;  ingress  ---&amp;gt; prerouting ---&amp;gt; |decision|   | postrouting|--&amp;gt; neigh_xmit&lt;br /&gt;
     \_________/    \__________/     ----------   \____________/          ^&lt;br /&gt;
       |      ^                          |               ^                |&lt;br /&gt;
   flowtable  |                     ____\/___            |                |&lt;br /&gt;
       |      |                    /         \           |                |&lt;br /&gt;
    __\/___   |                    | forward |------------                |&lt;br /&gt;
    |-----|   |                    \_________/                            |&lt;br /&gt;
    |-----|   |                 &#039;flow offload&#039; rule                       |&lt;br /&gt;
    |-----|   |                   adds entry to                           |&lt;br /&gt;
    |_____|   |                     flowtable                             |&lt;br /&gt;
       |      |                                                           |&lt;br /&gt;
      / \     |                                                           |&lt;br /&gt;
     /hit\_no_|                                                           |&lt;br /&gt;
     \ ? /                                                                |&lt;br /&gt;
      \ /                                                                 |&lt;br /&gt;
       |__yes_________________fastpath bypass ____________________________|&lt;br /&gt;
&lt;br /&gt;
               Fig.1 Netfilter hooks and flowtable interactions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Flowtables reside in the ingress hook that is located before the prerouting hook. You can select which flows you want to offload through the flow expression from the forward chain. Flowtables are identified by their address [[Nftables_families|family]] and their name. The address family must be one of ip, ip6, or inet. When no address family is specified, ip is used by default.&lt;br /&gt;
&lt;br /&gt;
Flows are offloaded after the state is created. That means that usually the first reply packet will create the flowtable entry.&lt;br /&gt;
A firewall rule to accept the initial traffic is required.&lt;br /&gt;
The flow expression on the forward chain must match the return traffic of the initial connection.&lt;br /&gt;
Be aware that the return route is deducted from the packet, that creates the flowtable entry.&lt;br /&gt;
This also means if you are using special ip rules, you need to make sure that they match the reply packet traffic as well as the original traffic.&lt;br /&gt;
&lt;br /&gt;
The *priority* can be a signed integer or *filter* which stands for 0. Addition and subtraction can be used to set relative priority, e.g. filter + 5 equals to 5.&lt;br /&gt;
&lt;br /&gt;
The *devices* are specified as [[Data_types|iifname]](s) of the input interface(s) of the traffic that should be offloaded. Devices are required for both traffic directions.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet x {&lt;br /&gt;
&lt;br /&gt;
    flowtable f {&lt;br /&gt;
        hook ingress priority 0; devices = { eth0, eth1 };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain forward {&lt;br /&gt;
        type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # offload established connections&lt;br /&gt;
        meta l4proto { tcp, udp } flow offload @f counter packets 0 bytes 0&lt;br /&gt;
&lt;br /&gt;
        # established/related connections&lt;br /&gt;
        ct state established,related counter accept&lt;br /&gt;
&lt;br /&gt;
        # allow initial connection&lt;br /&gt;
        meta l4proto { tcp, udp } accept&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that:&lt;br /&gt;
&lt;br /&gt;
# The rule that uses the &#039;&#039;flow offload&#039;&#039; statement determines what flows are added to the flowtable. This ruleset above adds entries to the flowtable for TCP and UDP packets.&lt;br /&gt;
# The devices you specify in the flowtable declaration determine where the flowtable hooks in the pipeline for lookups, in the example above, it registers a hook for devices eth0 and eth0 in the ingress hook at priority 0.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.kernel.org/doc/html/latest/networking/nf_flowtable.html Linux kernel documentation on Netfilter flowtable]&lt;br /&gt;
* [https://netdevconf.info/0x13/session.html?workshop-netfilter-mini Netfilter Mini-Workshop, Netdev 0x13, 2019-03]&lt;br /&gt;
* [https://lwn.net/Articles/804384/ Mellanox flowtable hardware offload]&lt;br /&gt;
* [https://www.programmersought.com/article/11833283913/ Some Mellanox flowtable hardware offload performance measurements by Wen Xu of UCloud]&lt;br /&gt;
* [https://linuxplumbersconf.org/event/4/contributions/463/ Netfilter hardware offloads, Pablo Neira Ayuso, Linux Plumbers Conference, 2019-09]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1088</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1088"/>
		<updated>2023-08-15T21:58:54Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Dynamic set and map and stateful expressions */ minor edit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Dynamic set/map and stateful expressions ==&lt;br /&gt;
&lt;br /&gt;
If you specify the &#039;&#039;dynamic&#039;&#039; flag to your set/map declaration, you can add elements to your set/map from the packet path. You can also attach a ratelimit per byte/packet/connection, counter and quota to such elements.&lt;br /&gt;
&lt;br /&gt;
Among other things, the combination of dynamic set/map and stateful expressions provide a lot more flexible replacement for the &#039;&#039;hashlimit&#039;&#039; and &#039;&#039;connlimit&#039;&#039; matches in iptables.&lt;br /&gt;
&lt;br /&gt;
== Using meters ==&lt;br /&gt;
&lt;br /&gt;
The following example shows to how ratelimit inbound TCP connections to port 22 per source IP address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new tcp dport 22 update @my_ssh_ratelimit { ip saddr limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each packet matching this rule, it adds an element to the set whose key is &#039;ip saddr&#039; and it attaches a ratelimiter to such element. If the element already exists, the ratelimiter is applied and the timeout is refreshed to 60 seconds. After 60 seconds of no use, the element expires and the ratelimiter is released.&lt;br /&gt;
&lt;br /&gt;
You can also use [[concatenations]] to ratelimit the inbound connections per IP source address and TCP destination port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr . inet_service&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new update @my_ssh_ratelimit { ip saddr . tcp dport limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Doing connlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Since 4.18, &#039;&#039;ct count&#039;&#039; allows you to count the number of existing connections based on connection tracking table, you can use it to limit the maximum number of established connections.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 table ip filter {&lt;br /&gt;
        set my_connlimit {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                size 65535&lt;br /&gt;
                flags dynamic&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        chain output {&lt;br /&gt;
                type filter hook output priority filter; policy accept;&lt;br /&gt;
                ct state new add @my_connlimit { ip saddr ct count over 20 } counter drop&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each packet matching this rule, it adds an element to the set whose key is &#039;ip saddr&#039; and it allows a maximum number of 20 established connections to such IP source address.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; This policy does not specifies a timeout to sets intentionally. The connection tracking table timers apply in this case. For the same reason, you cannot use the &#039;&#039;update&#039;&#039; set statement which allows to refresh the timeout of your set element. Therefore, the &#039;&#039;ct count&#039;&#039; statement can only be used with the &#039;&#039;add&#039;&#039; set statement. If you define a timeout to your set and use it with &#039;&#039;ct count&#039;&#039;, you will hit an &amp;quot;Operation is not supported&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
== Doing iptables hashlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Meters replace iptables hashlimit in nft. From iptables v1.6.2 onward, you can use the tool &#039;&#039;&#039;iptables-translate&#039;&#039;&#039; to see how to translate hashlimit rules.&lt;br /&gt;
&lt;br /&gt;
Almost all hashlimit options are available in nft, starting with --hashlimit-mode, it is replaced by the selector in a meter. All modes are available except no mode, a meter demands a selector, an iptables rule without hashlimit-mode isn&#039;t supported in nft. A simple rule translation is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200/sec --hashlimit-mode srcip,dstport --hashlimit-name http1 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http1 { tcp dport . ip saddr limit rate over 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that a meter is named, like hashlimit, and using multiple hashlimit-modes is similar to using a concatenation of selectors. Also, --hashlimit-above is translated to &#039;&#039;limit rate over&#039;&#039;, to simulate --hashlimit-upto just omit or replace &#039;&#039;over&#039;&#039; with &#039;&#039;until&#039;&#039; in the rule.&lt;br /&gt;
&lt;br /&gt;
The options --hashlimit-burst and --hashlimit-htable-expire are translated to &#039;&#039;burst&#039;&#039; and &#039;&#039;timeout&#039;&#039; in a meter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200kb/s --hashlimit-burst 1mb --hashlimit-mode srcip,dstport --hashlimit-name http2 --hashlimit-htable-expire 3000 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http2 { tcp dport . ip saddr timeout 3s limit rate over 200 kbytes/second burst 1 mbytes} counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule shows how &#039;&#039;timeout&#039;&#039; and &#039;&#039;burst&#039;&#039; are used in a meter, also notice that meters, similarly to hashlimit, accepts limiting rates by bytes frequency instead of packets.&lt;br /&gt;
&lt;br /&gt;
Another hashlimit option is to limit the traffic rate on subnets, of IP source or destination addresses, using the options --hashlimit-srcmask and --hashlimit-dstmask. This feature is available in nft by attaching a subnet mask to a meter selector, attach to &#039;&#039;ip saddr&#039;&#039; for source address and to &#039;&#039;ip daddr&#039;&#039; for destination adress:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 200 --hashlimit-mode srcip --hashlimit-name http3 --hashlimit-srcmask 24 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http3 { ip saddr and 255.255.255.0 limit rate 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule will limit packets rate, grouping subnets determined by the first 24 bits of the IP source address, from the incoming packets on port 80.&lt;br /&gt;
&lt;br /&gt;
The remaining options, --hashlimit-htable-max, --hashlimit-htable-size and --hashlimit-htable-gcinterval don&#039;t apply to meters.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1087</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1087"/>
		<updated>2023-08-15T21:58:12Z</updated>

		<summary type="html">&lt;p&gt;Pablo: clarify dynamic flag&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Dynamic set and map and stateful expressions ==&lt;br /&gt;
&lt;br /&gt;
If you specify the &#039;&#039;dynamic&#039;&#039; flag to your set/map declaration, you can add elements to your set/map from the packet path. You can also attach a ratelimit per byte/packet/connection, counter and quota to such elements.&lt;br /&gt;
&lt;br /&gt;
Among other things, the combination of dynamic set/map and stateful expressions provide a lot more flexible replacement for the &#039;&#039;hashlimit&#039;&#039; and &#039;&#039;connlimit&#039;&#039; matches in iptables.&lt;br /&gt;
&lt;br /&gt;
== Using meters ==&lt;br /&gt;
&lt;br /&gt;
The following example shows to how ratelimit inbound TCP connections to port 22 per source IP address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new tcp dport 22 update @my_ssh_ratelimit { ip saddr limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each packet matching this rule, it adds an element to the set whose key is &#039;ip saddr&#039; and it attaches a ratelimiter to such element. If the element already exists, the ratelimiter is applied and the timeout is refreshed to 60 seconds. After 60 seconds of no use, the element expires and the ratelimiter is released.&lt;br /&gt;
&lt;br /&gt;
You can also use [[concatenations]] to ratelimit the inbound connections per IP source address and TCP destination port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr . inet_service&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new update @my_ssh_ratelimit { ip saddr . tcp dport limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Doing connlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Since 4.18, &#039;&#039;ct count&#039;&#039; allows you to count the number of existing connections based on connection tracking table, you can use it to limit the maximum number of established connections.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 table ip filter {&lt;br /&gt;
        set my_connlimit {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                size 65535&lt;br /&gt;
                flags dynamic&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        chain output {&lt;br /&gt;
                type filter hook output priority filter; policy accept;&lt;br /&gt;
                ct state new add @my_connlimit { ip saddr ct count over 20 } counter drop&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each packet matching this rule, it adds an element to the set whose key is &#039;ip saddr&#039; and it allows a maximum number of 20 established connections to such IP source address.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; This policy does not specifies a timeout to sets intentionally. The connection tracking table timers apply in this case. For the same reason, you cannot use the &#039;&#039;update&#039;&#039; set statement which allows to refresh the timeout of your set element. Therefore, the &#039;&#039;ct count&#039;&#039; statement can only be used with the &#039;&#039;add&#039;&#039; set statement. If you define a timeout to your set and use it with &#039;&#039;ct count&#039;&#039;, you will hit an &amp;quot;Operation is not supported&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
== Doing iptables hashlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Meters replace iptables hashlimit in nft. From iptables v1.6.2 onward, you can use the tool &#039;&#039;&#039;iptables-translate&#039;&#039;&#039; to see how to translate hashlimit rules.&lt;br /&gt;
&lt;br /&gt;
Almost all hashlimit options are available in nft, starting with --hashlimit-mode, it is replaced by the selector in a meter. All modes are available except no mode, a meter demands a selector, an iptables rule without hashlimit-mode isn&#039;t supported in nft. A simple rule translation is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200/sec --hashlimit-mode srcip,dstport --hashlimit-name http1 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http1 { tcp dport . ip saddr limit rate over 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that a meter is named, like hashlimit, and using multiple hashlimit-modes is similar to using a concatenation of selectors. Also, --hashlimit-above is translated to &#039;&#039;limit rate over&#039;&#039;, to simulate --hashlimit-upto just omit or replace &#039;&#039;over&#039;&#039; with &#039;&#039;until&#039;&#039; in the rule.&lt;br /&gt;
&lt;br /&gt;
The options --hashlimit-burst and --hashlimit-htable-expire are translated to &#039;&#039;burst&#039;&#039; and &#039;&#039;timeout&#039;&#039; in a meter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200kb/s --hashlimit-burst 1mb --hashlimit-mode srcip,dstport --hashlimit-name http2 --hashlimit-htable-expire 3000 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http2 { tcp dport . ip saddr timeout 3s limit rate over 200 kbytes/second burst 1 mbytes} counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule shows how &#039;&#039;timeout&#039;&#039; and &#039;&#039;burst&#039;&#039; are used in a meter, also notice that meters, similarly to hashlimit, accepts limiting rates by bytes frequency instead of packets.&lt;br /&gt;
&lt;br /&gt;
Another hashlimit option is to limit the traffic rate on subnets, of IP source or destination addresses, using the options --hashlimit-srcmask and --hashlimit-dstmask. This feature is available in nft by attaching a subnet mask to a meter selector, attach to &#039;&#039;ip saddr&#039;&#039; for source address and to &#039;&#039;ip daddr&#039;&#039; for destination adress:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 200 --hashlimit-mode srcip --hashlimit-name http3 --hashlimit-srcmask 24 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http3 { ip saddr and 255.255.255.0 limit rate 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule will limit packets rate, grouping subnets determined by the first 24 bits of the IP source address, from the incoming packets on port 80.&lt;br /&gt;
&lt;br /&gt;
The remaining options, --hashlimit-htable-max, --hashlimit-htable-size and --hashlimit-htable-gcinterval don&#039;t apply to meters.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1086</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1086"/>
		<updated>2023-08-15T21:31:59Z</updated>

		<summary type="html">&lt;p&gt;Pablo: rewrite summary&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meters ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dynamic sets/maps&#039;&#039;&#039; allow to add elements to the set/map from the packet path and to attach ratelimit per byte/packet/connection, counter and quota to such elements.&lt;br /&gt;
&lt;br /&gt;
Among other things, they provide a lot more flexible replacement for the &#039;&#039;hashlimit&#039;&#039; and &#039;&#039;connlimit&#039;&#039; matches in iptables.&lt;br /&gt;
&lt;br /&gt;
== Using meters ==&lt;br /&gt;
&lt;br /&gt;
The following example shows to how ratelimit inbound TCP connections to port 22 per source IP address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new tcp dport 22 update @my_ssh_ratelimit { ip saddr limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each packet matching this rule, it adds an element to the set whose key is &#039;ip saddr&#039; and it attaches a ratelimiter to such element. If the element already exists, the ratelimiter is applied and the timeout is refreshed to 60 seconds. After 60 seconds of no use, the element expires and the ratelimiter is released.&lt;br /&gt;
&lt;br /&gt;
You can also use [[concatenations]] to ratelimit the inbound connections per IP source address and TCP destination port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr . inet_service&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new update @my_ssh_ratelimit { ip saddr . tcp dport limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Doing connlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Since 4.18, &#039;&#039;ct count&#039;&#039; allows you to count the number of existing connections based on connection tracking table, you can use it to limit the maximum number of established connections.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 table ip filter {&lt;br /&gt;
        set my_connlimit {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                size 65535&lt;br /&gt;
                flags dynamic&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        chain output {&lt;br /&gt;
                type filter hook output priority filter; policy accept;&lt;br /&gt;
                ct state new add @my_connlimit { ip saddr ct count over 20 } counter drop&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each packet matching this rule, it adds an element to the set whose key is &#039;ip saddr&#039; and it allows a maximum number of 20 established connections to such IP source address.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; This policy does not specifies a timeout to sets intentionally. The connection tracking table timers apply in this case. For the same reason, you cannot use the &#039;&#039;update&#039;&#039; set statement which allows to refresh the timeout of your set element. Therefore, the &#039;&#039;ct count&#039;&#039; statement can only be used with the &#039;&#039;add&#039;&#039; set statement. If you define a timeout to your set and use it with &#039;&#039;ct count&#039;&#039;, you will hit an &amp;quot;Operation is not supported&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
== Doing iptables hashlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Meters replace iptables hashlimit in nft. From iptables v1.6.2 onward, you can use the tool &#039;&#039;&#039;iptables-translate&#039;&#039;&#039; to see how to translate hashlimit rules.&lt;br /&gt;
&lt;br /&gt;
Almost all hashlimit options are available in nft, starting with --hashlimit-mode, it is replaced by the selector in a meter. All modes are available except no mode, a meter demands a selector, an iptables rule without hashlimit-mode isn&#039;t supported in nft. A simple rule translation is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200/sec --hashlimit-mode srcip,dstport --hashlimit-name http1 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http1 { tcp dport . ip saddr limit rate over 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that a meter is named, like hashlimit, and using multiple hashlimit-modes is similar to using a concatenation of selectors. Also, --hashlimit-above is translated to &#039;&#039;limit rate over&#039;&#039;, to simulate --hashlimit-upto just omit or replace &#039;&#039;over&#039;&#039; with &#039;&#039;until&#039;&#039; in the rule.&lt;br /&gt;
&lt;br /&gt;
The options --hashlimit-burst and --hashlimit-htable-expire are translated to &#039;&#039;burst&#039;&#039; and &#039;&#039;timeout&#039;&#039; in a meter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200kb/s --hashlimit-burst 1mb --hashlimit-mode srcip,dstport --hashlimit-name http2 --hashlimit-htable-expire 3000 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http2 { tcp dport . ip saddr timeout 3s limit rate over 200 kbytes/second burst 1 mbytes} counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule shows how &#039;&#039;timeout&#039;&#039; and &#039;&#039;burst&#039;&#039; are used in a meter, also notice that meters, similarly to hashlimit, accepts limiting rates by bytes frequency instead of packets.&lt;br /&gt;
&lt;br /&gt;
Another hashlimit option is to limit the traffic rate on subnets, of IP source or destination addresses, using the options --hashlimit-srcmask and --hashlimit-dstmask. This feature is available in nft by attaching a subnet mask to a meter selector, attach to &#039;&#039;ip saddr&#039;&#039; for source address and to &#039;&#039;ip daddr&#039;&#039; for destination adress:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 200 --hashlimit-mode srcip --hashlimit-name http3 --hashlimit-srcmask 24 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http3 { ip saddr and 255.255.255.0 limit rate 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule will limit packets rate, grouping subnets determined by the first 24 bits of the IP source address, from the incoming packets on port 80.&lt;br /&gt;
&lt;br /&gt;
The remaining options, --hashlimit-htable-max, --hashlimit-htable-size and --hashlimit-htable-gcinterval don&#039;t apply to meters.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1085</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1085"/>
		<updated>2023-08-15T21:26:45Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Doing connlimit with nft */ revisit example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meters ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dynamic sets/maps&#039;&#039;&#039; or meters are a way to use maps with stateful objects. They used to be known as &#039;&#039;flow tables&#039;&#039; before nft v0.8.1 and Linux kernel 4.3.&lt;br /&gt;
&lt;br /&gt;
Among other things, they provide a native replacement for the &#039;&#039;hashlimit&#039;&#039; match in iptables. However, meters are a lot more flexible since you can use any selector, one or many through [[concatenations]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that the &#039;&#039;meter&#039;&#039; keyword is obsolete, the dynamic set and map syntax is now preferred for consistency.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Using meters ==&lt;br /&gt;
&lt;br /&gt;
The following example shows to how ratelimit inbound TCP connections to port 22 per source IP address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new tcp dport 22 update @my_ssh_ratelimit { ip saddr limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each packet matching this rule, it adds an element to the set whose key is &#039;ip saddr&#039; and it attaches a ratelimiter to such element. If the element already exists, the ratelimiter is applied and the timeout is refreshed to 60 seconds. After 60 seconds of no use, the element expires and the ratelimiter is released.&lt;br /&gt;
&lt;br /&gt;
You can also use [[concatenations]] to ratelimit the inbound connections per IP source address and TCP destination port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr . inet_service&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new update @my_ssh_ratelimit { ip saddr . tcp dport limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Doing connlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Since 4.18, &#039;&#039;ct count&#039;&#039; allows you to count the number of existing connections based on connection tracking table, you can use it to limit the maximum number of established connections.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 table ip filter {&lt;br /&gt;
        set my_connlimit {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                size 65535&lt;br /&gt;
                flags dynamic&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        chain output {&lt;br /&gt;
                type filter hook output priority filter; policy accept;&lt;br /&gt;
                ct state new add @my_connlimit { ip saddr ct count over 20 } counter drop&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each packet matching this rule, it adds an element to the set whose key is &#039;ip saddr&#039; and it allows a maximum number of 20 established connections to such IP source address.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; This policy does not specifies a timeout to sets intentionally. The connection tracking table timers apply in this case. For the same reason, you cannot use the &#039;&#039;update&#039;&#039; set statement which allows to refresh the timeout of your set element. Therefore, the &#039;&#039;ct count&#039;&#039; statement can only be used with the &#039;&#039;add&#039;&#039; set statement. If you define a timeout to your set and use it with &#039;&#039;ct count&#039;&#039;, you will hit an &amp;quot;Operation is not supported&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
== Doing iptables hashlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Meters replace iptables hashlimit in nft. From iptables v1.6.2 onward, you can use the tool &#039;&#039;&#039;iptables-translate&#039;&#039;&#039; to see how to translate hashlimit rules.&lt;br /&gt;
&lt;br /&gt;
Almost all hashlimit options are available in nft, starting with --hashlimit-mode, it is replaced by the selector in a meter. All modes are available except no mode, a meter demands a selector, an iptables rule without hashlimit-mode isn&#039;t supported in nft. A simple rule translation is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200/sec --hashlimit-mode srcip,dstport --hashlimit-name http1 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http1 { tcp dport . ip saddr limit rate over 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that a meter is named, like hashlimit, and using multiple hashlimit-modes is similar to using a concatenation of selectors. Also, --hashlimit-above is translated to &#039;&#039;limit rate over&#039;&#039;, to simulate --hashlimit-upto just omit or replace &#039;&#039;over&#039;&#039; with &#039;&#039;until&#039;&#039; in the rule.&lt;br /&gt;
&lt;br /&gt;
The options --hashlimit-burst and --hashlimit-htable-expire are translated to &#039;&#039;burst&#039;&#039; and &#039;&#039;timeout&#039;&#039; in a meter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200kb/s --hashlimit-burst 1mb --hashlimit-mode srcip,dstport --hashlimit-name http2 --hashlimit-htable-expire 3000 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http2 { tcp dport . ip saddr timeout 3s limit rate over 200 kbytes/second burst 1 mbytes} counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule shows how &#039;&#039;timeout&#039;&#039; and &#039;&#039;burst&#039;&#039; are used in a meter, also notice that meters, similarly to hashlimit, accepts limiting rates by bytes frequency instead of packets.&lt;br /&gt;
&lt;br /&gt;
Another hashlimit option is to limit the traffic rate on subnets, of IP source or destination addresses, using the options --hashlimit-srcmask and --hashlimit-dstmask. This feature is available in nft by attaching a subnet mask to a meter selector, attach to &#039;&#039;ip saddr&#039;&#039; for source address and to &#039;&#039;ip daddr&#039;&#039; for destination adress:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 200 --hashlimit-mode srcip --hashlimit-name http3 --hashlimit-srcmask 24 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http3 { ip saddr and 255.255.255.0 limit rate 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule will limit packets rate, grouping subnets determined by the first 24 bits of the IP source address, from the incoming packets on port 80.&lt;br /&gt;
&lt;br /&gt;
The remaining options, --hashlimit-htable-max, --hashlimit-htable-size and --hashlimit-htable-gcinterval don&#039;t apply to meters.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1084</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1084"/>
		<updated>2023-08-15T21:11:03Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Listing meters */ remove listing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meters ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dynamic sets/maps&#039;&#039;&#039; or meters are a way to use maps with stateful objects. They used to be known as &#039;&#039;flow tables&#039;&#039; before nft v0.8.1 and Linux kernel 4.3.&lt;br /&gt;
&lt;br /&gt;
Among other things, they provide a native replacement for the &#039;&#039;hashlimit&#039;&#039; match in iptables. However, meters are a lot more flexible since you can use any selector, one or many through [[concatenations]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that the &#039;&#039;meter&#039;&#039; keyword is obsolete, the dynamic set and map syntax is now preferred for consistency.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Using meters ==&lt;br /&gt;
&lt;br /&gt;
The following example shows to how ratelimit inbound TCP connections to port 22 per source IP address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new tcp dport 22 update @my_ssh_ratelimit { ip saddr limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each packet matching this rule, it adds an element to the set whose key is &#039;ip saddr&#039; and it attaches a ratelimiter to such element. If the element already exists, the ratelimiter is applied and the timeout is refreshed to 60 seconds. After 60 seconds of no use, the element expires and the ratelimiter is released.&lt;br /&gt;
&lt;br /&gt;
You can also use [[concatenations]] to ratelimit the inbound connections per IP source address and TCP destination port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr . inet_service&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new update @my_ssh_ratelimit { ip saddr . tcp dport limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Doing connlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Since 4.18, there is a new &#039;&#039;ct count&#039;&#039; selector that allows you to count the number of existing connections. This extension uses the information available in the Connection Tracking System table, therefore, the counting of connection is based on the existing entries in the table.&lt;br /&gt;
&lt;br /&gt;
The following example shows how to do &#039;&#039;connlimit&#039;&#039; from nftables:&lt;br /&gt;
&lt;br /&gt;
 table ip my_filter_table {&lt;br /&gt;
        set my_connlimit {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                size 65535&lt;br /&gt;
                flags dynamic&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        chain my_output_chain {&lt;br /&gt;
                type filter hook output priority filter; policy accept;&lt;br /&gt;
                ct state new add @my_connlimit { ip daddr ct count over 20 } counter packets 0 bytes 0 drop&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The example above dynamically populates the set &#039;&#039;connlimit&#039;&#039; from the packet path. For the first packet of each connection (ie. packets matching &#039;&#039;ct state new&#039;&#039;), this adds an entry into &#039;&#039;connlimit&#039;&#039; set, this entry uses the IPv4 destination address as a key. If the number of connections goes over 20, then packets are dropped.&lt;br /&gt;
&lt;br /&gt;
Since &#039;&#039;connlimit&#039;&#039; is a set, you can perform any operation on it, such as listing and flushing its content.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Caveats&#039;&#039;&#039;:&lt;br /&gt;
* Do not define a set with a timeout. There is a garbage collector that removes the set element whenever &#039;&#039;ct count&#039;&#039; becomes zero to improve memory usage.&lt;br /&gt;
* For the same reason, you cannot use the &#039;&#039;update&#039;&#039; set statement which allows to refresh the timeout of your set element. Therefore, the &#039;&#039;ct count&#039;&#039; statement can only be used with the &#039;&#039;add&#039;&#039; set statement.&lt;br /&gt;
&lt;br /&gt;
If you define a set with a timeout or you use the &#039;&#039;update&#039;&#039; set statement, then you will hit the &amp;quot;Operation is not supported&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
== Doing iptables hashlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Meters replace iptables hashlimit in nft. From iptables v1.6.2 onward, you can use the tool &#039;&#039;&#039;iptables-translate&#039;&#039;&#039; to see how to translate hashlimit rules.&lt;br /&gt;
&lt;br /&gt;
Almost all hashlimit options are available in nft, starting with --hashlimit-mode, it is replaced by the selector in a meter. All modes are available except no mode, a meter demands a selector, an iptables rule without hashlimit-mode isn&#039;t supported in nft. A simple rule translation is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200/sec --hashlimit-mode srcip,dstport --hashlimit-name http1 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http1 { tcp dport . ip saddr limit rate over 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that a meter is named, like hashlimit, and using multiple hashlimit-modes is similar to using a concatenation of selectors. Also, --hashlimit-above is translated to &#039;&#039;limit rate over&#039;&#039;, to simulate --hashlimit-upto just omit or replace &#039;&#039;over&#039;&#039; with &#039;&#039;until&#039;&#039; in the rule.&lt;br /&gt;
&lt;br /&gt;
The options --hashlimit-burst and --hashlimit-htable-expire are translated to &#039;&#039;burst&#039;&#039; and &#039;&#039;timeout&#039;&#039; in a meter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200kb/s --hashlimit-burst 1mb --hashlimit-mode srcip,dstport --hashlimit-name http2 --hashlimit-htable-expire 3000 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http2 { tcp dport . ip saddr timeout 3s limit rate over 200 kbytes/second burst 1 mbytes} counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule shows how &#039;&#039;timeout&#039;&#039; and &#039;&#039;burst&#039;&#039; are used in a meter, also notice that meters, similarly to hashlimit, accepts limiting rates by bytes frequency instead of packets.&lt;br /&gt;
&lt;br /&gt;
Another hashlimit option is to limit the traffic rate on subnets, of IP source or destination addresses, using the options --hashlimit-srcmask and --hashlimit-dstmask. This feature is available in nft by attaching a subnet mask to a meter selector, attach to &#039;&#039;ip saddr&#039;&#039; for source address and to &#039;&#039;ip daddr&#039;&#039; for destination adress:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 200 --hashlimit-mode srcip --hashlimit-name http3 --hashlimit-srcmask 24 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http3 { ip saddr and 255.255.255.0 limit rate 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule will limit packets rate, grouping subnets determined by the first 24 bits of the IP source address, from the incoming packets on port 80.&lt;br /&gt;
&lt;br /&gt;
The remaining options, --hashlimit-htable-max, --hashlimit-htable-size and --hashlimit-htable-gcinterval don&#039;t apply to meters.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1083</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=1083"/>
		<updated>2023-08-15T21:09:02Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Using meters */ use nested notation and refine example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meters ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dynamic sets/maps&#039;&#039;&#039; or meters are a way to use maps with stateful objects. They used to be known as &#039;&#039;flow tables&#039;&#039; before nft v0.8.1 and Linux kernel 4.3.&lt;br /&gt;
&lt;br /&gt;
Among other things, they provide a native replacement for the &#039;&#039;hashlimit&#039;&#039; match in iptables. However, meters are a lot more flexible since you can use any selector, one or many through [[concatenations]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that the &#039;&#039;meter&#039;&#039; keyword is obsolete, the dynamic set and map syntax is now preferred for consistency.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Using meters ==&lt;br /&gt;
&lt;br /&gt;
The following example shows to how ratelimit inbound TCP connections to port 22 per source IP address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new tcp dport 22 update @my_ssh_ratelimit { ip saddr limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each packet matching this rule, it adds an element to the set whose key is &#039;ip saddr&#039; and it attaches a ratelimiter to such element. If the element already exists, the ratelimiter is applied and the timeout is refreshed to 60 seconds. After 60 seconds of no use, the element expires and the ratelimiter is released.&lt;br /&gt;
&lt;br /&gt;
You can also use [[concatenations]] to ratelimit the inbound connections per IP source address and TCP destination port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
      set my_ssh_ratelimit {&lt;br /&gt;
             type ipv4_addr . inet_service&lt;br /&gt;
             timeout 60s&lt;br /&gt;
             flags dynamic&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      chain input {&lt;br /&gt;
             type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
             ct state new update @my_ssh_ratelimit { ip saddr . tcp dport limit rate 3/minute } accept&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Listing meters ==&lt;br /&gt;
&lt;br /&gt;
To list the content matched by the meter use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list set my_filter_table my_ssh_meter&lt;br /&gt;
table ip my_filter_table {&lt;br /&gt;
        set my_ssh_meter {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                size 65535&lt;br /&gt;
                flags dynamic&lt;br /&gt;
                elements = { 10.141.10.2 limit rate 10/second }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Doing connlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Since 4.18, there is a new &#039;&#039;ct count&#039;&#039; selector that allows you to count the number of existing connections. This extension uses the information available in the Connection Tracking System table, therefore, the counting of connection is based on the existing entries in the table.&lt;br /&gt;
&lt;br /&gt;
The following example shows how to do &#039;&#039;connlimit&#039;&#039; from nftables:&lt;br /&gt;
&lt;br /&gt;
 table ip my_filter_table {&lt;br /&gt;
        set my_connlimit {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                size 65535&lt;br /&gt;
                flags dynamic&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        chain my_output_chain {&lt;br /&gt;
                type filter hook output priority filter; policy accept;&lt;br /&gt;
                ct state new add @my_connlimit { ip daddr ct count over 20 } counter packets 0 bytes 0 drop&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The example above dynamically populates the set &#039;&#039;connlimit&#039;&#039; from the packet path. For the first packet of each connection (ie. packets matching &#039;&#039;ct state new&#039;&#039;), this adds an entry into &#039;&#039;connlimit&#039;&#039; set, this entry uses the IPv4 destination address as a key. If the number of connections goes over 20, then packets are dropped.&lt;br /&gt;
&lt;br /&gt;
Since &#039;&#039;connlimit&#039;&#039; is a set, you can perform any operation on it, such as listing and flushing its content.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Caveats&#039;&#039;&#039;:&lt;br /&gt;
* Do not define a set with a timeout. There is a garbage collector that removes the set element whenever &#039;&#039;ct count&#039;&#039; becomes zero to improve memory usage.&lt;br /&gt;
* For the same reason, you cannot use the &#039;&#039;update&#039;&#039; set statement which allows to refresh the timeout of your set element. Therefore, the &#039;&#039;ct count&#039;&#039; statement can only be used with the &#039;&#039;add&#039;&#039; set statement.&lt;br /&gt;
&lt;br /&gt;
If you define a set with a timeout or you use the &#039;&#039;update&#039;&#039; set statement, then you will hit the &amp;quot;Operation is not supported&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
== Doing iptables hashlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Meters replace iptables hashlimit in nft. From iptables v1.6.2 onward, you can use the tool &#039;&#039;&#039;iptables-translate&#039;&#039;&#039; to see how to translate hashlimit rules.&lt;br /&gt;
&lt;br /&gt;
Almost all hashlimit options are available in nft, starting with --hashlimit-mode, it is replaced by the selector in a meter. All modes are available except no mode, a meter demands a selector, an iptables rule without hashlimit-mode isn&#039;t supported in nft. A simple rule translation is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200/sec --hashlimit-mode srcip,dstport --hashlimit-name http1 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http1 { tcp dport . ip saddr limit rate over 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that a meter is named, like hashlimit, and using multiple hashlimit-modes is similar to using a concatenation of selectors. Also, --hashlimit-above is translated to &#039;&#039;limit rate over&#039;&#039;, to simulate --hashlimit-upto just omit or replace &#039;&#039;over&#039;&#039; with &#039;&#039;until&#039;&#039; in the rule.&lt;br /&gt;
&lt;br /&gt;
The options --hashlimit-burst and --hashlimit-htable-expire are translated to &#039;&#039;burst&#039;&#039; and &#039;&#039;timeout&#039;&#039; in a meter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200kb/s --hashlimit-burst 1mb --hashlimit-mode srcip,dstport --hashlimit-name http2 --hashlimit-htable-expire 3000 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http2 { tcp dport . ip saddr timeout 3s limit rate over 200 kbytes/second burst 1 mbytes} counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule shows how &#039;&#039;timeout&#039;&#039; and &#039;&#039;burst&#039;&#039; are used in a meter, also notice that meters, similarly to hashlimit, accepts limiting rates by bytes frequency instead of packets.&lt;br /&gt;
&lt;br /&gt;
Another hashlimit option is to limit the traffic rate on subnets, of IP source or destination addresses, using the options --hashlimit-srcmask and --hashlimit-dstmask. This feature is available in nft by attaching a subnet mask to a meter selector, attach to &#039;&#039;ip saddr&#039;&#039; for source address and to &#039;&#039;ip daddr&#039;&#039; for destination adress:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 200 --hashlimit-mode srcip --hashlimit-name http3 --hashlimit-srcmask 24 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http3 { ip saddr and 255.255.255.0 limit rate 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule will limit packets rate, grouping subnets determined by the first 24 bits of the IP source address, from the incoming packets on port 80.&lt;br /&gt;
&lt;br /&gt;
The remaining options, --hashlimit-htable-max, --hashlimit-htable-size and --hashlimit-htable-gcinterval don&#039;t apply to meters.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Operations_at_ruleset_level&amp;diff=1082</id>
		<title>Operations at ruleset level</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Operations_at_ruleset_level&amp;diff=1082"/>
		<updated>2023-07-31T08:17:40Z</updated>

		<summary type="html">&lt;p&gt;Pablo: fix incorrect flush ruleset&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Using native nft syntax ==&lt;br /&gt;
&lt;br /&gt;
Linux Kernel 3.18 includes some improvements regarding the available operations to manage your ruleset as a whole.&lt;br /&gt;
&lt;br /&gt;
=== listing ===&lt;br /&gt;
&lt;br /&gt;
Listing the complete ruleset:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 % nft list ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listing the ruleset per family:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 % nft list ruleset arp&lt;br /&gt;
 % nft list ruleset ip&lt;br /&gt;
 % nft list ruleset ip6&lt;br /&gt;
 % nft list ruleset bridge&lt;br /&gt;
 % nft list ruleset inet&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
These commands will print all tables/chains/sets/rules of the given family.&lt;br /&gt;
&lt;br /&gt;
=== flushing ===&lt;br /&gt;
&lt;br /&gt;
In addition, you can also flush (erase, delete, wipe) the complete ruleset:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 % nft flush ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Also per family:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 % nft flush ruleset arp&lt;br /&gt;
 % nft flush ruleset ip&lt;br /&gt;
 % nft flush ruleset ip6&lt;br /&gt;
 % nft flush ruleset bridge&lt;br /&gt;
 % nft flush ruleset inet&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== backup/restore ===&lt;br /&gt;
&lt;br /&gt;
You can combine these two commands above to backup your ruleset:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 % echo &amp;quot;flush ruleset&amp;quot; &amp;gt; backup.nft&lt;br /&gt;
 % nft list ruleset &amp;gt;&amp;gt; backup.nft&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
And load it [[Atomic_rule_replacement|atomically]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 % nft -f backup.nft&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Listing in JSON format ==&lt;br /&gt;
&lt;br /&gt;
You can also export your ruleset in JSON format, just pass the&lt;br /&gt;
&#039;--json&#039; option:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 % nft --json list ruleset &amp;gt; ruleset.json&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
Some related information you may want to read:&lt;br /&gt;
&lt;br /&gt;
* [[Atomic rule replacement]]&lt;br /&gt;
* [[Scripting]]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Scripting&amp;diff=1077</id>
		<title>Scripting</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Scripting&amp;diff=1077"/>
		<updated>2023-04-20T14:46:47Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Including files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Many people like to maintain their ruleset in shell scripts, this allows them to add comments and arrange rules in more human-friendly way. This is problematic though since shell scripts break atomicity when applying the ruleset, thus, the filtering policy is applied in an inconsistent way during the ruleset loading time.&lt;br /&gt;
&lt;br /&gt;
Fortunately, nftables provides a native scripting environment to address these concerns which basically allows you to include other ruleset files, define variables and add comments. You have to restore the content of this native script through the &#039;&#039;nft -f my-ruleset.file&#039;&#039; command.&lt;br /&gt;
&lt;br /&gt;
To create a nftables script, you have to add the following header to your script file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/sbin/nft -f&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Adding comments =&lt;br /&gt;
&lt;br /&gt;
You can add comments to your file using the &#039;#&#039; character. Everything after the &#039;#&#039; will be ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/sbin/nft -f&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# table declaration&lt;br /&gt;
#&lt;br /&gt;
add table filter&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# chain declaration&lt;br /&gt;
#&lt;br /&gt;
add chain filter input { type filter hook input priority 0; policy drop; }&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# rule declaration&lt;br /&gt;
#&lt;br /&gt;
add rule filter input ct state established,related counter accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Including files =&lt;br /&gt;
&lt;br /&gt;
Other files can be included by using the include statement. The directories to be searched for include files can be specified using the &#039;&#039;&#039;-I/--includepath&#039;&#039;&#039; option. You can override this behavior either by prepending ‘./’ to your path to force inclusion of&lt;br /&gt;
files located in the current working directory (i.e. relative path) or / for file location expressed as an absolute path.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;&#039;-I/--includepath&#039;&#039;&#039; is not specified, then nft relies on the default directory that is specified at compile time. You can retrieve this default directory via &#039;&#039;&#039;-h/--help&#039;&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
Include statements support the usual shell wildcard symbols (\*,?,[]). Having no matches for an include statement is not an error, if wildcard symbols are used in the include statement.&lt;br /&gt;
&lt;br /&gt;
This allows having potentially empty include directories for statements like include &amp;quot;/etc/firewall/rules/&amp;quot;.&lt;br /&gt;
The wildcard matches are loaded in alphabetical order.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Files beginning with dot (.) are not matched by include statements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/sbin/nft -f&lt;br /&gt;
&lt;br /&gt;
# include a single file using the default search path&lt;br /&gt;
include &amp;quot;ipv4-nat.ruleset&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# include all files ending in *.nft in the default search path&lt;br /&gt;
include &amp;quot;*.nft&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# include all files in a given directory using an absolute path&lt;br /&gt;
include &amp;quot;/etc/nftables/*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Defining variables =&lt;br /&gt;
&lt;br /&gt;
You can use the &#039;&#039;define&#039;&#039; keyword to define variables, the following example shows a very simple ruleset to account the traffic that comes from 8.8.8.8 (the popular Google DNS server):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/sbin/nft -f&lt;br /&gt;
&lt;br /&gt;
define google_dns = 8.8.8.8&lt;br /&gt;
&lt;br /&gt;
add table filter&lt;br /&gt;
add chain filter input { type filter hook input priority 0; }&lt;br /&gt;
add rule filter input ip saddr $google_dns counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also define a variable for sets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/sbin/nft -f&lt;br /&gt;
&lt;br /&gt;
define ntp_servers = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 }&lt;br /&gt;
&lt;br /&gt;
add table filter&lt;br /&gt;
add chain filter input { type filter hook input priority 0; }&lt;br /&gt;
add rule filter input ip saddr $ntp_servers counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget that brackets have special semantics when used from rules, since they indicate that this variable represents a set. Therefore, avoid things like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define google_dns = { 8.8.8.8 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is simply overkill to define a set that only stores one single element, instead use the singleton definition:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define google_dns = 8.8.8.8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= File formats =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;nft -f &amp;lt;filename&amp;gt;&#039;&#039; accepts 2 formats, the first is the format seen in the output of &#039;&#039;nft list table&#039;&#039;. The second is using the same syntax of calling the &#039;&#039;nft&#039;&#039; binary several times, but in an atomic fashion.&lt;br /&gt;
&lt;br /&gt;
Example of nftables output format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/sbin/nft -f&lt;br /&gt;
&lt;br /&gt;
define ntp_servers = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 }&lt;br /&gt;
&lt;br /&gt;
#flush table nat&lt;br /&gt;
table ip nat {&lt;br /&gt;
	chain prerouting {&lt;br /&gt;
		type filter hook prerouting priority 0; policy accept;&lt;br /&gt;
                ip saddr $ntp_servers counter&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	chain postrouting {&lt;br /&gt;
		type filter hook postrouting priority 100; policy accept;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of scripted config format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/sbin/nft -f&lt;br /&gt;
&lt;br /&gt;
define ntp_servers = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 }&lt;br /&gt;
&lt;br /&gt;
add table filter&lt;br /&gt;
add chain filter input { type filter hook input priority 0; }&lt;br /&gt;
add rule filter input ip saddr $ntp_servers counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can freely translate between the two formats, as the syntax is mostly the same (only the organization differs).&lt;br /&gt;
Depending on your use case, you may want to use one format or other when building your firewall.&lt;br /&gt;
&lt;br /&gt;
= Building an &#039;&#039;nft&#039;&#039; file from scripts =&lt;br /&gt;
Though not necessarily recommended, you can use your choice of scripting language to build a single text file in a format accepted by &#039;&#039;nft&#039;&#039; (see previous section), and then load the firewall configuration atomically with &#039;&#039;nft -f &amp;lt;your_file_in_nft_format&amp;gt;&#039;&#039;. You may want to use this method if you are coordinating your &#039;&#039;nft&#039;&#039; configuration with that of other subsystems that use different file formats and command-line tools.&lt;br /&gt;
&lt;br /&gt;
= Using nftables from Python =&lt;br /&gt;
The same functionality provided by the &#039;&#039;nft&#039;&#039; command-line utility is available from within Python programs via the high-level library libnftables. Please see the following for more information and examples:&lt;br /&gt;
* [https://ral-arturo.org/2020/11/22/python-nftables-tutorial.html How to use nftables from Python], Arturo Borrero, 2020-11-22;&lt;br /&gt;
* [https://github.com/aborrero/python-nftables-tutorial python nftables tutorial] code examples to accompany the above.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
This related information is very useful when dealing with nftables scripts:&lt;br /&gt;
&lt;br /&gt;
* [[Atomic rule replacement]]&lt;br /&gt;
* [[Operations at ruleset level]]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Simple_ruleset_for_a_server&amp;diff=1058</id>
		<title>Simple ruleset for a server</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Simple_ruleset_for_a_server&amp;diff=1058"/>
		<updated>2022-01-31T17:34:46Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* nftables.conf */ missing closing curly brace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here&#039;s a very basic example for a web server, you can load the ruleset file with &#039;&#039;nft -f&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= nftables.conf =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset                                                                    &lt;br /&gt;
                                                                                 &lt;br /&gt;
table inet firewall {&lt;br /&gt;
                                                                                 &lt;br /&gt;
    chain inbound_ipv4 {&lt;br /&gt;
        # accepting ping (icmp-echo-request) for diagnostic purposes.&lt;br /&gt;
        # However, it also lets probes discover this host is alive.&lt;br /&gt;
        # This sample accepts them within a certain rate limit:&lt;br /&gt;
        #&lt;br /&gt;
        # icmp type echo-request limit rate 5/second accept      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain inbound_ipv6 {                                                         &lt;br /&gt;
        # accept neighbour discovery otherwise connectivity breaks&lt;br /&gt;
        #&lt;br /&gt;
        icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept&lt;br /&gt;
                                                                                 &lt;br /&gt;
        # accepting ping (icmpv6-echo-request) for diagnostic purposes.&lt;br /&gt;
        # However, it also lets probes discover this host is alive.&lt;br /&gt;
        # This sample accepts them within a certain rate limit:&lt;br /&gt;
        #&lt;br /&gt;
        # icmpv6 type echo-request limit rate 5/second accept&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain inbound {                                                              &lt;br /&gt;
&lt;br /&gt;
        # By default, drop all traffic unless it meets a filter&lt;br /&gt;
        # criteria specified by the rules that follow below.&lt;br /&gt;
        type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets, drop invalid&lt;br /&gt;
        ct state vmap { established : accept, related : accept, invalid : drop } &lt;br /&gt;
&lt;br /&gt;
        # Allow loopback traffic.&lt;br /&gt;
        iifname lo accept&lt;br /&gt;
&lt;br /&gt;
        # Jump to chain according to layer 3 protocol using a verdict map&lt;br /&gt;
        meta protocol vmap { ip : jump inbound_ipv4, ip6 : jump inbound_ipv6 }&lt;br /&gt;
&lt;br /&gt;
        # Allow SSH on port TCP/22 and allow HTTP(S) TCP/80 and TCP/443&lt;br /&gt;
        # for IPv4 and IPv6.&lt;br /&gt;
        tcp dport { 22, 80, 443} accept&lt;br /&gt;
&lt;br /&gt;
        # Uncomment to enable logging of denied inbound traffic&lt;br /&gt;
        # log prefix &amp;quot;[nftables] Inbound Denied: &amp;quot; counter drop&lt;br /&gt;
    }                                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
    chain forward {                                                              &lt;br /&gt;
        # Drop everything (assumes this device is not a router)                  &lt;br /&gt;
        type filter hook forward priority 0; policy drop;                        &lt;br /&gt;
    }                                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
    # no need to define output chain, default policy is accept if undefined.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Sets&amp;diff=1029</id>
		<title>Sets</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Sets&amp;diff=1029"/>
		<updated>2021-09-03T22:51:19Z</updated>

		<summary type="html">&lt;p&gt;Pablo: add query for element s in a set&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;nftables&#039;&#039; comes with a built-in generic set infrastructure that allows you to use &#039;&#039;&#039;any&#039;&#039;&#039; supported selector to build sets. This infrastructure makes possible the representation of [[maps]] and [[Verdict_Maps_(vmaps) | verdict&amp;amp;nbsp;maps]].&lt;br /&gt;
&lt;br /&gt;
The set elements are internally represented using performance data structures such as hashtables and red-black trees.&lt;br /&gt;
&lt;br /&gt;
= Anonymous sets =&lt;br /&gt;
&lt;br /&gt;
Anonymous sets are those that are:&lt;br /&gt;
&lt;br /&gt;
* Bound to a rule, if the rule is removed, that set is released too.&lt;br /&gt;
* They have no specific name, the kernel internally allocates an identifier.&lt;br /&gt;
* They cannot be updated. So you cannot add and delete elements from it once it is bound to a rule.&lt;br /&gt;
&lt;br /&gt;
The following example shows how to create a simple set.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule ip filter output tcp dport { 22, 23 } counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule above catches all traffic going to TCP ports 22 and 23, in case of matching the counters are updated.&lt;br /&gt;
&lt;br /&gt;
Eric Leblond in his [https://home.regit.org/2014/01/why-you-will-love-nftables/ Why you will love nftables] article shows a very simple example to compare iptables with nftables:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6tables -A INPUT -p tcp -m multiport --dports 23,80,443 -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT&lt;br /&gt;
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which can be expressed in &#039;&#039;nftables&#039;&#039; with a couple of rules that provide a set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule ip6 filter input tcp dport {telnet, http, https} accept&lt;br /&gt;
% nft add rule ip6 filter input icmpv6 type { nd-neighbor-solicit, echo-request, nd-router-advert, nd-neighbor-advert } accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Named sets =&lt;br /&gt;
&lt;br /&gt;
You can use &#039;&#039;nft add set&#039;&#039; to create a named set. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add set ip filter blackhole { type ipv4_addr\;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
creates a set named &#039;&#039;blackhole&#039;&#039;. Set names must be 16 characters or less. The &#039;&#039;type&#039;&#039; keyword indicates the data type of elements to be stored in the set. In this case &#039;&#039;blackhole&#039;&#039; stores IPv4 addresses, which you can add using &#039;&#039;nft add element&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add element ip filter blackhole { 192.168.3.4 }&lt;br /&gt;
% nft add element ip filter blackhole { 192.168.1.4, 192.168.1.5 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use named sets from rules, as for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule ip filter input ip saddr @blackhole drop&lt;br /&gt;
% nft add rule ip filter output ip daddr != @blackhole accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Named sets can be updated anytime.&lt;br /&gt;
&lt;br /&gt;
== nftables.conf syntax ==&lt;br /&gt;
&lt;br /&gt;
When working with nftables.conf, you can define sets in a number of ways. You can then reference those sets later on using &amp;lt;code&amp;gt;$VARIABLE_NAME&amp;lt;/code&amp;gt; notation.&lt;br /&gt;
&lt;br /&gt;
Here are some examples showing sets defined in one line, spanning multiple lines, and sets referencing other sets. The set is then used in a rule to allow incoming traffic from certain IP ranges.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
define SIMPLE_SET = { 192.168.1.1, 192.168.1.2 }&lt;br /&gt;
&lt;br /&gt;
define CDN_EDGE = {&lt;br /&gt;
    192.168.1.1,&lt;br /&gt;
    192.168.1.2,&lt;br /&gt;
    192.168.1.3,&lt;br /&gt;
    10.0.0.0/8&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
define CDN_MONITORS = {&lt;br /&gt;
    192.168.1.10,&lt;br /&gt;
    192.168.1.20&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
define CDN = {&lt;br /&gt;
    $CDN_EDGE,&lt;br /&gt;
    $CDN_MONITORS&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Allow HTTP(S) from approved IP ranges only&lt;br /&gt;
tcp dport { http, https } ip saddr $CDN accept&lt;br /&gt;
udp dport { http, https } ip saddr $CDN accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Named sets specifications =&lt;br /&gt;
&lt;br /&gt;
Sets specifications are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039; or &#039;&#039;&#039;typeof&#039;&#039;&#039;, is obligatory and determines the data type of the set elements.&lt;br /&gt;
&lt;br /&gt;
Supported data types if using the &#039;&#039;&#039;type&#039;&#039;&#039; keyword are:&lt;br /&gt;
** &#039;&#039;ipv4_addr&#039;&#039;: IPv4 address&lt;br /&gt;
** &#039;&#039;ipv6_addr&#039;&#039;: IPv6 address.&lt;br /&gt;
** &#039;&#039;ether_addr&#039;&#039;: Ethernet address.&lt;br /&gt;
** &#039;&#039;inet_proto&#039;&#039;: Inet protocol type.&lt;br /&gt;
** &#039;&#039;inet_service&#039;&#039;: Internet service (read tcp port for example)&lt;br /&gt;
** &#039;&#039;mark&#039;&#039;: Mark type.&lt;br /&gt;
** &#039;&#039;ifname&#039;&#039;: Network interface name (eth0, eth1..)&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;typeof&#039;&#039;&#039; keyword is available since &#039;&#039;&#039;0.9.4&#039;&#039;&#039; and allows you to use a high level expression, then let nftables resolve the base type for you:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table inet mytable {&lt;br /&gt;
	set s1 {&lt;br /&gt;
		typeof osf name&lt;br /&gt;
		elements = { &amp;quot;Linux&amp;quot; }&lt;br /&gt;
	}&lt;br /&gt;
	set s2 {&lt;br /&gt;
		typeof vlan id&lt;br /&gt;
		elements = { 2, 3, 103 }&lt;br /&gt;
	}&lt;br /&gt;
	set s3 {&lt;br /&gt;
		typeof ip daddr&lt;br /&gt;
		elements = { 1.1.1.1 }&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;timeout&#039;&#039;&#039;, it determines how long an element stays in the set. The time string respects the format: &#039;&#039;&amp;quot;v&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;dv&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;hv&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;mv&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;s&amp;quot;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add table ip filter&lt;br /&gt;
% nft add set ip filter ports {type inet_service \; timeout 3h45s \;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These commands create a table named &#039;&#039;filter&#039;&#039; and add a set named &#039;&#039;ports&#039;&#039; to it, where elements are deleted after 3 hours and 45 seconds of being added.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;flags&#039;&#039;&#039;, the available flags are:&lt;br /&gt;
** &#039;&#039;constant&#039;&#039; - set content may not change while bound&lt;br /&gt;
** &#039;&#039;interval&#039;&#039; - set contains intervals&lt;br /&gt;
** &#039;&#039;timeout&#039;&#039; - elements can be added with a timeout&lt;br /&gt;
&lt;br /&gt;
Multiple flags should be separated by comma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add set ip filter flags_set {type ipv4_addr\; flags constant, interval\;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gc-interval&#039;&#039;&#039;, stands for garbage collection interval, can only be used if &#039;&#039;timeout&#039;&#039; or &#039;&#039;flags timeout&#039;&#039; are active. The interval follows the same format of &#039;&#039;timeouts&#039;&#039; time string &#039;&#039;&amp;quot;v&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;dv&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;hv&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;mv&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;s&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;elements&#039;&#039;&#039;, initialize the set with some elements in it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add set ip filter daddrs {type ipv4_addr \; flags timeout \; elements={192.168.1.1 timeout 10s, 192.168.1.2 timeout 30s} \;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This command creates a set name &#039;&#039;daddrs&#039;&#039; with elements &#039;&#039;192.168.1.1&#039;&#039;, which stays in it for 10s, and &#039;&#039;192.168.1.2&#039;&#039;, which stays for 30s.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;size&#039;&#039;&#039;, limits the maximum number of elements of the set. To create a set with maximum 2 elements type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add set ip filter saddrs {type ipv4_addr \; size 2 \;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;policy&#039;&#039;&#039;, determines set selection policy. Available values are:&lt;br /&gt;
** &#039;&#039;performance&#039;&#039; [default]&lt;br /&gt;
** &#039;&#039;memory&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counter&#039;&#039;&#039;, (available since version &#039;&#039;&#039;0.9.5&#039;&#039;&#039;) which enables a counter per element:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table inet mytable {&lt;br /&gt;
	set s {&lt;br /&gt;
		typeof ip saddr&lt;br /&gt;
		counter&lt;br /&gt;
		elements = { 1.1.1.1 counter packets 0 bytes 0, 1.1.1.2 counter packets 0 bytes 0,&lt;br /&gt;
			     1.1.1.3 counter packets 0 bytes 0, 1.1.1.4 counter packets 0 bytes 0 }&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Listing named sets =&lt;br /&gt;
&lt;br /&gt;
You can list the content of a named set via:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list set ip filter myset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Query for element membership in a set = &lt;br /&gt;
&lt;br /&gt;
You can also check if an element exists in the set from its key:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft get element ip filter myset { 1.1.1.1 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The example above checks if the IPv4 address 1.1.1.1 exists in the &#039;&#039;myset&#039;&#039; set.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Matching_packet_headers&amp;diff=1028</id>
		<title>Matching packet headers</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Matching_packet_headers&amp;diff=1028"/>
		<updated>2021-08-31T11:41:27Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Matching transport protocol */ a bit more detailed explanation on how meta l4proto works&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;nft&#039;&#039; command line utility supports the following layer 4 protocols: AH, ESP, UDP, UDPlite, TCP, DCCP, SCTP and IPComp.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ethernet headers =&lt;br /&gt;
&lt;br /&gt;
You can match packets on [https://en.wikipedia.org/wiki/Ethernet ethernet] source or destination address or on [https://en.wikipedia.org/wiki/EtherType EtherType]:&lt;br /&gt;
* &#039;&#039;ether&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr&#039;&#039;} &amp;amp;laquo;[[Data_types#Ethernet_types|ether_addr]]&amp;amp;raquo;&lt;br /&gt;
* &#039;&#039;ether type&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo;&lt;br /&gt;
&lt;br /&gt;
If you want to match ethernet traffic whose destination address is ff:ff:ff:ff:ff:ff, you can type the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ether daddr ff:ff:ff:ff:ff:ff counter &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also match packets on [https://en.wikipedia.org/wiki/IEEE_802.1Q IEEE 802.1Q] VLAN fields, if present:&lt;br /&gt;
* &#039;&#039;vlan type&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo; - always &#039;&#039;vlan&#039;&#039; for 802.1Q&lt;br /&gt;
* &#039;&#039;vlan id&#039;&#039; &amp;amp;laquo;12-bit integer&amp;amp;raquo; - match VID, the VLAN ID&lt;br /&gt;
* &#039;&#039;vlan cfi&#039;&#039; &amp;amp;laquo;1-bit integer&amp;amp;raquo; - match DEI, Drop Eligible Indicator (formerly CFI, Canonical Format Indicator) &lt;br /&gt;
* &#039;&#039;vlan pcp&#039;&#039; &amp;amp;laquo;3-bit integer&amp;amp;raquo; - match [https://en.wikipedia.org/wiki/IEEE_P802.1p IEEE P802.1p PCP, Priority Code Point]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do not forget that the [https://en.wikipedia.org/wiki/Link_layer layer 2] header information is only available in the input path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ARP headers =&lt;br /&gt;
&lt;br /&gt;
You can match [https://en.wikipedia.org/wiki/Address_Resolution_Protocol ARP] headers:&lt;br /&gt;
* &#039;&#039;arp htype&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|16-bit integer HTYPE]]&amp;amp;raquo; - match hardware link protocol type (1 for ethernet)&lt;br /&gt;
* &#039;&#039;arp ptype&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo; - match EtherType&lt;br /&gt;
* &#039;&#039;arp hlen&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|8-bit integer HLEN]]&amp;amp;raquo; - match hardware address length in octets (6 for ethernet)&lt;br /&gt;
* &#039;&#039;arp plen&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|8-bit integer PLEN]]&amp;amp;raquo; - match internetwork protocol address length in octets (4 for IPv4)&lt;br /&gt;
* &#039;&#039;arp operation&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|arp_op]]&amp;amp;raquo; - match ARP operation&lt;br /&gt;
* &#039;&#039;arp&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr &#039;&#039;} &#039;&#039;ether&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_addr]]&amp;amp;raquo; - &#039;&#039;saddr&#039;&#039; matches SHA, Sender Hardware Address; &#039;&#039;daddr&#039;&#039; matches THA, Target Hardware Address &lt;br /&gt;
* &#039;&#039;arp&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr &#039;&#039;} &#039;&#039;ip&#039;&#039; &amp;amp;laquo;[[Data_types#IP_types|ipv4_addr]]&amp;amp;raquo; - &#039;&#039;saddr&#039;&#039; matches SPA, Sender Protocol Address; &#039;&#039;daddr&#039;&#039; matches TPA, Target Protocol Address&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching IPv4 headers =&lt;br /&gt;
&lt;br /&gt;
You can also match traffic based on the IPv4 source and destination, the following example shows how to account all traffic that comes from 192.168.1.100 and that is addressed to 192.168.1.1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ip saddr 192.168.1.100 ip daddr 192.168.1.1 counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that, since the rule is attached to the input chain, your local machine needs to use the 192.168.1.1 address, otherwise you won&#039;t see any matching ;-).&lt;br /&gt;
&lt;br /&gt;
To filter on a layer 4 protocol like TCP, you can use the &#039;&#039;protocol&#039;&#039; keyword:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input protocol tcp counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ICMP traffic =&lt;br /&gt;
&lt;br /&gt;
You can drop all [https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol ICMP] echo requests (popularly known as &#039;&#039;pings&#039;&#039;) via:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input icmp type echo-request counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use &#039;&#039;nft describe&#039;&#039; to find &#039;&#039;nft&#039;&#039;&#039;s available &#039;&#039;icmp type&#039;&#039; keywords:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft describe icmp type&lt;br /&gt;
payload expression, datatype icmp_type (ICMP type) (basetype integer), 8 bits&lt;br /&gt;
&lt;br /&gt;
pre-defined symbolic constants (in decimal):&lt;br /&gt;
        echo-reply                                         0&lt;br /&gt;
        destination-unreachable                            3&lt;br /&gt;
        source-quench                                      4&lt;br /&gt;
        redirect                                           5&lt;br /&gt;
        echo-request                                       8&lt;br /&gt;
        router-advertisement                               9&lt;br /&gt;
        router-solicitation                               10&lt;br /&gt;
        time-exceeded                                     11&lt;br /&gt;
        parameter-problem                                 12&lt;br /&gt;
        timestamp-request                                 13&lt;br /&gt;
        timestamp-reply                                   14&lt;br /&gt;
        info-request                                      15&lt;br /&gt;
        info-reply                                        16&lt;br /&gt;
        address-mask-request                              17&lt;br /&gt;
        address-mask-reply                                18&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also be more specific by matching a single icmp code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft describe icmp code&lt;br /&gt;
payload expression, datatype icmp_code (icmp code) (basetype integer), 8 bits&lt;br /&gt;
&lt;br /&gt;
pre-defined symbolic constants (in decimal):&lt;br /&gt;
        net-unreachable                                    0&lt;br /&gt;
        host-unreachable                                   1&lt;br /&gt;
        prot-unreachable                                   2&lt;br /&gt;
        port-unreachable                                   3&lt;br /&gt;
        net-prohibited                                     9&lt;br /&gt;
        host-prohibited                                   10&lt;br /&gt;
        admin-prohibited                                  13&lt;br /&gt;
        frag-needed                                        4&lt;br /&gt;
&lt;br /&gt;
% nft add rule filter output icmp code frag-needed counter accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching IPv6 headers =&lt;br /&gt;
&lt;br /&gt;
If you want to account IPv6 traffic that is addressed to &#039;&#039;abcd::100&#039;&#039;, you can type the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter output ip6 daddr abcd::100 counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not forget to create an &#039;&#039;ip6&#039;&#039; [[Configuring tables|table]] and register the corresponding [[Configuring chains|chains]] to run the examples.&lt;br /&gt;
&lt;br /&gt;
To filter on a layer 4 protocol like TCP, you can match on the &#039;&#039;nexthdr&#039;&#039; field of the IPv6 header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ip6 nexthdr tcp counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Caution when using &#039;&#039;ip6 nexthdr&#039;&#039;, the value only refers to the next header, i.e. ip6 nexthdr tcp will only match if the ipv6 packet does not contain any extension headers. &lt;br /&gt;
Specifically, using &#039;&#039;ip6 nexthdr&#039;&#039; to match on IPv6 ICMP matching might break because quoting RFC2710:&lt;br /&gt;
&lt;br /&gt;
 MLD message types are a subset of the set of ICMPv6 messages, and MLD messages&lt;br /&gt;
 are identified in IPv6 packets by a preceding Next Header value of 58.&lt;br /&gt;
 All MLD messages described in this document are sent with a link-local IPv6&lt;br /&gt;
 Source Address, an IPv6 Hop Limit of 1, and an IPv6 Router Alert option&lt;br /&gt;
 [RTR-ALERT] in a Hop-by-Hop Options header.&lt;br /&gt;
&lt;br /&gt;
a hop-by-hop extension header comes between the IPv6 header and the ICMPv6 header, hence, the nexthdr field shows 58 in that case.&lt;br /&gt;
&lt;br /&gt;
You could use &#039;&#039;meta l4proto&#039;&#039; to match on the transport protocol (ie. TCP, UDP, ICMPv6,...), this is walking down the headers until the real transport protocol is found.&lt;br /&gt;
&lt;br /&gt;
If you specifically want to match on the ICMPv6 type, then &#039;&#039;nftables&#039;&#039; creates an implicit &#039;&#039;meta l4proto&#039;&#039; dependency that is not shown, therefore, there is no need for&lt;br /&gt;
being verbose in your notation, ie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
works fine to accept all ICMPv6 traffic regardless any possible extension headers.&lt;br /&gt;
&lt;br /&gt;
NOTE: the syntax mixing IPv6/IPv4 notation is not supported yet: &#039;::ffff:192.168.1.0&#039;&lt;br /&gt;
&lt;br /&gt;
= Matching transport protocol =&lt;br /&gt;
&lt;br /&gt;
The following rule shows how to match any kind of &#039;&#039;TCP&#039;&#039; traffic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter output ip protocol tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are on the &#039;&#039;inet&#039;&#039; family, then use &#039;&#039;meta l4proto&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule inet filter output meta l4proto tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This allows you to match on the transport protocol regardless the packet is either IPv4 or IPv6. For IPv6, &#039;&#039;meta l4proto&#039;&#039; also skips any extension header until the first transport protocol is found.&lt;br /&gt;
&lt;br /&gt;
= Matching TCP/UDP/UDPlite traffic =&lt;br /&gt;
&lt;br /&gt;
The following examples show how to drop all tcp traffic for low TCP ports (1-1024):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input tcp dport 1-1024 counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this rule is using an [[intervals|interval]] (from 1 to 1024).&lt;br /&gt;
&lt;br /&gt;
To match on TCP flags, you need to use a binary operation. For example, to count packets that are not SYN ones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input tcp flags != syn counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More complex filters can be used. For example, to count and log TCP packets with flags SYN and ACK set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft -i&lt;br /&gt;
nft&amp;gt; add rule filter output tcp flags &amp;amp; (syn | ack) == syn | ack counter log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example drops TCP SYN packets which a MSS lower than 500:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule inet filter input tcp flags syn tcp option maxseg size 1-500 drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching UDP/TCP headers in the same rule =&lt;br /&gt;
&lt;br /&gt;
The following example uses an anonymous l4proto [[Sets|set]] and a &#039;&#039;th&#039;&#039; (transport header) expression to match both TCP and UDP packets directed to port 53 (DNS):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input meta l4proto { tcp, udp }  th dport 53  counter packets 0 bytes 0  accept  comment \&amp;quot;accept DNS\&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Before nftables 0.9.2 and Linux kernel 5.3 the &#039;&#039;th&#039;&#039; expression is not available. In this case you can use a [https://www.mankier.com/8/nft#Payload_Expressions-Raw_Payload_Expression raw payload expression] to do the same job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input meta l4proto { tcp, udp }  @th,16,16 53  counter packets 0 bytes 0  accept  comment \&amp;quot;accept DNS\&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Matching_packet_headers&amp;diff=1027</id>
		<title>Matching packet headers</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Matching_packet_headers&amp;diff=1027"/>
		<updated>2021-08-31T11:39:34Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Matching IPv6 headers */ another typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;nft&#039;&#039; command line utility supports the following layer 4 protocols: AH, ESP, UDP, UDPlite, TCP, DCCP, SCTP and IPComp.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ethernet headers =&lt;br /&gt;
&lt;br /&gt;
You can match packets on [https://en.wikipedia.org/wiki/Ethernet ethernet] source or destination address or on [https://en.wikipedia.org/wiki/EtherType EtherType]:&lt;br /&gt;
* &#039;&#039;ether&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr&#039;&#039;} &amp;amp;laquo;[[Data_types#Ethernet_types|ether_addr]]&amp;amp;raquo;&lt;br /&gt;
* &#039;&#039;ether type&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo;&lt;br /&gt;
&lt;br /&gt;
If you want to match ethernet traffic whose destination address is ff:ff:ff:ff:ff:ff, you can type the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ether daddr ff:ff:ff:ff:ff:ff counter &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also match packets on [https://en.wikipedia.org/wiki/IEEE_802.1Q IEEE 802.1Q] VLAN fields, if present:&lt;br /&gt;
* &#039;&#039;vlan type&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo; - always &#039;&#039;vlan&#039;&#039; for 802.1Q&lt;br /&gt;
* &#039;&#039;vlan id&#039;&#039; &amp;amp;laquo;12-bit integer&amp;amp;raquo; - match VID, the VLAN ID&lt;br /&gt;
* &#039;&#039;vlan cfi&#039;&#039; &amp;amp;laquo;1-bit integer&amp;amp;raquo; - match DEI, Drop Eligible Indicator (formerly CFI, Canonical Format Indicator) &lt;br /&gt;
* &#039;&#039;vlan pcp&#039;&#039; &amp;amp;laquo;3-bit integer&amp;amp;raquo; - match [https://en.wikipedia.org/wiki/IEEE_P802.1p IEEE P802.1p PCP, Priority Code Point]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do not forget that the [https://en.wikipedia.org/wiki/Link_layer layer 2] header information is only available in the input path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ARP headers =&lt;br /&gt;
&lt;br /&gt;
You can match [https://en.wikipedia.org/wiki/Address_Resolution_Protocol ARP] headers:&lt;br /&gt;
* &#039;&#039;arp htype&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|16-bit integer HTYPE]]&amp;amp;raquo; - match hardware link protocol type (1 for ethernet)&lt;br /&gt;
* &#039;&#039;arp ptype&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo; - match EtherType&lt;br /&gt;
* &#039;&#039;arp hlen&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|8-bit integer HLEN]]&amp;amp;raquo; - match hardware address length in octets (6 for ethernet)&lt;br /&gt;
* &#039;&#039;arp plen&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|8-bit integer PLEN]]&amp;amp;raquo; - match internetwork protocol address length in octets (4 for IPv4)&lt;br /&gt;
* &#039;&#039;arp operation&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|arp_op]]&amp;amp;raquo; - match ARP operation&lt;br /&gt;
* &#039;&#039;arp&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr &#039;&#039;} &#039;&#039;ether&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_addr]]&amp;amp;raquo; - &#039;&#039;saddr&#039;&#039; matches SHA, Sender Hardware Address; &#039;&#039;daddr&#039;&#039; matches THA, Target Hardware Address &lt;br /&gt;
* &#039;&#039;arp&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr &#039;&#039;} &#039;&#039;ip&#039;&#039; &amp;amp;laquo;[[Data_types#IP_types|ipv4_addr]]&amp;amp;raquo; - &#039;&#039;saddr&#039;&#039; matches SPA, Sender Protocol Address; &#039;&#039;daddr&#039;&#039; matches TPA, Target Protocol Address&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching IPv4 headers =&lt;br /&gt;
&lt;br /&gt;
You can also match traffic based on the IPv4 source and destination, the following example shows how to account all traffic that comes from 192.168.1.100 and that is addressed to 192.168.1.1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ip saddr 192.168.1.100 ip daddr 192.168.1.1 counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that, since the rule is attached to the input chain, your local machine needs to use the 192.168.1.1 address, otherwise you won&#039;t see any matching ;-).&lt;br /&gt;
&lt;br /&gt;
To filter on a layer 4 protocol like TCP, you can use the &#039;&#039;protocol&#039;&#039; keyword:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input protocol tcp counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ICMP traffic =&lt;br /&gt;
&lt;br /&gt;
You can drop all [https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol ICMP] echo requests (popularly known as &#039;&#039;pings&#039;&#039;) via:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input icmp type echo-request counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use &#039;&#039;nft describe&#039;&#039; to find &#039;&#039;nft&#039;&#039;&#039;s available &#039;&#039;icmp type&#039;&#039; keywords:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft describe icmp type&lt;br /&gt;
payload expression, datatype icmp_type (ICMP type) (basetype integer), 8 bits&lt;br /&gt;
&lt;br /&gt;
pre-defined symbolic constants (in decimal):&lt;br /&gt;
        echo-reply                                         0&lt;br /&gt;
        destination-unreachable                            3&lt;br /&gt;
        source-quench                                      4&lt;br /&gt;
        redirect                                           5&lt;br /&gt;
        echo-request                                       8&lt;br /&gt;
        router-advertisement                               9&lt;br /&gt;
        router-solicitation                               10&lt;br /&gt;
        time-exceeded                                     11&lt;br /&gt;
        parameter-problem                                 12&lt;br /&gt;
        timestamp-request                                 13&lt;br /&gt;
        timestamp-reply                                   14&lt;br /&gt;
        info-request                                      15&lt;br /&gt;
        info-reply                                        16&lt;br /&gt;
        address-mask-request                              17&lt;br /&gt;
        address-mask-reply                                18&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also be more specific by matching a single icmp code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft describe icmp code&lt;br /&gt;
payload expression, datatype icmp_code (icmp code) (basetype integer), 8 bits&lt;br /&gt;
&lt;br /&gt;
pre-defined symbolic constants (in decimal):&lt;br /&gt;
        net-unreachable                                    0&lt;br /&gt;
        host-unreachable                                   1&lt;br /&gt;
        prot-unreachable                                   2&lt;br /&gt;
        port-unreachable                                   3&lt;br /&gt;
        net-prohibited                                     9&lt;br /&gt;
        host-prohibited                                   10&lt;br /&gt;
        admin-prohibited                                  13&lt;br /&gt;
        frag-needed                                        4&lt;br /&gt;
&lt;br /&gt;
% nft add rule filter output icmp code frag-needed counter accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching IPv6 headers =&lt;br /&gt;
&lt;br /&gt;
If you want to account IPv6 traffic that is addressed to &#039;&#039;abcd::100&#039;&#039;, you can type the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter output ip6 daddr abcd::100 counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not forget to create an &#039;&#039;ip6&#039;&#039; [[Configuring tables|table]] and register the corresponding [[Configuring chains|chains]] to run the examples.&lt;br /&gt;
&lt;br /&gt;
To filter on a layer 4 protocol like TCP, you can match on the &#039;&#039;nexthdr&#039;&#039; field of the IPv6 header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ip6 nexthdr tcp counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Caution when using &#039;&#039;ip6 nexthdr&#039;&#039;, the value only refers to the next header, i.e. ip6 nexthdr tcp will only match if the ipv6 packet does not contain any extension headers. &lt;br /&gt;
Specifically, using &#039;&#039;ip6 nexthdr&#039;&#039; to match on IPv6 ICMP matching might break because quoting RFC2710:&lt;br /&gt;
&lt;br /&gt;
 MLD message types are a subset of the set of ICMPv6 messages, and MLD messages&lt;br /&gt;
 are identified in IPv6 packets by a preceding Next Header value of 58.&lt;br /&gt;
 All MLD messages described in this document are sent with a link-local IPv6&lt;br /&gt;
 Source Address, an IPv6 Hop Limit of 1, and an IPv6 Router Alert option&lt;br /&gt;
 [RTR-ALERT] in a Hop-by-Hop Options header.&lt;br /&gt;
&lt;br /&gt;
a hop-by-hop extension header comes between the IPv6 header and the ICMPv6 header, hence, the nexthdr field shows 58 in that case.&lt;br /&gt;
&lt;br /&gt;
You could use &#039;&#039;meta l4proto&#039;&#039; to match on the transport protocol (ie. TCP, UDP, ICMPv6,...), this is walking down the headers until the real transport protocol is found.&lt;br /&gt;
&lt;br /&gt;
If you specifically want to match on the ICMPv6 type, then &#039;&#039;nftables&#039;&#039; creates an implicit &#039;&#039;meta l4proto&#039;&#039; dependency that is not shown, therefore, there is no need for&lt;br /&gt;
being verbose in your notation, ie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
works fine to accept all ICMPv6 traffic regardless any possible extension headers.&lt;br /&gt;
&lt;br /&gt;
NOTE: the syntax mixing IPv6/IPv4 notation is not supported yet: &#039;::ffff:192.168.1.0&#039;&lt;br /&gt;
&lt;br /&gt;
= Matching transport protocol =&lt;br /&gt;
&lt;br /&gt;
The following rule shows how to match any kind of &#039;&#039;TCP&#039;&#039; traffic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter output ip protocol tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are on the &#039;&#039;inet&#039;&#039; family, then use &#039;&#039;meta l4proto&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule inet filter output meta l4proto tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This allows you to match on the transport protocol regardless the packet is either IPv4 or IPv6.&lt;br /&gt;
&lt;br /&gt;
= Matching TCP/UDP/UDPlite traffic =&lt;br /&gt;
&lt;br /&gt;
The following examples show how to drop all tcp traffic for low TCP ports (1-1024):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input tcp dport 1-1024 counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this rule is using an [[intervals|interval]] (from 1 to 1024).&lt;br /&gt;
&lt;br /&gt;
To match on TCP flags, you need to use a binary operation. For example, to count packets that are not SYN ones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input tcp flags != syn counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More complex filters can be used. For example, to count and log TCP packets with flags SYN and ACK set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft -i&lt;br /&gt;
nft&amp;gt; add rule filter output tcp flags &amp;amp; (syn | ack) == syn | ack counter log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example drops TCP SYN packets which a MSS lower than 500:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule inet filter input tcp flags syn tcp option maxseg size 1-500 drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching UDP/TCP headers in the same rule =&lt;br /&gt;
&lt;br /&gt;
The following example uses an anonymous l4proto [[Sets|set]] and a &#039;&#039;th&#039;&#039; (transport header) expression to match both TCP and UDP packets directed to port 53 (DNS):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input meta l4proto { tcp, udp }  th dport 53  counter packets 0 bytes 0  accept  comment \&amp;quot;accept DNS\&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Before nftables 0.9.2 and Linux kernel 5.3 the &#039;&#039;th&#039;&#039; expression is not available. In this case you can use a [https://www.mankier.com/8/nft#Payload_Expressions-Raw_Payload_Expression raw payload expression] to do the same job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input meta l4proto { tcp, udp }  @th,16,16 53  counter packets 0 bytes 0  accept  comment \&amp;quot;accept DNS\&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Matching_packet_headers&amp;diff=1026</id>
		<title>Matching packet headers</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Matching_packet_headers&amp;diff=1026"/>
		<updated>2021-08-31T11:38:58Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Matching IPv6 headers */ fix typos and style&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;nft&#039;&#039; command line utility supports the following layer 4 protocols: AH, ESP, UDP, UDPlite, TCP, DCCP, SCTP and IPComp.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ethernet headers =&lt;br /&gt;
&lt;br /&gt;
You can match packets on [https://en.wikipedia.org/wiki/Ethernet ethernet] source or destination address or on [https://en.wikipedia.org/wiki/EtherType EtherType]:&lt;br /&gt;
* &#039;&#039;ether&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr&#039;&#039;} &amp;amp;laquo;[[Data_types#Ethernet_types|ether_addr]]&amp;amp;raquo;&lt;br /&gt;
* &#039;&#039;ether type&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo;&lt;br /&gt;
&lt;br /&gt;
If you want to match ethernet traffic whose destination address is ff:ff:ff:ff:ff:ff, you can type the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ether daddr ff:ff:ff:ff:ff:ff counter &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also match packets on [https://en.wikipedia.org/wiki/IEEE_802.1Q IEEE 802.1Q] VLAN fields, if present:&lt;br /&gt;
* &#039;&#039;vlan type&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo; - always &#039;&#039;vlan&#039;&#039; for 802.1Q&lt;br /&gt;
* &#039;&#039;vlan id&#039;&#039; &amp;amp;laquo;12-bit integer&amp;amp;raquo; - match VID, the VLAN ID&lt;br /&gt;
* &#039;&#039;vlan cfi&#039;&#039; &amp;amp;laquo;1-bit integer&amp;amp;raquo; - match DEI, Drop Eligible Indicator (formerly CFI, Canonical Format Indicator) &lt;br /&gt;
* &#039;&#039;vlan pcp&#039;&#039; &amp;amp;laquo;3-bit integer&amp;amp;raquo; - match [https://en.wikipedia.org/wiki/IEEE_P802.1p IEEE P802.1p PCP, Priority Code Point]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do not forget that the [https://en.wikipedia.org/wiki/Link_layer layer 2] header information is only available in the input path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ARP headers =&lt;br /&gt;
&lt;br /&gt;
You can match [https://en.wikipedia.org/wiki/Address_Resolution_Protocol ARP] headers:&lt;br /&gt;
* &#039;&#039;arp htype&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|16-bit integer HTYPE]]&amp;amp;raquo; - match hardware link protocol type (1 for ethernet)&lt;br /&gt;
* &#039;&#039;arp ptype&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo; - match EtherType&lt;br /&gt;
* &#039;&#039;arp hlen&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|8-bit integer HLEN]]&amp;amp;raquo; - match hardware address length in octets (6 for ethernet)&lt;br /&gt;
* &#039;&#039;arp plen&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|8-bit integer PLEN]]&amp;amp;raquo; - match internetwork protocol address length in octets (4 for IPv4)&lt;br /&gt;
* &#039;&#039;arp operation&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|arp_op]]&amp;amp;raquo; - match ARP operation&lt;br /&gt;
* &#039;&#039;arp&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr &#039;&#039;} &#039;&#039;ether&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_addr]]&amp;amp;raquo; - &#039;&#039;saddr&#039;&#039; matches SHA, Sender Hardware Address; &#039;&#039;daddr&#039;&#039; matches THA, Target Hardware Address &lt;br /&gt;
* &#039;&#039;arp&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr &#039;&#039;} &#039;&#039;ip&#039;&#039; &amp;amp;laquo;[[Data_types#IP_types|ipv4_addr]]&amp;amp;raquo; - &#039;&#039;saddr&#039;&#039; matches SPA, Sender Protocol Address; &#039;&#039;daddr&#039;&#039; matches TPA, Target Protocol Address&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching IPv4 headers =&lt;br /&gt;
&lt;br /&gt;
You can also match traffic based on the IPv4 source and destination, the following example shows how to account all traffic that comes from 192.168.1.100 and that is addressed to 192.168.1.1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ip saddr 192.168.1.100 ip daddr 192.168.1.1 counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that, since the rule is attached to the input chain, your local machine needs to use the 192.168.1.1 address, otherwise you won&#039;t see any matching ;-).&lt;br /&gt;
&lt;br /&gt;
To filter on a layer 4 protocol like TCP, you can use the &#039;&#039;protocol&#039;&#039; keyword:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input protocol tcp counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ICMP traffic =&lt;br /&gt;
&lt;br /&gt;
You can drop all [https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol ICMP] echo requests (popularly known as &#039;&#039;pings&#039;&#039;) via:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input icmp type echo-request counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use &#039;&#039;nft describe&#039;&#039; to find &#039;&#039;nft&#039;&#039;&#039;s available &#039;&#039;icmp type&#039;&#039; keywords:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft describe icmp type&lt;br /&gt;
payload expression, datatype icmp_type (ICMP type) (basetype integer), 8 bits&lt;br /&gt;
&lt;br /&gt;
pre-defined symbolic constants (in decimal):&lt;br /&gt;
        echo-reply                                         0&lt;br /&gt;
        destination-unreachable                            3&lt;br /&gt;
        source-quench                                      4&lt;br /&gt;
        redirect                                           5&lt;br /&gt;
        echo-request                                       8&lt;br /&gt;
        router-advertisement                               9&lt;br /&gt;
        router-solicitation                               10&lt;br /&gt;
        time-exceeded                                     11&lt;br /&gt;
        parameter-problem                                 12&lt;br /&gt;
        timestamp-request                                 13&lt;br /&gt;
        timestamp-reply                                   14&lt;br /&gt;
        info-request                                      15&lt;br /&gt;
        info-reply                                        16&lt;br /&gt;
        address-mask-request                              17&lt;br /&gt;
        address-mask-reply                                18&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also be more specific by matching a single icmp code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft describe icmp code&lt;br /&gt;
payload expression, datatype icmp_code (icmp code) (basetype integer), 8 bits&lt;br /&gt;
&lt;br /&gt;
pre-defined symbolic constants (in decimal):&lt;br /&gt;
        net-unreachable                                    0&lt;br /&gt;
        host-unreachable                                   1&lt;br /&gt;
        prot-unreachable                                   2&lt;br /&gt;
        port-unreachable                                   3&lt;br /&gt;
        net-prohibited                                     9&lt;br /&gt;
        host-prohibited                                   10&lt;br /&gt;
        admin-prohibited                                  13&lt;br /&gt;
        frag-needed                                        4&lt;br /&gt;
&lt;br /&gt;
% nft add rule filter output icmp code frag-needed counter accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching IPv6 headers =&lt;br /&gt;
&lt;br /&gt;
If you want to account IPv6 traffic that is addressed to &#039;&#039;abcd::100&#039;&#039;, you can type the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter output ip6 daddr abcd::100 counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not forget to create an &#039;&#039;ip6&#039;&#039; [[Configuring tables|table]] and register the corresponding [[Configuring chains|chains]] to run the examples.&lt;br /&gt;
&lt;br /&gt;
To filter on a layer 4 protocol like TCP, you can match on the &#039;&#039;nexthdr&#039;&#039; field of the IPv6 header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ip6 nexthdr tcp counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Caution when using &#039;&#039;ip6 nexthdr&#039;&#039;, the value only refers to the next header, i.e. ip6 nexthdr tcp will only match if the ipv6 packet does not contain any extension headers. &lt;br /&gt;
Specifically, using &#039;&#039;ip6 nexthdr&#039;&#039; to match on IPv6 ICMP matching might break because quoting RFC2710:&lt;br /&gt;
&lt;br /&gt;
 MLD message types are a subset of the set of ICMPv6 messages, and MLD messages&lt;br /&gt;
 are identified in IPv6 packets by a preceding Next Header value of 58.&lt;br /&gt;
 All MLD messages described in this document are sent with a link-local IPv6&lt;br /&gt;
 Source Address, an IPv6 Hop Limit of 1, and an IPv6 Router Alert option&lt;br /&gt;
 [RTR-ALERT] in a Hop-by-Hop Options header.&lt;br /&gt;
&lt;br /&gt;
a hop-by-hop extension header comes between the IPv6 header and the ICMPv6 header, hence, the nexthdr field shows 58 in that case.&lt;br /&gt;
&lt;br /&gt;
You could use &#039;&#039;meta l4proto&#039;&#039; to match on the transport protocol (ie. TCP, UDP, ICMPv6,...), this is walking down the headers until the real transport protocol is found.&lt;br /&gt;
&lt;br /&gt;
If you specifically want to match on the ICMPv6 type, then &#039;&#039;nftables&#039;&#039; creates an implicit &#039;&#039;meta l4proto&#039;&#039; dependency that is not shown, therefore, there is not for&lt;br /&gt;
being verbose in your notation, ie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
works fine to accept all ICMPv6 traffic regardless any possible extension headers.&lt;br /&gt;
&lt;br /&gt;
NOTE: the syntax mixing IPv6/IPv4 notation is not supported yet: &#039;::ffff:192.168.1.0&#039;&lt;br /&gt;
&lt;br /&gt;
= Matching transport protocol =&lt;br /&gt;
&lt;br /&gt;
The following rule shows how to match any kind of &#039;&#039;TCP&#039;&#039; traffic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter output ip protocol tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are on the &#039;&#039;inet&#039;&#039; family, then use &#039;&#039;meta l4proto&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule inet filter output meta l4proto tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This allows you to match on the transport protocol regardless the packet is either IPv4 or IPv6.&lt;br /&gt;
&lt;br /&gt;
= Matching TCP/UDP/UDPlite traffic =&lt;br /&gt;
&lt;br /&gt;
The following examples show how to drop all tcp traffic for low TCP ports (1-1024):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input tcp dport 1-1024 counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this rule is using an [[intervals|interval]] (from 1 to 1024).&lt;br /&gt;
&lt;br /&gt;
To match on TCP flags, you need to use a binary operation. For example, to count packets that are not SYN ones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input tcp flags != syn counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More complex filters can be used. For example, to count and log TCP packets with flags SYN and ACK set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft -i&lt;br /&gt;
nft&amp;gt; add rule filter output tcp flags &amp;amp; (syn | ack) == syn | ack counter log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example drops TCP SYN packets which a MSS lower than 500:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule inet filter input tcp flags syn tcp option maxseg size 1-500 drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching UDP/TCP headers in the same rule =&lt;br /&gt;
&lt;br /&gt;
The following example uses an anonymous l4proto [[Sets|set]] and a &#039;&#039;th&#039;&#039; (transport header) expression to match both TCP and UDP packets directed to port 53 (DNS):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input meta l4proto { tcp, udp }  th dport 53  counter packets 0 bytes 0  accept  comment \&amp;quot;accept DNS\&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Before nftables 0.9.2 and Linux kernel 5.3 the &#039;&#039;th&#039;&#039; expression is not available. In this case you can use a [https://www.mankier.com/8/nft#Payload_Expressions-Raw_Payload_Expression raw payload expression] to do the same job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input meta l4proto { tcp, udp }  @th,16,16 53  counter packets 0 bytes 0  accept  comment \&amp;quot;accept DNS\&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Matching_packet_headers&amp;diff=1025</id>
		<title>Matching packet headers</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Matching_packet_headers&amp;diff=1025"/>
		<updated>2021-08-31T11:37:47Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Matching IPv6 headers */ refer to the ICMPv6 case&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;nft&#039;&#039; command line utility supports the following layer 4 protocols: AH, ESP, UDP, UDPlite, TCP, DCCP, SCTP and IPComp.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ethernet headers =&lt;br /&gt;
&lt;br /&gt;
You can match packets on [https://en.wikipedia.org/wiki/Ethernet ethernet] source or destination address or on [https://en.wikipedia.org/wiki/EtherType EtherType]:&lt;br /&gt;
* &#039;&#039;ether&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr&#039;&#039;} &amp;amp;laquo;[[Data_types#Ethernet_types|ether_addr]]&amp;amp;raquo;&lt;br /&gt;
* &#039;&#039;ether type&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo;&lt;br /&gt;
&lt;br /&gt;
If you want to match ethernet traffic whose destination address is ff:ff:ff:ff:ff:ff, you can type the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ether daddr ff:ff:ff:ff:ff:ff counter &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also match packets on [https://en.wikipedia.org/wiki/IEEE_802.1Q IEEE 802.1Q] VLAN fields, if present:&lt;br /&gt;
* &#039;&#039;vlan type&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo; - always &#039;&#039;vlan&#039;&#039; for 802.1Q&lt;br /&gt;
* &#039;&#039;vlan id&#039;&#039; &amp;amp;laquo;12-bit integer&amp;amp;raquo; - match VID, the VLAN ID&lt;br /&gt;
* &#039;&#039;vlan cfi&#039;&#039; &amp;amp;laquo;1-bit integer&amp;amp;raquo; - match DEI, Drop Eligible Indicator (formerly CFI, Canonical Format Indicator) &lt;br /&gt;
* &#039;&#039;vlan pcp&#039;&#039; &amp;amp;laquo;3-bit integer&amp;amp;raquo; - match [https://en.wikipedia.org/wiki/IEEE_P802.1p IEEE P802.1p PCP, Priority Code Point]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do not forget that the [https://en.wikipedia.org/wiki/Link_layer layer 2] header information is only available in the input path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ARP headers =&lt;br /&gt;
&lt;br /&gt;
You can match [https://en.wikipedia.org/wiki/Address_Resolution_Protocol ARP] headers:&lt;br /&gt;
* &#039;&#039;arp htype&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|16-bit integer HTYPE]]&amp;amp;raquo; - match hardware link protocol type (1 for ethernet)&lt;br /&gt;
* &#039;&#039;arp ptype&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo; - match EtherType&lt;br /&gt;
* &#039;&#039;arp hlen&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|8-bit integer HLEN]]&amp;amp;raquo; - match hardware address length in octets (6 for ethernet)&lt;br /&gt;
* &#039;&#039;arp plen&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|8-bit integer PLEN]]&amp;amp;raquo; - match internetwork protocol address length in octets (4 for IPv4)&lt;br /&gt;
* &#039;&#039;arp operation&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|arp_op]]&amp;amp;raquo; - match ARP operation&lt;br /&gt;
* &#039;&#039;arp&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr &#039;&#039;} &#039;&#039;ether&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_addr]]&amp;amp;raquo; - &#039;&#039;saddr&#039;&#039; matches SHA, Sender Hardware Address; &#039;&#039;daddr&#039;&#039; matches THA, Target Hardware Address &lt;br /&gt;
* &#039;&#039;arp&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr &#039;&#039;} &#039;&#039;ip&#039;&#039; &amp;amp;laquo;[[Data_types#IP_types|ipv4_addr]]&amp;amp;raquo; - &#039;&#039;saddr&#039;&#039; matches SPA, Sender Protocol Address; &#039;&#039;daddr&#039;&#039; matches TPA, Target Protocol Address&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching IPv4 headers =&lt;br /&gt;
&lt;br /&gt;
You can also match traffic based on the IPv4 source and destination, the following example shows how to account all traffic that comes from 192.168.1.100 and that is addressed to 192.168.1.1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ip saddr 192.168.1.100 ip daddr 192.168.1.1 counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that, since the rule is attached to the input chain, your local machine needs to use the 192.168.1.1 address, otherwise you won&#039;t see any matching ;-).&lt;br /&gt;
&lt;br /&gt;
To filter on a layer 4 protocol like TCP, you can use the &#039;&#039;protocol&#039;&#039; keyword:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input protocol tcp counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ICMP traffic =&lt;br /&gt;
&lt;br /&gt;
You can drop all [https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol ICMP] echo requests (popularly known as &#039;&#039;pings&#039;&#039;) via:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input icmp type echo-request counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use &#039;&#039;nft describe&#039;&#039; to find &#039;&#039;nft&#039;&#039;&#039;s available &#039;&#039;icmp type&#039;&#039; keywords:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft describe icmp type&lt;br /&gt;
payload expression, datatype icmp_type (ICMP type) (basetype integer), 8 bits&lt;br /&gt;
&lt;br /&gt;
pre-defined symbolic constants (in decimal):&lt;br /&gt;
        echo-reply                                         0&lt;br /&gt;
        destination-unreachable                            3&lt;br /&gt;
        source-quench                                      4&lt;br /&gt;
        redirect                                           5&lt;br /&gt;
        echo-request                                       8&lt;br /&gt;
        router-advertisement                               9&lt;br /&gt;
        router-solicitation                               10&lt;br /&gt;
        time-exceeded                                     11&lt;br /&gt;
        parameter-problem                                 12&lt;br /&gt;
        timestamp-request                                 13&lt;br /&gt;
        timestamp-reply                                   14&lt;br /&gt;
        info-request                                      15&lt;br /&gt;
        info-reply                                        16&lt;br /&gt;
        address-mask-request                              17&lt;br /&gt;
        address-mask-reply                                18&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also be more specific by matching a single icmp code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft describe icmp code&lt;br /&gt;
payload expression, datatype icmp_code (icmp code) (basetype integer), 8 bits&lt;br /&gt;
&lt;br /&gt;
pre-defined symbolic constants (in decimal):&lt;br /&gt;
        net-unreachable                                    0&lt;br /&gt;
        host-unreachable                                   1&lt;br /&gt;
        prot-unreachable                                   2&lt;br /&gt;
        port-unreachable                                   3&lt;br /&gt;
        net-prohibited                                     9&lt;br /&gt;
        host-prohibited                                   10&lt;br /&gt;
        admin-prohibited                                  13&lt;br /&gt;
        frag-needed                                        4&lt;br /&gt;
&lt;br /&gt;
% nft add rule filter output icmp code frag-needed counter accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching IPv6 headers =&lt;br /&gt;
&lt;br /&gt;
If you want to account IPv6 traffic that is addressed to &#039;&#039;abcd::100&#039;&#039;, you can type the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter output ip6 daddr abcd::100 counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not forget to create an &#039;&#039;ip6&#039;&#039; [[Configuring tables|table]] and register the corresponding [[Configuring chains|chains]] to run the examples.&lt;br /&gt;
&lt;br /&gt;
To filter on a layer 4 protocol like TCP, you can match on the &#039;&#039;nexthdr&#039;&#039; field of the IPv6 header:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ip6 nexthdr tcp counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Caution when using ip6 nexthdr, the value only refers to the next header, i.e. ip6 nexthdr tcp will only match if the ipv6 packet does not contain any extension headers. &lt;br /&gt;
&lt;br /&gt;
IPv6 ICMP matching might break because quoting RFC2710:&lt;br /&gt;
&lt;br /&gt;
 MLD message types are a subset of the set of ICMPv6 messages, and MLD messages&lt;br /&gt;
 are identified in IPv6 packets by a preceding Next Header value of 58.&lt;br /&gt;
 All MLD messages described in this document are sent with a link-local IPv6&lt;br /&gt;
 Source Address, an IPv6 Hop Limit of 1, and an IPv6 Router Alert option&lt;br /&gt;
 [RTR-ALERT] in a Hop-by-Hop Options header.&lt;br /&gt;
&lt;br /&gt;
a hop-by-hop extension header comes between the IPv6 header and the ICMPv6 header, hence, the nexthdr field shows 58 in that case.&lt;br /&gt;
&lt;br /&gt;
You could use &#039;&#039;meta l4proto&#039;&#039; to match on the transport protocol (ie. TCP, UDP, ICMPv6,...), this is walking down the headers until the real transport protocol is found.&lt;br /&gt;
&lt;br /&gt;
If you specifically want to match on the ICMPv6 type, then &#039;&#039;nftables&#039;&#039; creates an implicit &#039;&#039;meta l4proto&#039;&#039; dependency that is not shown, therefore, there is not for&lt;br /&gt;
being verbose in your notation, ie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
works fine to accept all ICMPv6 traffic regardless any possible extension headers.&lt;br /&gt;
&lt;br /&gt;
NOTE: the syntax mixing IPv6/IPv4 notation is not supported yet: &#039;::ffff:192.168.1.0&#039;&lt;br /&gt;
&lt;br /&gt;
= Matching transport protocol =&lt;br /&gt;
&lt;br /&gt;
The following rule shows how to match any kind of &#039;&#039;TCP&#039;&#039; traffic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter output ip protocol tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are on the &#039;&#039;inet&#039;&#039; family, then use &#039;&#039;meta l4proto&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule inet filter output meta l4proto tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This allows you to match on the transport protocol regardless the packet is either IPv4 or IPv6.&lt;br /&gt;
&lt;br /&gt;
= Matching TCP/UDP/UDPlite traffic =&lt;br /&gt;
&lt;br /&gt;
The following examples show how to drop all tcp traffic for low TCP ports (1-1024):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input tcp dport 1-1024 counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this rule is using an [[intervals|interval]] (from 1 to 1024).&lt;br /&gt;
&lt;br /&gt;
To match on TCP flags, you need to use a binary operation. For example, to count packets that are not SYN ones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input tcp flags != syn counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More complex filters can be used. For example, to count and log TCP packets with flags SYN and ACK set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft -i&lt;br /&gt;
nft&amp;gt; add rule filter output tcp flags &amp;amp; (syn | ack) == syn | ack counter log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example drops TCP SYN packets which a MSS lower than 500:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule inet filter input tcp flags syn tcp option maxseg size 1-500 drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching UDP/TCP headers in the same rule =&lt;br /&gt;
&lt;br /&gt;
The following example uses an anonymous l4proto [[Sets|set]] and a &#039;&#039;th&#039;&#039; (transport header) expression to match both TCP and UDP packets directed to port 53 (DNS):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input meta l4proto { tcp, udp }  th dport 53  counter packets 0 bytes 0  accept  comment \&amp;quot;accept DNS\&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Before nftables 0.9.2 and Linux kernel 5.3 the &#039;&#039;th&#039;&#039; expression is not available. In this case you can use a [https://www.mankier.com/8/nft#Payload_Expressions-Raw_Payload_Expression raw payload expression] to do the same job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input meta l4proto { tcp, udp }  @th,16,16 53  counter packets 0 bytes 0  accept  comment \&amp;quot;accept DNS\&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Simple_ruleset_for_a_workstation&amp;diff=1017</id>
		<title>Simple ruleset for a workstation</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Simple_ruleset_for_a_workstation&amp;diff=1017"/>
		<updated>2021-08-12T08:33:13Z</updated>

		<summary type="html">&lt;p&gt;Pablo: remove echo request in IPv6 examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A very simple set of rules that allows you to initiate communications from your workstation to the Internet but restricts any communication initiation to your workstation (that was not initiated by you).&lt;br /&gt;
&lt;br /&gt;
You can load this file with nft -f.&lt;br /&gt;
&lt;br /&gt;
= fw.basic =&lt;br /&gt;
&lt;br /&gt;
For IPv4 only workstation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table ip filter {&lt;br /&gt;
     chain input {&lt;br /&gt;
          type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
          # accept traffic originated from us&lt;br /&gt;
          ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
          # accept any localhost traffic&lt;br /&gt;
          iif lo accept&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw6.basic =&lt;br /&gt;
&lt;br /&gt;
For IPv6 only workstation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table ip6 filter {&lt;br /&gt;
        chain input {&lt;br /&gt;
                 type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
                 # accept any localhost traffic&lt;br /&gt;
                 iif lo accept&lt;br /&gt;
&lt;br /&gt;
                 # accept traffic originated from us&lt;br /&gt;
                 ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
                 # accept neighbour discovery otherwise connectivity breaks&lt;br /&gt;
                 icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw.inet.basic =&lt;br /&gt;
&lt;br /&gt;
For dual-stack IPv4/IPv6 workstation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table inet filter {&lt;br /&gt;
        chain input {&lt;br /&gt;
                 type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
                 # accept any localhost traffic&lt;br /&gt;
                 iif lo accept&lt;br /&gt;
&lt;br /&gt;
                 # accept traffic originated from us&lt;br /&gt;
                 ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
                 # accept neighbour discovery otherwise IPv6 connectivity breaks&lt;br /&gt;
                 icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Simple_ruleset_for_a_server&amp;diff=1000</id>
		<title>Simple ruleset for a server</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Simple_ruleset_for_a_server&amp;diff=1000"/>
		<updated>2021-07-27T23:07:42Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* nftables.conf */ add a note on PMTUD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here&#039;s a very basic example of the nftables.conf file you might use on a web server.  In this example, we have the option to block off all incoming traffic from the server except from &amp;quot;safe&amp;quot; IP ranges. This is handy if your server is behind CloudFlare, Sucuri, or other similar traffic filtering services.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Initially, this conf allows all inbound traffic until you comment/uncomment the &amp;quot;From approved IP ranges only&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
= nftables.conf =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/sbin/nft -f&lt;br /&gt;
&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
# List all IPs and IP ranges of your traffic filtering proxy source.&lt;br /&gt;
define SAFE_TRAFFIC_IPS = {&lt;br /&gt;
    x.x.x.x/xx,&lt;br /&gt;
    x.x.x.x/xx,&lt;br /&gt;
    x.x.x.x,&lt;br /&gt;
    x.x.x.x&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table inet firewall {&lt;br /&gt;
&lt;br /&gt;
    chain inbound {&lt;br /&gt;
&lt;br /&gt;
    	# By default, drop all traffic unless it meets a filter&lt;br /&gt;
    	# criteria specified by the rules that follow below.&lt;br /&gt;
        type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets.&lt;br /&gt;
        ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
        # Drop invalid packets.&lt;br /&gt;
        ct state invalid drop&lt;br /&gt;
&lt;br /&gt;
        # Allow loopback traffic.&lt;br /&gt;
        iifname lo accept&lt;br /&gt;
&lt;br /&gt;
        # Allow all ICMP and IGMP traffic, but enforce a rate limit&lt;br /&gt;
        # to help prevent some types of flood attacks.&lt;br /&gt;
        # Allowing ICMP is mandatory for Path MTU Discovery&lt;br /&gt;
        ip protocol icmp limit rate 4/second accept&lt;br /&gt;
        # Allowing ICMPv6 is mandatory for IPv6 to work&lt;br /&gt;
        ip6 nexthdr ipv6-icmp limit rate 4/second accept&lt;br /&gt;
        ip protocol igmp limit rate 4/second accept&lt;br /&gt;
&lt;br /&gt;
        # Allow SSH on port 22.&lt;br /&gt;
        tcp dport 22 accept&lt;br /&gt;
&lt;br /&gt;
        # Allow HTTP(S).&lt;br /&gt;
        # -- From anywhere&lt;br /&gt;
        tcp dport { http, https } accept&lt;br /&gt;
        udp dport { http, https } accept&lt;br /&gt;
        # -- From approved IP ranges only&lt;br /&gt;
        # tcp dport { http, https } ip saddr $SAFE_TRAFFIC_IPS accept&lt;br /&gt;
        # udp dport { http, https } ip saddr $SAFE_TRAFFIC_IPS accept&lt;br /&gt;
&lt;br /&gt;
        # Uncomment to allow incoming traffic on other ports.&lt;br /&gt;
        # -- Allow Jekyll dev traffic on port 4000.&lt;br /&gt;
        # tcp dport 4000 accept&lt;br /&gt;
        # -- Allow Hugo dev traffic on port 1313.&lt;br /&gt;
        # tcp dport 1313 accept&lt;br /&gt;
&lt;br /&gt;
        # Uncomment to enable logging of denied inbound traffic&lt;br /&gt;
        # log prefix &amp;quot;[nftables] Inbound Denied: &amp;quot; flags all counter drop&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain forward {&lt;br /&gt;
&lt;br /&gt;
        # Drop everything (assumes this device is not a router)&lt;br /&gt;
        type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # Uncomment to enable logging of denied forwards&lt;br /&gt;
        # log prefix &amp;quot;[nftables] Forward Denied: &amp;quot; flags all counter drop&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain outbound {&lt;br /&gt;
&lt;br /&gt;
        # Allow all outbound traffic&lt;br /&gt;
        type filter hook output priority 0; policy accept;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Simple_ruleset_for_a_server&amp;diff=999</id>
		<title>Simple ruleset for a server</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Simple_ruleset_for_a_server&amp;diff=999"/>
		<updated>2021-07-27T22:56:57Z</updated>

		<summary type="html">&lt;p&gt;Pablo: add comment regarding ICMPv6 (per Thomas Landauer)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here&#039;s a very basic example of the nftables.conf file you might use on a web server.  In this example, we have the option to block off all incoming traffic from the server except from &amp;quot;safe&amp;quot; IP ranges. This is handy if your server is behind CloudFlare, Sucuri, or other similar traffic filtering services.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Initially, this conf allows all inbound traffic until you comment/uncomment the &amp;quot;From approved IP ranges only&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
= nftables.conf =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/sbin/nft -f&lt;br /&gt;
&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
# List all IPs and IP ranges of your traffic filtering proxy source.&lt;br /&gt;
define SAFE_TRAFFIC_IPS = {&lt;br /&gt;
    x.x.x.x/xx,&lt;br /&gt;
    x.x.x.x/xx,&lt;br /&gt;
    x.x.x.x,&lt;br /&gt;
    x.x.x.x&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table inet firewall {&lt;br /&gt;
&lt;br /&gt;
    chain inbound {&lt;br /&gt;
&lt;br /&gt;
    	# By default, drop all traffic unless it meets a filter&lt;br /&gt;
    	# criteria specified by the rules that follow below.&lt;br /&gt;
        type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets.&lt;br /&gt;
        ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
        # Drop invalid packets.&lt;br /&gt;
        ct state invalid drop&lt;br /&gt;
&lt;br /&gt;
        # Allow loopback traffic.&lt;br /&gt;
        iifname lo accept&lt;br /&gt;
&lt;br /&gt;
        # Allow all ICMP and IGMP traffic, but enforce a rate limit&lt;br /&gt;
        # to help prevent some types of flood attacks.&lt;br /&gt;
        ip protocol icmp limit rate 4/second accept&lt;br /&gt;
        # Allowing ICMPv6 is mandatory for IPv6 to work&lt;br /&gt;
        ip6 nexthdr ipv6-icmp limit rate 4/second accept&lt;br /&gt;
        ip protocol igmp limit rate 4/second accept&lt;br /&gt;
&lt;br /&gt;
        # Allow SSH on port 22.&lt;br /&gt;
        tcp dport 22 accept&lt;br /&gt;
&lt;br /&gt;
        # Allow HTTP(S).&lt;br /&gt;
        # -- From anywhere&lt;br /&gt;
        tcp dport { http, https } accept&lt;br /&gt;
        udp dport { http, https } accept&lt;br /&gt;
        # -- From approved IP ranges only&lt;br /&gt;
        # tcp dport { http, https } ip saddr $SAFE_TRAFFIC_IPS accept&lt;br /&gt;
        # udp dport { http, https } ip saddr $SAFE_TRAFFIC_IPS accept&lt;br /&gt;
&lt;br /&gt;
        # Uncomment to allow incoming traffic on other ports.&lt;br /&gt;
        # -- Allow Jekyll dev traffic on port 4000.&lt;br /&gt;
        # tcp dport 4000 accept&lt;br /&gt;
        # -- Allow Hugo dev traffic on port 1313.&lt;br /&gt;
        # tcp dport 1313 accept&lt;br /&gt;
&lt;br /&gt;
        # Uncomment to enable logging of denied inbound traffic&lt;br /&gt;
        # log prefix &amp;quot;[nftables] Inbound Denied: &amp;quot; flags all counter drop&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain forward {&lt;br /&gt;
&lt;br /&gt;
        # Drop everything (assumes this device is not a router)&lt;br /&gt;
        type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # Uncomment to enable logging of denied forwards&lt;br /&gt;
        # log prefix &amp;quot;[nftables] Forward Denied: &amp;quot; flags all counter drop&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain outbound {&lt;br /&gt;
&lt;br /&gt;
        # Allow all outbound traffic&lt;br /&gt;
        type filter hook output priority 0; policy accept;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Nftables_families&amp;diff=998</id>
		<title>Nftables families</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Nftables_families&amp;diff=998"/>
		<updated>2021-07-23T16:19:05Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* inet */ refer to meta l4proto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://netfilter.org/ Netfilter] enables filtering at multiple [https://en.wikipedia.org/wiki/Internet_protocol_suite networking levels]. With iptables there is a separate tool for each level: &#039;&#039;iptables&#039;&#039;, &#039;&#039;ip6tables&#039;&#039;, &#039;&#039;arptables&#039;&#039;, &#039;&#039;ebtables&#039;&#039;. With nftables the multiple networking levels are abstracted into &#039;&#039;&#039;families&#039;&#039;&#039;, all of which are served by the single tool &#039;&#039;nft&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Please note that what traffic/packets you see and at which point in the network stack depends on the [[Netfilter_hooks|&#039;&#039;&#039;hook&#039;&#039;&#039;]] you are using.&lt;br /&gt;
&lt;br /&gt;
Following are descriptions of current nftables families. Additional families may be added in the future.&lt;br /&gt;
&lt;br /&gt;
== ip ==&lt;br /&gt;
&lt;br /&gt;
Tables of this family see [https://en.wikipedia.org/wiki/IPv4 IPv4] traffic/packets.&lt;br /&gt;
The &#039;&#039;iptables&#039;&#039; tool is the legacy x_tables equivalent.&lt;br /&gt;
&lt;br /&gt;
== ip6 ==&lt;br /&gt;
&lt;br /&gt;
Tables of this family see [https://en.wikipedia.org/wiki/IPv6 IPv6] traffic/packets.&lt;br /&gt;
The &#039;&#039;ip6tables&#039;&#039; tool is the legacy x_tables equivalent.&lt;br /&gt;
&lt;br /&gt;
== inet ==&lt;br /&gt;
&lt;br /&gt;
Tables of this family see both IPv4 and IPv6 traffic/packets, simplifying dual stack support.&lt;br /&gt;
&lt;br /&gt;
Within a table of &#039;&#039;inet&#039;&#039; family, both IPv4 and IPv6 packets traverse the same rules. Rules for IPv4 packets don&#039;t affect IPv6 packets and vice-versa. Rules for both layer 3 protocols affect both. Use [[Matching_packet_headers#Matching_transport_protocol|meta l4proto]] to match on the layer 4 protocol regardless the packet is either IPv4 or IPv6.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
# This rule affects only IPv4 packets:&lt;br /&gt;
add rule inet filter input ip saddr 1.1.1.1 counter accept&lt;br /&gt;
&lt;br /&gt;
# This rule affects only IPv6 packets:&lt;br /&gt;
add rule inet filter input ip6 daddr fe00::2 counter accept&lt;br /&gt;
&lt;br /&gt;
# These rules affect both IPv4 and IPv6 packets:&lt;br /&gt;
add rule inet filter input ct state established,related counter accept&lt;br /&gt;
add rule inet filter input udp dport 53 accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
New in nftables 0.9.7 and Linux kernel 4.10 is the inet family [[Netfilter_hooks|&#039;&#039;ingress&#039;&#039;]] hook, which filters at the same location as the netdev &#039;&#039;ingress&#039;&#039; hook.&lt;br /&gt;
&lt;br /&gt;
== arp ==&lt;br /&gt;
&lt;br /&gt;
Tables of this family see [https://en.wikipedia.org/wiki/Address_Resolution_Protocol ARP]-level (i.e, L2) traffic, before any L3 handling is done by the kernel. The &#039;&#039;arptables&#039;&#039; tool is the legacy x_tables equivalent.&lt;br /&gt;
&lt;br /&gt;
== bridge ==&lt;br /&gt;
&lt;br /&gt;
Tables of this family see traffic/packets traversing [https://wiki.linuxfoundation.org/networking/bridge bridges] (i.e. switching). No assumptions are made about L3 protocols.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;ebtables&#039;&#039; tool is the legacy x_tables equivalent. Some old x_tables modules such as &#039;&#039;physdev&#039;&#039; will also eventually be served from the nftables &#039;&#039;bridge&#039;&#039; family.&lt;br /&gt;
&lt;br /&gt;
Note that there is no nf_conntrack integration for the nftables &#039;&#039;bridge&#039;&#039; family.&lt;br /&gt;
&lt;br /&gt;
== netdev ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;netdev&#039;&#039; family is different from the others in that it is used to create base chains attached to a &#039;&#039;&#039;single network interface&#039;&#039;&#039;. Such base chains see &#039;&#039;&#039;all&#039;&#039;&#039; network traffic on the specified interface, with no assumptions about L2 or L3 protocols. Therefore you can filter ARP traffic from here. There is no legacy x_tables equivalent to the &#039;&#039;netdev&#039;&#039; family.&lt;br /&gt;
&lt;br /&gt;
The principal (only?) use for this family is for base chains using the [[Netfilter_hooks|&#039;&#039;ingress&#039;&#039; hook]], new in Linux kernel 4.2. Such &#039;&#039;ingress&#039;&#039; chains see network packets just after the NIC driver passes them up to the networking stack. This very early location in the packet path is ideal for dropping packets associated with [https://en.wikipedia.org/wiki/Denial-of-service_attack#Distributed_attack DDoS] attacks. Dropping packets from an &#039;&#039;ingress&#039;&#039; chain is twice as efficient as doing so from a &#039;&#039;prerouting&#039;&#039; chain.  (Do note that in an &#039;&#039;ingress&#039;&#039; chain, fragmented datagrams have not yet been reassembled. So, for example, matching ip saddr and daddr works for all ip packets, but matching L4 headers like udp dport works only for unfragmented packets, or the first fragment.)&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;ingress&#039;&#039; hook provides an alternative to &#039;&#039;tc&#039;&#039; ingress filtering. You still need &#039;&#039;tc&#039;&#039; for traffic shaping/queue management. &lt;br /&gt;
&lt;br /&gt;
You can also use the &#039;&#039;ingress&#039;&#039; hook for [[load balancing]], including Direct Server Return (DSR), [https://netdevconf.org/1.2/slides/oct6/08_nftables_Load_Balancing_with_nftables_II_Slides.pdf that has been reported to be 10x faster].&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Matching_packet_headers&amp;diff=997</id>
		<title>Matching packet headers</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Matching_packet_headers&amp;diff=997"/>
		<updated>2021-07-23T16:13:56Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Matching transport protocol */ document inet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;nft&#039;&#039; command line utility supports the following layer 4 protocols: AH, ESP, UDP, UDPlite, TCP, DCCP, SCTP and IPComp.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ethernet headers =&lt;br /&gt;
&lt;br /&gt;
You can match packets on [https://en.wikipedia.org/wiki/Ethernet ethernet] source or destination address or on [https://en.wikipedia.org/wiki/EtherType EtherType]:&lt;br /&gt;
* &#039;&#039;ether&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr&#039;&#039;} &amp;amp;laquo;[[Data_types#Ethernet_types|ether_addr]]&amp;amp;raquo;&lt;br /&gt;
* &#039;&#039;ether type&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo;&lt;br /&gt;
&lt;br /&gt;
If you want to match ethernet traffic whose destination address is ff:ff:ff:ff:ff:ff, you can type the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ether daddr ff:ff:ff:ff:ff:ff counter &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also match packets on [https://en.wikipedia.org/wiki/IEEE_802.1Q IEEE 802.1Q] VLAN fields, if present:&lt;br /&gt;
* &#039;&#039;vlan type&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo; - always &#039;&#039;vlan&#039;&#039; for 802.1Q&lt;br /&gt;
* &#039;&#039;vlan id&#039;&#039; &amp;amp;laquo;12-bit integer&amp;amp;raquo; - match VID, the VLAN ID&lt;br /&gt;
* &#039;&#039;vlan cfi&#039;&#039; &amp;amp;laquo;1-bit integer&amp;amp;raquo; - match DEI, Drop Eligible Indicator (formerly CFI, Canonical Format Indicator) &lt;br /&gt;
* &#039;&#039;vlan pcp&#039;&#039; &amp;amp;laquo;3-bit integer&amp;amp;raquo; - match [https://en.wikipedia.org/wiki/IEEE_P802.1p IEEE P802.1p PCP, Priority Code Point]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do not forget that the [https://en.wikipedia.org/wiki/Link_layer layer 2] header information is only available in the input path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ARP headers =&lt;br /&gt;
&lt;br /&gt;
You can match [https://en.wikipedia.org/wiki/Address_Resolution_Protocol ARP] headers:&lt;br /&gt;
* &#039;&#039;arp htype&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|16-bit integer HTYPE]]&amp;amp;raquo; - match hardware link protocol type (1 for ethernet)&lt;br /&gt;
* &#039;&#039;arp ptype&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_type]]&amp;amp;raquo; - match EtherType&lt;br /&gt;
* &#039;&#039;arp hlen&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|8-bit integer HLEN]]&amp;amp;raquo; - match hardware address length in octets (6 for ethernet)&lt;br /&gt;
* &#039;&#039;arp plen&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|8-bit integer PLEN]]&amp;amp;raquo; - match internetwork protocol address length in octets (4 for IPv4)&lt;br /&gt;
* &#039;&#039;arp operation&#039;&#039; &amp;amp;laquo;[[Data_types#ARP_types|arp_op]]&amp;amp;raquo; - match ARP operation&lt;br /&gt;
* &#039;&#039;arp&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr &#039;&#039;} &#039;&#039;ether&#039;&#039; &amp;amp;laquo;[[Data_types#Ethernet_types|ether_addr]]&amp;amp;raquo; - &#039;&#039;saddr&#039;&#039; matches SHA, Sender Hardware Address; &#039;&#039;daddr&#039;&#039; matches THA, Target Hardware Address &lt;br /&gt;
* &#039;&#039;arp&#039;&#039; {&#039;&#039;saddr&#039;&#039; | &#039;&#039;daddr &#039;&#039;} &#039;&#039;ip&#039;&#039; &amp;amp;laquo;[[Data_types#IP_types|ipv4_addr]]&amp;amp;raquo; - &#039;&#039;saddr&#039;&#039; matches SPA, Sender Protocol Address; &#039;&#039;daddr&#039;&#039; matches TPA, Target Protocol Address&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching IPv4 headers =&lt;br /&gt;
&lt;br /&gt;
You can also match traffic based on the IPv4 source and destination, the following example shows how to account all traffic that comes from 192.168.1.100 and that is addressed to 192.168.1.1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ip saddr 192.168.1.100 ip daddr 192.168.1.1 counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that, since the rule is attached to the input chain, your local machine needs to use the 192.168.1.1 address, otherwise you won&#039;t see any matching ;-).&lt;br /&gt;
&lt;br /&gt;
To filter on a layer 4 protocol like TCP, you can use the &#039;&#039;protocol&#039;&#039; keyword:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input protocol tcp counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching ICMP traffic =&lt;br /&gt;
&lt;br /&gt;
You can drop all [https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol ICMP] echo requests (popularly known as &#039;&#039;pings&#039;&#039;) via:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input icmp type echo-request counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use &#039;&#039;nft describe&#039;&#039; to find &#039;&#039;nft&#039;&#039;&#039;s available &#039;&#039;icmp type&#039;&#039; keywords:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft describe icmp type&lt;br /&gt;
payload expression, datatype icmp_type (ICMP type) (basetype integer), 8 bits&lt;br /&gt;
&lt;br /&gt;
pre-defined symbolic constants (in decimal):&lt;br /&gt;
        echo-reply                                         0&lt;br /&gt;
        destination-unreachable                            3&lt;br /&gt;
        source-quench                                      4&lt;br /&gt;
        redirect                                           5&lt;br /&gt;
        echo-request                                       8&lt;br /&gt;
        router-advertisement                               9&lt;br /&gt;
        router-solicitation                               10&lt;br /&gt;
        time-exceeded                                     11&lt;br /&gt;
        parameter-problem                                 12&lt;br /&gt;
        timestamp-request                                 13&lt;br /&gt;
        timestamp-reply                                   14&lt;br /&gt;
        info-request                                      15&lt;br /&gt;
        info-reply                                        16&lt;br /&gt;
        address-mask-request                              17&lt;br /&gt;
        address-mask-reply                                18&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also be more specific by matching a single icmp code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft describe icmp code&lt;br /&gt;
payload expression, datatype icmp_code (icmp code) (basetype integer), 8 bits&lt;br /&gt;
&lt;br /&gt;
pre-defined symbolic constants (in decimal):&lt;br /&gt;
        net-unreachable                                    0&lt;br /&gt;
        host-unreachable                                   1&lt;br /&gt;
        prot-unreachable                                   2&lt;br /&gt;
        port-unreachable                                   3&lt;br /&gt;
        net-prohibited                                     9&lt;br /&gt;
        host-prohibited                                   10&lt;br /&gt;
        admin-prohibited                                  13&lt;br /&gt;
        frag-needed                                        4&lt;br /&gt;
&lt;br /&gt;
% nft add rule filter output icmp code frag-needed counter accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching IPv6 headers =&lt;br /&gt;
&lt;br /&gt;
If you want to account IPv6 traffic that is addressed to &#039;&#039;abcd::100&#039;&#039;, you can type the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter output ip6 daddr abcd::100 counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To filter on a layer 4 protocol like TCP, you can use the &#039;&#039;nexthdr&#039;&#039; keyword:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input ip6 nexthdr tcp counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not forget to create an &#039;&#039;ip6&#039;&#039; [[Configuring tables|table]] and register the corresponding [[Configuring chains|chains]] to run the examples.&lt;br /&gt;
&lt;br /&gt;
NOTE: the syntax mixing IPv6/IPv4 notation is not supported yet: &#039;::ffff:192.168.1.0&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching transport protocol =&lt;br /&gt;
&lt;br /&gt;
The following rule shows how to match any kind of &#039;&#039;TCP&#039;&#039; traffic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter output ip protocol tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are on the &#039;&#039;inet&#039;&#039; family, then use &#039;&#039;meta l4proto&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule inet filter output meta l4proto tcp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This allows you to match on the transport protocol regardless the packet is either IPv4 or IPv6.&lt;br /&gt;
&lt;br /&gt;
= Matching TCP/UDP/UDPlite traffic =&lt;br /&gt;
&lt;br /&gt;
The following examples show how to drop all tcp traffic for low TCP ports (1-1024):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input tcp dport 1-1024 counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this rule is using an [[intervals|interval]] (from 1 to 1024).&lt;br /&gt;
&lt;br /&gt;
To match on TCP flags, you need to use a binary operation. For example, to count packets that are not SYN ones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input tcp flags != syn counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More complex filters can be used. For example, to count and log TCP packets with flags SYN and ACK set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft -i&lt;br /&gt;
nft&amp;gt; add rule filter output tcp flags &amp;amp; (syn | ack) == syn | ack counter log&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example drops TCP SYN packets which a MSS lower than 500:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule inet filter input tcp flags syn tcp option maxseg size 1-500 drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Matching UDP/TCP headers in the same rule =&lt;br /&gt;
&lt;br /&gt;
The following example uses an anonymous l4proto [[Sets|set]] and a &#039;&#039;th&#039;&#039; (transport header) expression to match both TCP and UDP packets directed to port 53 (DNS):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input meta l4proto { tcp, udp }  th dport 53  counter packets 0 bytes 0  accept  comment \&amp;quot;accept DNS\&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Before nftables 0.9.2 and Linux kernel 5.3 the &#039;&#039;th&#039;&#039; expression is not available. In this case you can use a raw payload expression to do the same job:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule filter input meta l4proto { tcp, udp }  @th,16,16 53  counter packets 0 bytes 0  accept  comment \&amp;quot;accept DNS\&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=996</id>
		<title>Quick reference-nftables in 10 minutes</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=996"/>
		<updated>2021-07-23T15:00:25Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Ct */ add ct count&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Find below some basic concepts to know before using nftables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;table&#039;&#039;&#039; refers to a container of [[Configuring chains|chains]] with no specific semantics.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;chain&#039;&#039;&#039; within a [[Configuring tables|table]] refers to a container of [[Simple rule management|rules]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rule&#039;&#039;&#039; refers to an action to be configured within a &#039;&#039;chain&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= nft command line =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;nft&#039;&#039; is the command line tool in order to interact with nftables at userspace.&lt;br /&gt;
&lt;br /&gt;
== Tables ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;family&#039;&#039;&#039; refers to a one of the following table types: &#039;&#039;ip&#039;&#039;, &#039;&#039;arp&#039;&#039;, &#039;&#039;ip6&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;inet&#039;&#039;, &#039;&#039;netdev&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list tables [&amp;lt;family&amp;gt;]&lt;br /&gt;
% nft list table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt; [-n] [-a]&lt;br /&gt;
% nft (add | delete | flush) table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The argument &#039;&#039;-n&#039;&#039; shows the addresses and other information that uses names in numeric format. The &#039;&#039;-a&#039;&#039; argument is used to display the &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Chains ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;type&#039;&#039;&#039; refers to the kind of chain to be created. Possible types are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;filter&#039;&#039;: Supported by &#039;&#039;arp&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; table families.&lt;br /&gt;
* &#039;&#039;route&#039;&#039;: Mark packets (like mangle for the &#039;&#039;output&#039;&#039; hook, for other hooks use the type &#039;&#039;filter&#039;&#039; instead), supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
* &#039;&#039;nat&#039;&#039;: In order to perform Network Address Translation, supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hook&#039;&#039;&#039; refers to an specific stage of the packet while it&#039;s being processed through the kernel. More info in [[Netfilter_hooks|Netfilter hooks]].&lt;br /&gt;
&lt;br /&gt;
* The hooks for &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; families are: &#039;&#039;prerouting&#039;&#039;, &#039;&#039;input&#039;&#039;, &#039;&#039;forward&#039;&#039;, &#039;&#039;output&#039;&#039;, &#039;&#039;postrouting&#039;&#039;.&lt;br /&gt;
* The hooks for &#039;&#039;arp&#039;&#039; family are: &#039;&#039; input&#039;&#039;, &#039;&#039;output&#039;&#039;.&lt;br /&gt;
* The &#039;&#039;bridge&#039;&#039; family handles ethernet packets traversing bridge devices.&lt;br /&gt;
* The hook for &#039;&#039;netdev&#039;&#039; is: &#039;&#039;ingress&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;priority&#039;&#039;&#039; refers to a number used to order the chains or to set them between some Netfilter operations. Possible values are: &#039;&#039;NF_IP_PRI_CONNTRACK_DEFRAG (-400)&#039;&#039;, &#039;&#039;NF_IP_PRI_RAW (-300)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_FIRST (-225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK (-200)&#039;&#039;, &#039;&#039;NF_IP_PRI_MANGLE (-150)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_DST (-100)&#039;&#039;, &#039;&#039;NF_IP_PRI_FILTER (0)&#039;&#039;, &#039;&#039;NF_IP_PRI_SECURITY (50)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_SRC (100)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_LAST (225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK_HELPER (300)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;policy&#039;&#039;&#039; is the default verdict statement to control the flow in the chain. Possible values are: &#039;&#039;accept&#039;&#039;, &#039;&#039;drop&#039;&#039;, &#039;&#039;queue&#039;&#039;, &#039;&#039;continue&#039;&#039;, &#039;&#039;return&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ { type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy &amp;lt;policy&amp;gt; \;] } ]&lt;br /&gt;
% nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
% nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;handle&#039;&#039;&#039; is an internal number that identifies a certain &#039;&#039;rule&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;position&#039;&#039;&#039; is an internal number that is used to insert a &#039;&#039;rule&#039;&#039; before a certain &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft insert rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [position &amp;lt;position&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft replace rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft delete rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matches ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;matches&#039;&#039;&#039; are clues used to access to certain packet information and create filters according to them.&lt;br /&gt;
&lt;br /&gt;
==== Ip ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip match&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip dscp cs1&lt;br /&gt;
ip dscp != cs1&lt;br /&gt;
ip dscp 0x38&lt;br /&gt;
ip dscp != 0x20&lt;br /&gt;
ip dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, &lt;br /&gt;
af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip length 232&lt;br /&gt;
ip length != 233&lt;br /&gt;
ip length 333-435&lt;br /&gt;
ip length != 333-453&lt;br /&gt;
ip length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;id&amp;gt;&#039;&#039;&lt;br /&gt;
| IP ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip id 22&lt;br /&gt;
ip id != 233&lt;br /&gt;
ip id 33-45&lt;br /&gt;
ip id != 33-45&lt;br /&gt;
ip id { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Fragmentation offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip frag-off 222&lt;br /&gt;
ip frag-off != 233&lt;br /&gt;
ip frag-off 33-45&lt;br /&gt;
ip frag-off != 33-45&lt;br /&gt;
ip frag-off { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ttl &amp;lt;ttl&amp;gt;&#039;&#039;&lt;br /&gt;
| Time to live&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip ttl 0&lt;br /&gt;
ip ttl 233&lt;br /&gt;
ip ttl 33-55&lt;br /&gt;
ip ttl != 45-50&lt;br /&gt;
ip ttl { 43, 53, 45 }&lt;br /&gt;
ip ttl { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Upper layer protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip protocol tcp&lt;br /&gt;
ip protocol 6&lt;br /&gt;
ip protocol != tcp&lt;br /&gt;
ip protocol { icmp, esp, ah, comp, udp, udplite, tcp, dccp, sctp }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip checksum 13172&lt;br /&gt;
ip checksum 22&lt;br /&gt;
ip checksum != 233&lt;br /&gt;
ip checksum 33-45&lt;br /&gt;
ip checksum != 33-45&lt;br /&gt;
ip checksum { 33, 55, 67, 88 }&lt;br /&gt;
ip checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip saddr 192.168.2.0/24&lt;br /&gt;
ip saddr != 192.168.2.0/24&lt;br /&gt;
ip saddr 192.168.3.1 ip daddr 192.168.3.100&lt;br /&gt;
ip saddr != 1.1.1.1&lt;br /&gt;
ip saddr 1.1.1.1&lt;br /&gt;
ip saddr &amp;amp; 0xff == 1&lt;br /&gt;
ip saddr &amp;amp; 0.0.0.255 &amp;lt; 0.0.0.127&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip daddr 192.168.0.1&lt;br /&gt;
ip daddr != 192.168.0.1&lt;br /&gt;
ip daddr 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr 10.0.0.0-10.255.255.255&lt;br /&gt;
ip daddr 172.16.0.0-172.31.255.255&lt;br /&gt;
ip daddr 192.168.3.1-192.168.4.250&lt;br /&gt;
ip daddr != 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr { 192.168.0.1-192.168.0.250 }&lt;br /&gt;
ip daddr { 192.168.5.1, 192.168.5.2, 192.168.5.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| Ip Header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip version 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;header length&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip hdrlength 0&lt;br /&gt;
ip hdrlength 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ip6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 dscp cs1&lt;br /&gt;
ip6 dscp != cs1&lt;br /&gt;
ip6 dscp 0x38&lt;br /&gt;
ip6 dscp != 0x20&lt;br /&gt;
ip6 dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flowlabel &amp;lt;label&amp;gt;&#039;&#039;&lt;br /&gt;
| Flow label&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 flowlabel 22&lt;br /&gt;
ip6 flowlabel != 233&lt;br /&gt;
ip6 flowlabel { 33, 55, 67, 88 }&lt;br /&gt;
ip6 flowlabel { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 length 232&lt;br /&gt;
ip6 length != 233&lt;br /&gt;
ip6 length 333-435&lt;br /&gt;
ip6 length != 333-453&lt;br /&gt;
ip6 length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;header&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header type (Upper layer protocol number)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 nexthdr {esp, udp, ah, comp, udplite, tcp, dccp, sctp, icmpv6}&lt;br /&gt;
ip6 nexthdr esp&lt;br /&gt;
ip6 nexthdr != esp&lt;br /&gt;
ip6 nexthdr { 33-44 }&lt;br /&gt;
ip6 nexthdr 33-44&lt;br /&gt;
ip6 nexthdr != 33-44&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hoplimit &amp;lt;hoplimit&amp;gt;&#039;&#039;&lt;br /&gt;
| Hop limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 hoplimit 1&lt;br /&gt;
ip6 hoplimit != 233&lt;br /&gt;
ip6 hoplimit 33-45&lt;br /&gt;
ip6 hoplimit != 33-45&lt;br /&gt;
ip6 hoplimit {33, 55, 67, 88}&lt;br /&gt;
ip6 hoplimit {33-55}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 saddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::/64&lt;br /&gt;
ip6 saddr ::1 ip6 daddr ::2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 daddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 daddr != ::1234:1234:1234:1234:1234:1234:1234-1234:1234::1234:1234:1234:1234:1234&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 version 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Tcp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|tcp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp dport 22&lt;br /&gt;
tcp dport != 33-45&lt;br /&gt;
tcp dport { 33-55 }&lt;br /&gt;
tcp dport {telnet, http, https }&lt;br /&gt;
tcp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
tcp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sport 22&lt;br /&gt;
tcp sport != 33-45&lt;br /&gt;
tcp sport { 33, 55, 67, 88}&lt;br /&gt;
tcp sport { 33-55}&lt;br /&gt;
tcp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
tcp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sequence 22&lt;br /&gt;
tcp sequence != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ackseq &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Acknowledgement number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp ackseq 22&lt;br /&gt;
tcp ackseq != 33-45&lt;br /&gt;
tcp ackseq { 33, 55, 67, 88 }&lt;br /&gt;
tcp ackseq { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| TCP flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp flags { fin, syn, rst, psh, ack, urg, ecn, cwr}&lt;br /&gt;
tcp flags cwr&lt;br /&gt;
tcp flags != cwr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;window &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Window&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp window 22&lt;br /&gt;
tcp window != 33-45&lt;br /&gt;
tcp window { 33, 55, 67, 88 }&lt;br /&gt;
tcp window { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp checksum 22&lt;br /&gt;
tcp checksum != 33-45&lt;br /&gt;
tcp checksum { 33, 55, 67, 88 }&lt;br /&gt;
tcp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;urgptr &amp;lt;pointer&amp;gt;&#039;&#039;&lt;br /&gt;
| Urgent pointer&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp urgptr 22&lt;br /&gt;
tcp urgptr != 33-45&lt;br /&gt;
tcp urgptr { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;doff &amp;lt;offset&amp;gt;&#039;&#039;&lt;br /&gt;
| Data offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp doff 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp dport 22&lt;br /&gt;
udp dport != 33-45&lt;br /&gt;
udp dport { 33-55 }&lt;br /&gt;
udp dport {telnet, http, https }&lt;br /&gt;
udp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp sport 22&lt;br /&gt;
udp sport != 33-45&lt;br /&gt;
udp sport { 33, 55, 67, 88}&lt;br /&gt;
udp sport { 33-55}&lt;br /&gt;
udp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp length 6666&lt;br /&gt;
udp length != 50-65&lt;br /&gt;
udp length { 50, 65 }&lt;br /&gt;
udp length { 35-50 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| UDP checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp checksum 22&lt;br /&gt;
udp checksum != 33-45&lt;br /&gt;
udp checksum { 33, 55, 67, 88 }&lt;br /&gt;
udp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udplite ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udplite match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite dport 22&lt;br /&gt;
udplite dport != 33-45&lt;br /&gt;
udplite dport { 33-55 }&lt;br /&gt;
udplite dport {telnet, http, https }&lt;br /&gt;
udplite dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udplite dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite sport 22&lt;br /&gt;
udplite sport != 33-45&lt;br /&gt;
udplite sport { 33, 55, 67, 88}&lt;br /&gt;
udplite sport { 33-55}&lt;br /&gt;
udplite sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udplite sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite checksum 22&lt;br /&gt;
udplite checksum != 33-45&lt;br /&gt;
udplite checksum { 33, 55, 67, 88 }&lt;br /&gt;
udplite checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sctp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|sctp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp dport 22&lt;br /&gt;
sctp dport != 33-45&lt;br /&gt;
sctp dport { 33-55 }&lt;br /&gt;
sctp dport {telnet, http, https }&lt;br /&gt;
sctp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
sctp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp sport 22&lt;br /&gt;
sctp sport != 33-45&lt;br /&gt;
sctp sport { 33, 55, 67, 88}&lt;br /&gt;
sctp sport { 33-55}&lt;br /&gt;
sctp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
sctp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp checksum 22&lt;br /&gt;
sctp checksum != 33-45&lt;br /&gt;
sctp checksum { 33, 55, 67, 88 }&lt;br /&gt;
sctp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;vtag &amp;lt;tag&amp;gt;&#039;&#039;&lt;br /&gt;
| Verification tag&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp vtag 22&lt;br /&gt;
sctp vtag != 33-45&lt;br /&gt;
sctp vtag { 33, 55, 67, 88 }&lt;br /&gt;
sctp vtag { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;chunk &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Existence of a chunk with given type in packet&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp chunk init exists&lt;br /&gt;
sctp chunk error missing&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;chunk &amp;lt;type&amp;gt; &amp;lt;field&amp;gt;&#039;&#039;&lt;br /&gt;
| A chunk&#039;s field value (implies chunk existence)&lt;br /&gt;
|&amp;lt;sourcex lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp chunk init flags 0x1&lt;br /&gt;
sctp chunk data tsn 0x23&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Dccp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dccp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp dport 22&lt;br /&gt;
dccp dport != 33-45&lt;br /&gt;
dccp dport { 33-55 }&lt;br /&gt;
dccp dport {telnet, http, https }&lt;br /&gt;
dccp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
dccp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp sport 22&lt;br /&gt;
dccp sport != 33-45&lt;br /&gt;
dccp sport { 33, 55, 67, 88}&lt;br /&gt;
dccp sport { 33-55}&lt;br /&gt;
dccp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
dccp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Type of packet&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp type {request, response, data, ack, dataack, closereq, close, reset, sync, syncack}&lt;br /&gt;
dccp type request&lt;br /&gt;
dccp type != request&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ah ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ah match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| AH header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah hdrlength 11-23&lt;br /&gt;
ah hdrlength != 11-23&lt;br /&gt;
ah hdrlength {11, 23, 44 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah reserved 22&lt;br /&gt;
ah reserved != 33-45&lt;br /&gt;
ah reserved {23, 100 }&lt;br /&gt;
ah reserved { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah spi 111&lt;br /&gt;
ah spi != 111-222&lt;br /&gt;
ah spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah sequence 123&lt;br /&gt;
ah sequence {23, 25, 33}&lt;br /&gt;
ah sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Esp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|esp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp spi 111&lt;br /&gt;
esp spi != 111-222&lt;br /&gt;
esp spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp sequence 123&lt;br /&gt;
esp sequence {23, 25, 33}&lt;br /&gt;
esp sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Comp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|comp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header protocol (Upper layer protocol)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp nexthdr != esp&lt;br /&gt;
comp nexthdr {esp, ah, comp, udp, udplite, tcp, tcp, dccp, sctp}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| Flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp flags 0x0&lt;br /&gt;
comp flags != 0x33-0x45&lt;br /&gt;
comp flags {0x33, 0x55, 0x67, 0x88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Compression Parameter Index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp cpi 22&lt;br /&gt;
comp cpi != 33-45&lt;br /&gt;
comp cpi {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp type {echo-reply, destination-unreachable, source-quench, redirect, echo-request, time-exceeded, parameter-problem, timestamp-request, timestamp-reply, info-request, info-reply, address-mask-request, address-mask-reply, router-advertisement, router-solicitation}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp code 111&lt;br /&gt;
icmp code != 33-55&lt;br /&gt;
icmp code { 2, 4, 54, 33, 56}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp checksum 12343&lt;br /&gt;
icmp checksum != 11-343&lt;br /&gt;
icmp checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp id 12343&lt;br /&gt;
icmp id != 11-343&lt;br /&gt;
icmp id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp sequence 12343&lt;br /&gt;
icmp sequence != 11-343&lt;br /&gt;
icmp sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp mtu 12343&lt;br /&gt;
icmp mtu != 11-343&lt;br /&gt;
icmp mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;gateway &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet gateway&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp gateway 12343&lt;br /&gt;
icmp gateway != 11-343&lt;br /&gt;
icmp gateway { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmpv6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmpv6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 type {destination-unreachable, packet-too-big, time-exceeded, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, nd-redirect, parameter-problem, router-renumbering}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 code 4&lt;br /&gt;
icmpv6 code 3-66&lt;br /&gt;
icmpv6 code {5, 6, 7}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 checksum 12343&lt;br /&gt;
icmpv6 checksum != 11-343&lt;br /&gt;
icmpv6 checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 id 12343&lt;br /&gt;
icmpv6 id != 11-343&lt;br /&gt;
icmpv6 id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 sequence 12343&lt;br /&gt;
icmpv6 sequence != 11-343&lt;br /&gt;
icmpv6 sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 mtu 12343&lt;br /&gt;
icmpv6 mtu != 11-343&lt;br /&gt;
icmpv6 mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;max-delay &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet max delay&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 max-delay 33-45&lt;br /&gt;
icmpv6 max-delay != 33-45&lt;br /&gt;
icmpv6 max-delay {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ether ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ether match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;mac address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source mac address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether saddr 00:0f:54:0c:11:04&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether type vlan&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Dst ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dst match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp}&lt;br /&gt;
dst nexthdr 22&lt;br /&gt;
dst nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst hdrlength 22&lt;br /&gt;
dst hdrlength != 33-45&lt;br /&gt;
dst hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Frag ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|frag match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp, icmp}&lt;br /&gt;
frag nexthdr 6&lt;br /&gt;
frag nexthdr != 50-51&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag reserved 22&lt;br /&gt;
frag reserved != 33-45&lt;br /&gt;
frag reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag frag-off 22&lt;br /&gt;
frag frag-off != 33-45&lt;br /&gt;
frag frag-off { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;more-fragments &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag id 1&lt;br /&gt;
frag id 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Hbh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|hbh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, icmpv6}&lt;br /&gt;
hbh nexthdr 22&lt;br /&gt;
hbh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh hdrlength 22&lt;br /&gt;
hbh hdrlength != 33-45&lt;br /&gt;
hbh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Mh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|mh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
mh nexthdr 22&lt;br /&gt;
mh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh hdrlength 22&lt;br /&gt;
mh hdrlength != 33-45&lt;br /&gt;
mh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh type {binding-refresh-request, home-test-init, careof-test-init, home-test, careof-test, binding-update, binding-acknowledgement, binding-error, fast-binding-update, fast-binding-acknowledgement, fast-binding-advertisement, experimental-mobility-header, home-agent-switch-message}&lt;br /&gt;
mh type home-agent-switch-message&lt;br /&gt;
mh type != home-agent-switch-message&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh reserved 22&lt;br /&gt;
mh reserved != 33-45&lt;br /&gt;
mh reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh checksum 22&lt;br /&gt;
mh checksum != 33-45&lt;br /&gt;
mh checksum { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Rt ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|rt match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
rt nexthdr 22&lt;br /&gt;
rt nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt hdrlength 22&lt;br /&gt;
rt hdrlength != 33-45&lt;br /&gt;
rt hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt type 22&lt;br /&gt;
rt type != 33-45&lt;br /&gt;
rt type { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;seg-left &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt seg-left 22&lt;br /&gt;
rt seg-left != 33-45&lt;br /&gt;
rt seg-left { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Vlan ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|vlan match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Vlan tag ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan id 4094&lt;br /&gt;
vlan id 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cfi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan cfi 0&lt;br /&gt;
vlan cfi 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pcp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan pcp 7&lt;br /&gt;
vlan pcp 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Arp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|arp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ptype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp ptype 0x0800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;htype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Header type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp htype 1&lt;br /&gt;
arp htype != 33-45&lt;br /&gt;
arp htype { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hlen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp hlen 1&lt;br /&gt;
arp hlen != 33-45&lt;br /&gt;
arp hlen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;plen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp plen 1&lt;br /&gt;
arp plen != 33-45&lt;br /&gt;
arp plen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;operation &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp operation {nak, inreply, inrequest, rreply, rrequest, reply, request}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ct ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ct match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;state &amp;lt;state&amp;gt;&#039;&#039;&lt;br /&gt;
| State of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct state { new, established, related, untracked }&lt;br /&gt;
ct state != related&lt;br /&gt;
ct state established&lt;br /&gt;
ct state 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;direction &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Direction of the packet relative to the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct direction original&lt;br /&gt;
ct direction != original&lt;br /&gt;
ct direction {reply, original}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;status &amp;lt;status&amp;gt;&#039;&#039;&lt;br /&gt;
| Status of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct status expected&lt;br /&gt;
(ct status &amp;amp; expected) != expected&lt;br /&gt;
ct status {expected,seen-reply,assured,confirmed,snat,dnat,dying}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Mark of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct mark 0&lt;br /&gt;
ct mark or 0x23 == 0x11&lt;br /&gt;
ct mark or 0x3 != 0x1&lt;br /&gt;
ct mark and 0x23 == 0x11&lt;br /&gt;
ct mark and 0x3 != 0x1&lt;br /&gt;
ct mark xor 0x23 == 0x11&lt;br /&gt;
ct mark xor 0x3 != 0x1&lt;br /&gt;
ct mark 0x00000032&lt;br /&gt;
ct mark != 0x00000032&lt;br /&gt;
ct mark 0x00000032-0x00000045&lt;br /&gt;
ct mark != 0x00000032-0x00000045&lt;br /&gt;
ct mark {0x32, 0x2222, 0x42de3}&lt;br /&gt;
ct mark {0x32-0x2222, 0x4444-0x42de3}&lt;br /&gt;
ct mark set 0x11 xor 0x1331&lt;br /&gt;
ct mark set 0x11333 and 0x11&lt;br /&gt;
ct mark set 0x12 or 0x11&lt;br /&gt;
ct mark set 0x11&lt;br /&gt;
ct mark set mark&lt;br /&gt;
ct mark set mark map { 1 : 10, 2 : 20, 3 : 30 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;expiration &amp;lt;time&amp;gt;&#039;&#039;&lt;br /&gt;
| Connection expiration time&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct expiration 30&lt;br /&gt;
ct expiration 30s&lt;br /&gt;
ct expiration != 233&lt;br /&gt;
ct expiration != 3m53s&lt;br /&gt;
ct expiration 33-45&lt;br /&gt;
ct expiration 33s-45s&lt;br /&gt;
ct expiration != 33-45&lt;br /&gt;
ct expiration != 33s-45s&lt;br /&gt;
ct expiration {33, 55, 67, 88}&lt;br /&gt;
ct expiration { 1m7s, 33s, 55s, 1m28s}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;helper &amp;quot;&amp;lt;helper&amp;gt;&amp;quot;&#039;&#039;&lt;br /&gt;
| Helper associated with the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct helper &amp;quot;ftp&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] bytes &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original bytes &amp;gt; 100000&lt;br /&gt;
ct bytes &amp;gt; 100000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] packets &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply packets &amp;lt; 100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip saddr 192.168.0.1&lt;br /&gt;
ct reply ip saddr 192.168.0.1&lt;br /&gt;
ct original ip saddr 192.168.1.0/24&lt;br /&gt;
ct reply ip saddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip daddr 192.168.0.1&lt;br /&gt;
ct reply ip daddr 192.168.0.1&lt;br /&gt;
ct original ip daddr 192.168.1.0/24&lt;br /&gt;
ct reply ip daddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] l3proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original l3proto ipv4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original protocol 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-dst &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original proto-dst 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-src &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply proto-src 53&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;count [over] &amp;lt;number of connections&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct count over 2&lt;br /&gt;
&lt;br /&gt;
tcp dport 22 add @ssh_flood { ip saddr ct count over 2 } reject&lt;br /&gt;
[ which requires an existing ssh_flood set, ie. add set filter ssh_flood { type ipv4_addr; flags dynamic; } ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Meta ====&lt;br /&gt;
&lt;br /&gt;
[[Matching packet metainformation|&#039;&#039;meta&#039;&#039;]] matches packet by metainformation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|meta match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifname &amp;lt;input interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta iifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifname &amp;lt;output interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta oifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iif &amp;lt;input interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iif eth0&lt;br /&gt;
meta iif != eth0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oif &amp;lt;output interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oif lo&lt;br /&gt;
meta oif != lo&lt;br /&gt;
meta oif {eth0, lo}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iiftype &amp;lt;input interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta iiftype != ether&lt;br /&gt;
meta iiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oiftype &amp;lt;output interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface hardware type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta oiftype != ether&lt;br /&gt;
meta oiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Length of the packet in bytes&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta length 1000&lt;br /&gt;
meta length != 1000&lt;br /&gt;
meta length &amp;gt; 1000&lt;br /&gt;
meta length 33-45&lt;br /&gt;
meta length != 33-45&lt;br /&gt;
meta length { 33, 55, 67, 88 }&lt;br /&gt;
meta length { 33-55, 67-88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| ethertype protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta protocol ip&lt;br /&gt;
meta protocol != ip&lt;br /&gt;
meta protocol { ip, arp, ip6, vlan }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nfproto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta nfproto ipv4&lt;br /&gt;
meta nfproto != ipv6&lt;br /&gt;
meta nfproto { ipv4, ipv6 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;l4proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta l4proto 22&lt;br /&gt;
meta l4proto != 233&lt;br /&gt;
meta l4proto 33-45&lt;br /&gt;
meta l4proto { 33, 55, 67, 88 }&lt;br /&gt;
meta l4proto { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet mark&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta mark 0x4&lt;br /&gt;
meta mark 0x00000032&lt;br /&gt;
meta mark and 0x03 == 0x01&lt;br /&gt;
meta mark and 0x03 != 0x01&lt;br /&gt;
meta mark != 0x10&lt;br /&gt;
meta mark or 0x03 == 0x01&lt;br /&gt;
meta mark or 0x03 != 0x01&lt;br /&gt;
meta mark xor 0x03 == 0x01&lt;br /&gt;
meta mark xor 0x03 != 0x01&lt;br /&gt;
meta mark set 0xffffffc8 xor 0x16&lt;br /&gt;
meta mark set 0x16 and 0x16&lt;br /&gt;
meta mark set 0xffffffe9 or 0x16&lt;br /&gt;
meta mark set 0xffffffde and 0x16&lt;br /&gt;
meta mark set 0x32 or 0xfffff&lt;br /&gt;
meta mark set 0xfffe xor 0x16&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;priority [set] &amp;lt;priority&amp;gt;&#039;&#039;&lt;br /&gt;
| tc class id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta priority none&lt;br /&gt;
meta priority 0x1:0x1&lt;br /&gt;
meta priority 0x1:0xffff&lt;br /&gt;
meta priority 0xffff:0xffff&lt;br /&gt;
meta priority set 0x1:0x1&lt;br /&gt;
meta priority set 0x1:0xffff&lt;br /&gt;
meta priority set 0xffff:0xffff&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skuid &amp;lt;user id&amp;gt;&#039;&#039;&lt;br /&gt;
| UID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skuid {bin, root, daemon}&lt;br /&gt;
meta skuid root&lt;br /&gt;
meta skuid != root&lt;br /&gt;
meta skuid lt 3000&lt;br /&gt;
meta skuid gt 3000&lt;br /&gt;
meta skuid eq 3000&lt;br /&gt;
meta skuid 3001-3005&lt;br /&gt;
meta skuid != 2001-2005&lt;br /&gt;
meta skuid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skgid &amp;lt;group id&amp;gt;&#039;&#039;&lt;br /&gt;
| GID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skgid {bin, root, daemon}&lt;br /&gt;
meta skgid root&lt;br /&gt;
meta skgid != root&lt;br /&gt;
meta skgid lt 3000&lt;br /&gt;
meta skgid gt 3000&lt;br /&gt;
meta skgid eq 3000&lt;br /&gt;
meta skgid 3001-3005&lt;br /&gt;
meta skgid != 2001-2005&lt;br /&gt;
meta skgid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rtclassid &amp;lt;class&amp;gt;&#039;&#039;&lt;br /&gt;
| Routing realm&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta rtclassid cosmos&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pkttype &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta pkttype broadcast&lt;br /&gt;
meta pkttype != broadcast&lt;br /&gt;
meta pkttype { broadcast, unicast, multicast}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpu &amp;lt;cpu index&amp;gt;&#039;&#039;&lt;br /&gt;
| CPU ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cpu 1&lt;br /&gt;
meta cpu != 1&lt;br /&gt;
meta cpu 1-3&lt;br /&gt;
meta cpu != 1-2&lt;br /&gt;
meta cpu { 2,3 }&lt;br /&gt;
meta cpu { 2-3, 5-7 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifgroup &amp;lt;input group&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifgroup 0&lt;br /&gt;
meta iifgroup != 0&lt;br /&gt;
meta iifgroup default&lt;br /&gt;
meta iifgroup != default&lt;br /&gt;
meta iifgroup {default}&lt;br /&gt;
meta iifgroup { 11,33 }&lt;br /&gt;
meta iifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifgroup 0&lt;br /&gt;
meta oifgroup != 0&lt;br /&gt;
meta oifgroup default&lt;br /&gt;
meta oifgroup != default&lt;br /&gt;
meta oifgroup {default}&lt;br /&gt;
meta oifgroup { 11,33 }&lt;br /&gt;
meta oifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cgroup 1048577&lt;br /&gt;
meta cgroup != 1048577&lt;br /&gt;
meta cgroup { 1048577, 1048578 }&lt;br /&gt;
meta cgroup 1048577-1048578&lt;br /&gt;
meta cgroup != 1048577-1048578&lt;br /&gt;
meta cgroup {1048577-1048578}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Statements ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;statement&#039;&#039;&#039; is the action performed when the packet match the rule. It could be &#039;&#039;terminal&#039;&#039; and &#039;&#039;non-terminal&#039;&#039;. In a certain rule we can consider several non-terminal statements but only a single terminal statement.&lt;br /&gt;
&lt;br /&gt;
==== Verdict statements ====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;verdict statement&#039;&#039;&#039; alters control flow in the ruleset and issues policy decisions for packets. The valid verdict statements are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;accept&#039;&#039;: Accept the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;drop&#039;&#039;: Drop the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;queue&#039;&#039;: Queue the packet to userspace and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;continue&#039;&#039;: Continue the ruleset evaluation with the next rule.&lt;br /&gt;
* &#039;&#039;return&#039;&#039;: Return from the current chain and continue at the next rule of the last chain. In a base chain it is equivalent to accept&lt;br /&gt;
* &#039;&#039;jump &amp;lt;chain&amp;gt;&#039;&#039;: Continue at the first rule of &amp;lt;chain&amp;gt;. It will continue at the next rule after a return statement is issued&lt;br /&gt;
* &#039;&#039;goto &amp;lt;chain&amp;gt;&#039;&#039;: Similar to jump, but after the new chain the evaluation will continue at the last chain instead of the one containing the goto statement&lt;br /&gt;
&lt;br /&gt;
==== Log ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|log statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;level [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Log level&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log&lt;br /&gt;
log level emerg&lt;br /&gt;
log level alert&lt;br /&gt;
log level crit&lt;br /&gt;
log level err&lt;br /&gt;
log level warn&lt;br /&gt;
log level notice&lt;br /&gt;
log level info&lt;br /&gt;
log level debug&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;group &amp;lt;value&amp;gt; [queue-threshold &amp;lt;value&amp;gt;] [snaplen &amp;lt;value&amp;gt;] [prefix &amp;quot;&amp;lt;prefix&amp;gt;&amp;quot;]&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log prefix aaaaa-aaaaaa group 2 snaplen 33&lt;br /&gt;
log group 2 queue-threshold 2&lt;br /&gt;
log group 2 snaplen 33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reject ====&lt;br /&gt;
&lt;br /&gt;
The default &#039;&#039;&#039;reject&#039;&#039;&#039; will be the ICMP type &#039;&#039;&#039;port-unreachable&#039;&#039;&#039;. The &#039;&#039;&#039;icmpx&#039;&#039;&#039; is only used for inet family support.&lt;br /&gt;
&lt;br /&gt;
More information on the [[Rejecting_traffic]] page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|reject statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;with &amp;lt;protocol&amp;gt; type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
reject&lt;br /&gt;
reject with icmp type host-unreachable&lt;br /&gt;
reject with icmp type net-unreachable&lt;br /&gt;
reject with icmp type prot-unreachable&lt;br /&gt;
reject with icmp type port-unreachable&lt;br /&gt;
reject with icmp type net-prohibited&lt;br /&gt;
reject with icmp type host-prohibited&lt;br /&gt;
reject with icmp type admin-prohibited&lt;br /&gt;
reject with icmpv6 type no-route&lt;br /&gt;
reject with icmpv6 type admin-prohibited&lt;br /&gt;
reject with icmpv6 type addr-unreachable&lt;br /&gt;
reject with icmpv6 type port-unreachable&lt;br /&gt;
reject with icmpx type host-unreachable&lt;br /&gt;
reject with icmpx type no-route&lt;br /&gt;
reject with icmpx type admin-prohibited&lt;br /&gt;
reject with icmpx type port-unreachable&lt;br /&gt;
ip protocol tcp reject with tcp reset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Counter ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|counter statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;packets &amp;lt;packets&amp;gt; bytes &amp;lt;bytes&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
counter&lt;br /&gt;
counter packets 0 bytes 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Limit ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|limit statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rate [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Rate limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
limit rate 400/minute&lt;br /&gt;
limit rate 400/hour&lt;br /&gt;
limit rate over 40/day&lt;br /&gt;
limit rate over 400/week&lt;br /&gt;
limit rate over 1023/second burst 10 packets&lt;br /&gt;
limit rate 1025 kbytes/second&lt;br /&gt;
limit rate 1023000 mbytes/second&lt;br /&gt;
limit rate 1025 bytes/second burst 512 bytes&lt;br /&gt;
limit rate 1025 kbytes/second burst 1023 kbytes&lt;br /&gt;
limit rate 1025 mbytes/second burst 1025 kbytes&lt;br /&gt;
limit rate 1025000 mbytes/second burst 1023 mbytes&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nat ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|nat statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dnat to &amp;lt;destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dnat to 192.168.3.2&lt;br /&gt;
dnat to ct mark map { 0x00000014 : 1.2.3.4}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;snat to &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
snat to 192.168.3.2&lt;br /&gt;
snat to 2001:838:35f:1::-2001:838:35f:2:::100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;masquerade [&amp;lt;type&amp;gt;] [to :&amp;lt;port&amp;gt;]&#039;&#039;&lt;br /&gt;
| Masquerade&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
masquerade&lt;br /&gt;
masquerade persistent,fully-random,random&lt;br /&gt;
masquerade to :1024&lt;br /&gt;
masquerade to :1024-2048&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Queue ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|queue statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;num &amp;lt;value&amp;gt; &amp;lt;scheduler&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
queue&lt;br /&gt;
queue num 2&lt;br /&gt;
queue num 2-3&lt;br /&gt;
queue num 4-5 fanout bypass&lt;br /&gt;
queue num 4-5 fanout&lt;br /&gt;
queue num 4-5 bypass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Export Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft export (xml | json)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monitor Events ===&lt;br /&gt;
&lt;br /&gt;
Monitor events from Netlink creating filters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft monitor [new | destroy] [tables | chains | sets | rules | elements] [xml | json]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Nft scripting =&lt;br /&gt;
&lt;br /&gt;
== List ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flush ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Load ruleset ==&lt;br /&gt;
&lt;br /&gt;
Create a command batch file and load it with the nft interpreter,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% echo &amp;quot;flush ruleset&amp;quot; &amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add table filter&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add chain filter input&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add rule filter input meta iifname lo accept&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/nftables.rules&lt;br /&gt;
&amp;gt; #!/usr/local/sbin/nft -f&lt;br /&gt;
&amp;gt; flush ruleset&lt;br /&gt;
&amp;gt; add table filter&lt;br /&gt;
&amp;gt; add chain filter input&lt;br /&gt;
&amp;gt; add rule filter input meta iifname lo accept&lt;br /&gt;
&amp;gt; EOF&lt;br /&gt;
% chmod u+x /etc/nftables.rules&lt;br /&gt;
% /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file from an already created ruleset,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset &amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
== Simple IP/IPv6 Firewall ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    icmp type echo-request accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table ip6 firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # invalid connections&lt;br /&gt;
    ct state invalid drop&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    # routers may also want: mld-listener-query, nd-router-solicit&lt;br /&gt;
    icmpv6 type {echo-request,nd-neighbor-solicit} accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=995</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=995"/>
		<updated>2021-07-05T20:36:32Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Doing connlimit with nft */ document caveats&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meters ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dynamic sets/maps&#039;&#039;&#039; or meters are a way to use maps with stateful objects. They used to be known as &#039;&#039;flow tables&#039;&#039; before nft v0.8.1 and Linux kernel 4.3.&lt;br /&gt;
&lt;br /&gt;
Among other things, they provide a native replacement for the &#039;&#039;hashlimit&#039;&#039; match in iptables. However, meters are a lot more flexible since you can use any selector, one or many through [[concatenations]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that the &#039;&#039;meter&#039;&#039; keyword is obsolete, the dynamic set and map syntax is now preferred for consistency.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Using meters ==&lt;br /&gt;
&lt;br /&gt;
The following commands create a table named &#039;&#039;my_filter_table&#039;&#039;, a chain named &#039;&#039;my_input_chain&#039;&#039; which hooks incoming traffic and a rule that uses a meter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add table my_filter_table&lt;br /&gt;
% nft add chain my_filter_table my_input_chain {type filter hook input priority 0\;}&lt;br /&gt;
% nft add set my_filter_table my_ssh_meter { type ipv4_addr\; flags dynamic \;}&lt;br /&gt;
% nft add rule my_filter_table my_input_chain tcp dport 22 ct state new add @my_ssh_meter { ip saddr limit rate 10/second } accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example we create a rule to match &#039;&#039;new&#039;&#039; TCP &#039;&#039;ssh&#039;&#039; (port 22) connections, which uses a dynamic set named &#039;&#039;my_ssh_meter&#039;&#039; to limit the traffic rate to 10 connections per second for each source IP address. The available time units on limits are: &#039;&#039;second&#039;&#039;, &#039;&#039;minute&#039;&#039;, &#039;&#039;hour&#039;&#039;, &#039;&#039;day&#039;&#039; and &#039;&#039;week&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You can also use [[concatenations]] to build selectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add set my_filter_table my_ssh_meter { type ipv4_addr . inet_service\; flags timeout, dynamic \;}&lt;br /&gt;
% nft add rule my_filter_table my_input_chain tcp dport 22 ct state new add @my_ssh_meter { ip saddr . tcp dport timeout 60s limit rate 10/second } accept&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule counts incoming connections (packets with state &#039;&#039;new&#039;&#039;) based on the tuple &#039;&#039;(IP source address, TCP destination port)&#039;&#039;, the counters are dropped after 60 seconds without update.&lt;br /&gt;
&lt;br /&gt;
== Listing meters ==&lt;br /&gt;
&lt;br /&gt;
To list the content matched by the meter use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list set my_filter_table my_ssh_meter&lt;br /&gt;
table ip my_filter_table {&lt;br /&gt;
        set my_ssh_meter {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                size 65535&lt;br /&gt;
                flags dynamic&lt;br /&gt;
                elements = { 10.141.10.2 limit rate 10/second }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Doing connlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Since 4.18, there is a new &#039;&#039;ct count&#039;&#039; selector that allows you to count the number of existing connections. This extension uses the information available in the Connection Tracking System table, therefore, the counting of connection is based on the existing entries in the table.&lt;br /&gt;
&lt;br /&gt;
The following example shows how to do &#039;&#039;connlimit&#039;&#039; from nftables:&lt;br /&gt;
&lt;br /&gt;
 table ip my_filter_table {&lt;br /&gt;
        set my_connlimit {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                size 65535&lt;br /&gt;
                flags dynamic&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        chain my_output_chain {&lt;br /&gt;
                type filter hook output priority filter; policy accept;&lt;br /&gt;
                ct state new add @my_connlimit { ip daddr ct count over 20 } counter packets 0 bytes 0 drop&lt;br /&gt;
        }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The example above dynamically populates the set &#039;&#039;connlimit&#039;&#039; from the packet path. For the first packet of each connection (ie. packets matching &#039;&#039;ct state new&#039;&#039;), this adds an entry into &#039;&#039;connlimit&#039;&#039; set, this entry uses the IPv4 destination address as a key. If the number of connections goes over 20, then packets are dropped.&lt;br /&gt;
&lt;br /&gt;
Since &#039;&#039;connlimit&#039;&#039; is a set, you can perform any operation on it, such as listing and flushing its content.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Caveats&#039;&#039;&#039;:&lt;br /&gt;
* Do not define a set with a timeout. There is a garbage collector that removes the set element whenever &#039;&#039;ct count&#039;&#039; becomes zero to improve memory usage.&lt;br /&gt;
* For the same reason, you cannot use the &#039;&#039;update&#039;&#039; set statement which allows to refresh the timeout of your set element. Therefore, the &#039;&#039;ct count&#039;&#039; statement can only be used with the &#039;&#039;add&#039;&#039; set statement.&lt;br /&gt;
&lt;br /&gt;
If you define a set with a timeout or you use the &#039;&#039;update&#039;&#039; set statement, then you will hit the &amp;quot;Operation is not supported&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
== Doing iptables hashlimit with nft ==&lt;br /&gt;
&lt;br /&gt;
Meters replace iptables hashlimit in nft. From iptables v1.6.2 onward, you can use the tool &#039;&#039;&#039;iptables-translate&#039;&#039;&#039; to see how to translate hashlimit rules.&lt;br /&gt;
&lt;br /&gt;
Almost all hashlimit options are available in nft, starting with --hashlimit-mode, it is replaced by the selector in a meter. All modes are available except no mode, a meter demands a selector, an iptables rule without hashlimit-mode isn&#039;t supported in nft. A simple rule translation is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200/sec --hashlimit-mode srcip,dstport --hashlimit-name http1 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http1 { tcp dport . ip saddr limit rate over 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that a meter is named, like hashlimit, and using multiple hashlimit-modes is similar to using a concatenation of selectors. Also, --hashlimit-above is translated to &#039;&#039;limit rate over&#039;&#039;, to simulate --hashlimit-upto just omit or replace &#039;&#039;over&#039;&#039; with &#039;&#039;until&#039;&#039; in the rule.&lt;br /&gt;
&lt;br /&gt;
The options --hashlimit-burst and --hashlimit-htable-expire are translated to &#039;&#039;burst&#039;&#039; and &#039;&#039;timeout&#039;&#039; in a meter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200kb/s --hashlimit-burst 1mb --hashlimit-mode srcip,dstport --hashlimit-name http2 --hashlimit-htable-expire 3000 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http2 { tcp dport . ip saddr timeout 3s limit rate over 200 kbytes/second burst 1 mbytes} counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule shows how &#039;&#039;timeout&#039;&#039; and &#039;&#039;burst&#039;&#039; are used in a meter, also notice that meters, similarly to hashlimit, accepts limiting rates by bytes frequency instead of packets.&lt;br /&gt;
&lt;br /&gt;
Another hashlimit option is to limit the traffic rate on subnets, of IP source or destination addresses, using the options --hashlimit-srcmask and --hashlimit-dstmask. This feature is available in nft by attaching a subnet mask to a meter selector, attach to &#039;&#039;ip saddr&#039;&#039; for source address and to &#039;&#039;ip daddr&#039;&#039; for destination adress:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ iptables-translate -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 200 --hashlimit-mode srcip --hashlimit-name http3 --hashlimit-srcmask 24 -j DROP&lt;br /&gt;
nft add rule ip filter INPUT tcp dport 80 meter http3 { ip saddr and 255.255.255.0 limit rate 200/second } counter drop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule will limit packets rate, grouping subnets determined by the first 24 bits of the IP source address, from the incoming packets on port 80.&lt;br /&gt;
&lt;br /&gt;
The remaining options, --hashlimit-htable-max, --hashlimit-htable-size and --hashlimit-htable-gcinterval don&#039;t apply to meters.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Connlimits&amp;diff=994</id>
		<title>Connlimits</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Connlimits&amp;diff=994"/>
		<updated>2021-07-05T20:35:38Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Using connlimits in dynamic sets and maps */ remove this example, the header is a hyperlink&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A connlimit in nftables is written &#039;&#039;ct count {over}&#039;&#039; [count]. Unlike other stateful object types, all connlimits are anonymous: each connlimit attaches to and applies within the context of a single rule or single element of a dynamic set or map.&lt;br /&gt;
&lt;br /&gt;
A connlimit &#039;&#039;ct count {over}&#039;&#039; [count]:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;counts the number of current conntrack connections matching its context;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;matches either:&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;only when conntrack is currently tracking fewer than &#039;&#039;count&#039;&#039; matching connections, or&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;if &#039;&#039;over&#039;&#039; is specified, only when conntrack is currently tracking more than &#039;&#039;count&#039;&#039; matching connections.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: connlimits require at least nftables 0.9.0 and Linux kernel 4.19.10; using connlimits can crash the host when using earlier 4.19.x kernels.&lt;br /&gt;
&lt;br /&gt;
= Using connlimits in rules =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
table inet connlimit_demo {&lt;br /&gt;
   chain IN { &lt;br /&gt;
      type filter hook input priority filter; policy drop;&lt;br /&gt;
&lt;br /&gt;
      tcp dport 22 ct count 10 accept&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above ruleset accepts packets to port tcp/22 (sshd), as long as conntrack is currently tracking no more than 10 such sshd connections. If a new SYN to tcp/22 arrives while conntrack already has 10 such connections, it will be dropped.&lt;br /&gt;
&lt;br /&gt;
= [[Meters#Doing_connlimit_with_nft|Using connlimits in dynamic sets and maps]] =&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Connlimits&amp;diff=993</id>
		<title>Connlimits</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Connlimits&amp;diff=993"/>
		<updated>2021-07-05T20:34:30Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Using connlimits in dynamic sets and maps */ add example and caveats&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A connlimit in nftables is written &#039;&#039;ct count {over}&#039;&#039; [count]. Unlike other stateful object types, all connlimits are anonymous: each connlimit attaches to and applies within the context of a single rule or single element of a dynamic set or map.&lt;br /&gt;
&lt;br /&gt;
A connlimit &#039;&#039;ct count {over}&#039;&#039; [count]:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;counts the number of current conntrack connections matching its context;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;matches either:&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;only when conntrack is currently tracking fewer than &#039;&#039;count&#039;&#039; matching connections, or&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;if &#039;&#039;over&#039;&#039; is specified, only when conntrack is currently tracking more than &#039;&#039;count&#039;&#039; matching connections.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: connlimits require at least nftables 0.9.0 and Linux kernel 4.19.10; using connlimits can crash the host when using earlier 4.19.x kernels.&lt;br /&gt;
&lt;br /&gt;
= Using connlimits in rules =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
table inet connlimit_demo {&lt;br /&gt;
   chain IN { &lt;br /&gt;
      type filter hook input priority filter; policy drop;&lt;br /&gt;
&lt;br /&gt;
      tcp dport 22 ct count 10 accept&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above ruleset accepts packets to port tcp/22 (sshd), as long as conntrack is currently tracking no more than 10 such sshd connections. If a new SYN to tcp/22 arrives while conntrack already has 10 such connections, it will be dropped.&lt;br /&gt;
&lt;br /&gt;
= [[Meters#Doing_connlimit_with_nft|Using connlimits in dynamic sets and maps]] =&lt;br /&gt;
&lt;br /&gt;
You can also use connlimit in dynamic sets, this provides a scalable way to define connlimits per set element.&lt;br /&gt;
&lt;br /&gt;
The following example shows how to allow up to 2 simultaneous connections to your host from one IP address.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
        set connlimit {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                flags dynamic&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority filter; policy accept;&lt;br /&gt;
                ct state new add @connlimit { ip saddr ct count over 2 } counter drop&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Do not define a set with a timeout. There is a garbage collector that removes the set element whenever &#039;&#039;ct count&#039;&#039; becomes zero to improve memory usage.&lt;br /&gt;
* For the same reason, you cannot use the &#039;&#039;update&#039;&#039; set statement which allows to refresh the timeout of your set element. Therefore, the &#039;&#039;ct count&#039;&#039; statement can only be used with the &#039;&#039;add&#039;&#039; set statement.&lt;br /&gt;
&lt;br /&gt;
If you define a set with a timeout or you use the &#039;&#039;update&#039;&#039; set statement, then you will hit the &amp;quot;Operation is not supported&amp;quot; error.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Connlimits&amp;diff=992</id>
		<title>Connlimits</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Connlimits&amp;diff=992"/>
		<updated>2021-07-05T20:29:52Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Using connlimits in dynamic sets and maps */ add example and caveats&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A connlimit in nftables is written &#039;&#039;ct count {over}&#039;&#039; [count]. Unlike other stateful object types, all connlimits are anonymous: each connlimit attaches to and applies within the context of a single rule or single element of a dynamic set or map.&lt;br /&gt;
&lt;br /&gt;
A connlimit &#039;&#039;ct count {over}&#039;&#039; [count]:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;counts the number of current conntrack connections matching its context;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;matches either:&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;only when conntrack is currently tracking fewer than &#039;&#039;count&#039;&#039; matching connections, or&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;if &#039;&#039;over&#039;&#039; is specified, only when conntrack is currently tracking more than &#039;&#039;count&#039;&#039; matching connections.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: connlimits require at least nftables 0.9.0 and Linux kernel 4.19.10; using connlimits can crash the host when using earlier 4.19.x kernels.&lt;br /&gt;
&lt;br /&gt;
= Using connlimits in rules =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
table inet connlimit_demo {&lt;br /&gt;
   chain IN { &lt;br /&gt;
      type filter hook input priority filter; policy drop;&lt;br /&gt;
&lt;br /&gt;
      tcp dport 22 ct count 10 accept&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above ruleset accepts packets to port tcp/22 (sshd), as long as conntrack is currently tracking no more than 10 such sshd connections. If a new SYN to tcp/22 arrives while conntrack already has 10 such connections, it will be dropped.&lt;br /&gt;
&lt;br /&gt;
= [[Meters#Doing_connlimit_with_nft|Using connlimits in dynamic sets and maps]] =&lt;br /&gt;
&lt;br /&gt;
You can also use connlimit in dynamic sets, this provides a scalable way to define connlimits per set element.&lt;br /&gt;
&lt;br /&gt;
The following example shows how to allow up to 2 simultaneous connections to your host from one IP address.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
        set connlimit {&lt;br /&gt;
                type ipv4_addr&lt;br /&gt;
                flags dynamic&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority filter; policy accept;&lt;br /&gt;
                ct state new add @connlimit { ip saddr ct count over 2 } counter packets 6 bytes 504 drop&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
* Do not define a set with a timeout. There is a garbage collector that removes the set element whenever &#039;&#039;ct count&#039;&#039; becomes zero to improve memory usage.&lt;br /&gt;
* For the same reason, you cannot use the &#039;&#039;update&#039;&#039; set statement which allows to refresh the timeout of your set element. Therefore, the &#039;&#039;ct count&#039;&#039; statement can only be used with the &#039;&#039;add&#039;&#039; set statement.&lt;br /&gt;
&lt;br /&gt;
If you define a set with a timeout or you use the &#039;&#039;update&#039;&#039; set statement, then you will hit the &amp;quot;Operation is not supported&amp;quot; error.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Moving_from_ipset_to_nftables&amp;diff=990</id>
		<title>Moving from ipset to nftables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Moving_from_ipset_to_nftables&amp;diff=990"/>
		<updated>2021-06-28T11:01:54Z</updated>

		<summary type="html">&lt;p&gt;Pablo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you use [[ipset]] with iptables, you need to consider the following when [[Moving from iptables to nftables | moving to nftables]]:&lt;br /&gt;
&lt;br /&gt;
* Since ipset 7.12, there is the &#039;&#039;ipset-translate&#039;&#039; utility that automatically transform ipsets into nftables [[Sets|sets]]. This utility translates ipset set types into nftables set data types, which will often result in [[Concatenations | concatenated]] types. For example, an ipset of type &#039;&#039;hash:net,port,net&#039;&#039; becomes an nftables set of type &#039;&#039;ipv4_addr&amp;amp;nbsp;.&amp;amp;nbsp;inet_service&amp;amp;nbsp;.&amp;amp;nbsp;ipv4_addr&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* nftables sets do not support negated elements, as with ipset &#039;&#039;nomatch&#039;&#039;. To translate an ipset that has &#039;&#039;nomatch&#039;&#039; elements you can use a pair of nftables sets, one for the usual positive elements and one for negated elements, along with compound rule expressions like &#039;&#039;ip&amp;amp;nbsp;saddr&amp;amp;nbsp;@pos_set&amp;amp;nbsp;&amp;amp;nbsp;ip&amp;amp;nbsp;saddr&amp;amp;nbsp;!=&amp;amp;nbsp;@neg_set&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* After the initial translation, it is recommended to have a look at nftables [[Maps|maps]] and [[Verdict_Maps_(vmaps)|verdict&amp;amp;nbsp;maps]] to make your ruleset more efficient.&lt;br /&gt;
&lt;br /&gt;
The translation from ipset to nftables is straightforward with the &#039;&#039;ipset-translate&#039;&#039; utility:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ipset-translate restore &amp;lt; sets.ipset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is an example of translating a basic iptables/ipset configuration into nftables.&lt;br /&gt;
&lt;br /&gt;
Here is the iptables/ipset setup:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
user@debian:~ $ sudo ipset save &amp;gt; sets.ipset&lt;br /&gt;
user@debian:~ $ sudo cat sets.ipset&lt;br /&gt;
create myset hash:ip,port,ip family inet hashsize 1024 maxelem 65536&lt;br /&gt;
add myset 172.16.0.1,tcp:80,10.0.0.1&lt;br /&gt;
&lt;br /&gt;
user@debian:~ $ sudo ipset-translate restore &amp;lt; sets.ipset&lt;br /&gt;
add table inet global&lt;br /&gt;
add set inet global myset { type ipv4_addr . inet_proto . inet_service . ipv4_addr; size 65536; }&lt;br /&gt;
add element inet global myset { 172.16.0.1 . tcp . 80 . 10.0.0.1 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The translation utility defines a dummy &#039;&#039;inet&#039;&#039; table whose name is &#039;&#039;global&#039;&#039;, you can mangle this output to make it fit into your existing ruleset.&lt;br /&gt;
&lt;br /&gt;
Now, you have to manually translate the rules that contain &#039;&#039;-m set&#039;&#039; in your ruleset:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
user@debian:~ $ sudo iptables-save&lt;br /&gt;
# Generated by iptables-save v1.8.3 on Wed Oct 30 11:26:41 2019&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT ACCEPT [3:212]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [4:250]&lt;br /&gt;
-A INPUT -m set --match-set myset src,dst,dst -j ACCEPT&lt;br /&gt;
COMMIT&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above translates into nftables as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
user@debian:~ $ sudo nft list ruleset&lt;br /&gt;
table inet filter {&lt;br /&gt;
	map myset {&lt;br /&gt;
		type ipv4_addr . inet_service . ipv4_addr : verdict&lt;br /&gt;
		elements = { 172.16.0.1 . 80 . 10.0.0.1 : accept }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	chain input {&lt;br /&gt;
		type filter hook input priority filter; policy accept;&lt;br /&gt;
		meta nfproto ipv4 ip saddr . tcp dport . ip daddr vmap @myset&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we have used an nftables [[Verdict_Maps_(vmaps)|verdict&amp;amp;nbsp;map]], which takes action directly from each map element. Using such powerful new structures can greatly reduce the number of rules required by your filtering policy, compared with iptables/ipset.&lt;br /&gt;
&lt;br /&gt;
We recommend reading about [[Concatenations | concatenations]].&lt;br /&gt;
&lt;br /&gt;
Here are some additional examples of nftables equivalents for some ipset data types:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hash:net,net&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule tablename chainname ip saddr . ip daddr vmap { 10.10.10.0/24 . 10.10.20.0/24 : accept }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hash:net,port,net&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule tablename chainname ip saddr . tcp dport . ip daddr vmap { 10.10.10.0/24 . 80 . 10.10.20.0/24 : accept }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hash:net,iface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule tablename chainname ip saddr . iif vmap { 10.10.10.0/24 . eth0 : accept }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that before Linux kernel 5.6 and nftables 0.9.4 the CIDR notation used above was not yet available. If you are unable to upgrade, you can work around this limitation as noted in the [[Concatenations#Network_addresses|concatenation&amp;amp;nbsp;examples]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Concatenations]]&lt;br /&gt;
* [[Sets]]&lt;br /&gt;
* [[Maps]]&lt;br /&gt;
* [[Verdict_Maps_(vmaps) | Verdict maps]]&lt;br /&gt;
* [[Legacy xtables tools]]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Moving_from_ipset_to_nftables&amp;diff=989</id>
		<title>Moving from ipset to nftables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Moving_from_ipset_to_nftables&amp;diff=989"/>
		<updated>2021-06-28T11:00:00Z</updated>

		<summary type="html">&lt;p&gt;Pablo: incorrect ipset-translate syntax in example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you use [[ipset]] with iptables, you need to consider the following when [[Moving from iptables to nftables | moving to nftables]]:&lt;br /&gt;
&lt;br /&gt;
* Since ipset 7.12, there is the &#039;&#039;ipset-translate&#039;&#039; utility that automatically transform ipsets into nftables [[Sets|sets]]. This utility translates ipset set types into nftables set data types, which will often result in [[Concatenations | concatenated]] types. For example, an ipset of type &#039;&#039;hash:net,port,net&#039;&#039; becomes an nftables set of type &#039;&#039;ipv4_addr&amp;amp;nbsp;.&amp;amp;nbsp;inet_service&amp;amp;nbsp;.&amp;amp;nbsp;ipv4_addr&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* nftables sets do not support negated elements, as with ipset &#039;&#039;nomatch&#039;&#039;. To translate an ipset that has &#039;&#039;nomatch&#039;&#039; elements you can use a pair of nftables sets, one for the usual positive elements and one for negated elements, along with compound rule expressions like &#039;&#039;ip&amp;amp;nbsp;saddr&amp;amp;nbsp;@pos_set&amp;amp;nbsp;&amp;amp;nbsp;ip&amp;amp;nbsp;saddr&amp;amp;nbsp;!=&amp;amp;nbsp;@neg_set&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* After the initial translation, it is recommended to have a look at nftables [[Maps|maps]] and [[Verdict_Maps_(vmaps)|verdict&amp;amp;nbsp;maps]] to make your ruleset more efficient.&lt;br /&gt;
&lt;br /&gt;
The translation from ipset to nftables is straightforward with the &#039;&#039;ipset-translate&#039;&#039; utility:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ipset-translate restore &amp;lt; sets.ipset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is an example of translating a basic iptables/ipset configuration into nftables.&lt;br /&gt;
&lt;br /&gt;
Here is the iptables/ipset setup:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
user@debian:~ $ sudo ipset save &amp;gt; sets.ipset&lt;br /&gt;
user@debian:~ $ sudo cat sets.ipset&lt;br /&gt;
create myset hash:ip,port,ip family inet hashsize 1024 maxelem 65536&lt;br /&gt;
add myset 172.16.0.1,tcp:80,10.0.0.1&lt;br /&gt;
&lt;br /&gt;
user@debian:~ $ sudo ipset-translate restore &amp;lt; sets.ipset&lt;br /&gt;
add table inet global&lt;br /&gt;
add set inet global myset { type ipv4_addr . inet_proto . inet_service . ipv4_addr; size 65536; }&lt;br /&gt;
add element inet global myset { 172.16.0.1 . tcp . 80 . 10.0.0.1 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, you have to manually translate the rules that contain &#039;&#039;-m set&#039;&#039; in your ruleset:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
user@debian:~ $ sudo iptables-save&lt;br /&gt;
# Generated by iptables-save v1.8.3 on Wed Oct 30 11:26:41 2019&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT ACCEPT [3:212]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [4:250]&lt;br /&gt;
-A INPUT -m set --match-set myset src,dst,dst -j ACCEPT&lt;br /&gt;
COMMIT&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above translates into nftables as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
user@debian:~ $ sudo nft list ruleset&lt;br /&gt;
table inet filter {&lt;br /&gt;
	map myset {&lt;br /&gt;
		type ipv4_addr . inet_service . ipv4_addr : verdict&lt;br /&gt;
		elements = { 172.16.0.1 . 80 . 10.0.0.1 : accept }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	chain input {&lt;br /&gt;
		type filter hook input priority filter; policy accept;&lt;br /&gt;
		meta nfproto ipv4 ip saddr . tcp dport . ip daddr vmap @myset&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we have used an nftables [[Verdict_Maps_(vmaps)|verdict&amp;amp;nbsp;map]], which takes action directly from each map element. Using such powerful new structures can greatly reduce the number of rules required by your filtering policy, compared with iptables/ipset.&lt;br /&gt;
&lt;br /&gt;
We recommend reading about [[Concatenations | concatenations]].&lt;br /&gt;
&lt;br /&gt;
Here are some additional examples of nftables equivalents for some ipset data types:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hash:net,net&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule tablename chainname ip saddr . ip daddr vmap { 10.10.10.0/24 . 10.10.20.0/24 : accept }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hash:net,port,net&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule tablename chainname ip saddr . tcp dport . ip daddr vmap { 10.10.10.0/24 . 80 . 10.10.20.0/24 : accept }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hash:net,iface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule tablename chainname ip saddr . iif vmap { 10.10.10.0/24 . eth0 : accept }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that before Linux kernel 5.6 and nftables 0.9.4 the CIDR notation used above was not yet available. If you are unable to upgrade, you can work around this limitation as noted in the [[Concatenations#Network_addresses|concatenation&amp;amp;nbsp;examples]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Concatenations]]&lt;br /&gt;
* [[Sets]]&lt;br /&gt;
* [[Maps]]&lt;br /&gt;
* [[Verdict_Maps_(vmaps) | Verdict maps]]&lt;br /&gt;
* [[Legacy xtables tools]]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Moving_from_ipset_to_nftables&amp;diff=988</id>
		<title>Moving from ipset to nftables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Moving_from_ipset_to_nftables&amp;diff=988"/>
		<updated>2021-06-28T10:58:39Z</updated>

		<summary type="html">&lt;p&gt;Pablo: update article to document the new ipset-translate utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you use [[ipset]] with iptables, you need to consider the following when [[Moving from iptables to nftables | moving to nftables]]:&lt;br /&gt;
&lt;br /&gt;
* Since ipset 7.12, there is the &#039;&#039;ipset-translate&#039;&#039; utility that automatically transform ipsets into nftables [[Sets|sets]]. This utility translates ipset set types into nftables set data types, which will often result in [[Concatenations | concatenated]] types. For example, an ipset of type &#039;&#039;hash:net,port,net&#039;&#039; becomes an nftables set of type &#039;&#039;ipv4_addr&amp;amp;nbsp;.&amp;amp;nbsp;inet_service&amp;amp;nbsp;.&amp;amp;nbsp;ipv4_addr&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* nftables sets do not support negated elements, as with ipset &#039;&#039;nomatch&#039;&#039;. To translate an ipset that has &#039;&#039;nomatch&#039;&#039; elements you can use a pair of nftables sets, one for the usual positive elements and one for negated elements, along with compound rule expressions like &#039;&#039;ip&amp;amp;nbsp;saddr&amp;amp;nbsp;@pos_set&amp;amp;nbsp;&amp;amp;nbsp;ip&amp;amp;nbsp;saddr&amp;amp;nbsp;!=&amp;amp;nbsp;@neg_set&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* After the initial translation, it is recommended to have a look at nftables [[Maps|maps]] and [[Verdict_Maps_(vmaps)|verdict&amp;amp;nbsp;maps]] to make your ruleset more efficient.&lt;br /&gt;
&lt;br /&gt;
The translation from ipset to nftables is straightforward with the &#039;&#039;ipset-translate&#039;&#039; utility:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ipset-translate restore sets.ipset &amp;gt; sets.nft&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is an example of translating a basic iptables/ipset configuration into nftables.&lt;br /&gt;
&lt;br /&gt;
Here is the iptables/ipset setup:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
user@debian:~ $ sudo ipset save &amp;gt; sets.ipset&lt;br /&gt;
user@debian:~ $ sudo cat sets.ipset&lt;br /&gt;
create myset hash:ip,port,ip family inet hashsize 1024 maxelem 65536&lt;br /&gt;
add myset 172.16.0.1,tcp:80,10.0.0.1&lt;br /&gt;
&lt;br /&gt;
user@debian:~ $ sudo ipset-translate restore &amp;lt; sets.ipset&lt;br /&gt;
add table inet global&lt;br /&gt;
add set inet global myset { type ipv4_addr . inet_proto . inet_service . ipv4_addr; size 65536; }&lt;br /&gt;
add element inet global myset { 172.16.0.1 . tcp . 80 . 10.0.0.1 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, you have to manually translate the rules that contain &#039;&#039;-m set&#039;&#039; in your ruleset:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
user@debian:~ $ sudo iptables-save&lt;br /&gt;
# Generated by iptables-save v1.8.3 on Wed Oct 30 11:26:41 2019&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT ACCEPT [3:212]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [4:250]&lt;br /&gt;
-A INPUT -m set --match-set myset src,dst,dst -j ACCEPT&lt;br /&gt;
COMMIT&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above translates into nftables as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
user@debian:~ $ sudo nft list ruleset&lt;br /&gt;
table inet filter {&lt;br /&gt;
	map myset {&lt;br /&gt;
		type ipv4_addr . inet_service . ipv4_addr : verdict&lt;br /&gt;
		elements = { 172.16.0.1 . 80 . 10.0.0.1 : accept }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	chain input {&lt;br /&gt;
		type filter hook input priority filter; policy accept;&lt;br /&gt;
		meta nfproto ipv4 ip saddr . tcp dport . ip daddr vmap @myset&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we have used an nftables [[Verdict_Maps_(vmaps)|verdict&amp;amp;nbsp;map]], which takes action directly from each map element. Using such powerful new structures can greatly reduce the number of rules required by your filtering policy, compared with iptables/ipset.&lt;br /&gt;
&lt;br /&gt;
We recommend reading about [[Concatenations | concatenations]].&lt;br /&gt;
&lt;br /&gt;
Here are some additional examples of nftables equivalents for some ipset data types:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hash:net,net&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule tablename chainname ip saddr . ip daddr vmap { 10.10.10.0/24 . 10.10.20.0/24 : accept }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hash:net,port,net&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule tablename chainname ip saddr . tcp dport . ip daddr vmap { 10.10.10.0/24 . 80 . 10.10.20.0/24 : accept }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hash:net,iface&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule tablename chainname ip saddr . iif vmap { 10.10.10.0/24 . eth0 : accept }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that before Linux kernel 5.6 and nftables 0.9.4 the CIDR notation used above was not yet available. If you are unable to upgrade, you can work around this limitation as noted in the [[Concatenations#Network_addresses|concatenation&amp;amp;nbsp;examples]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Concatenations]]&lt;br /&gt;
* [[Sets]]&lt;br /&gt;
* [[Maps]]&lt;br /&gt;
* [[Verdict_Maps_(vmaps) | Verdict maps]]&lt;br /&gt;
* [[Legacy xtables tools]]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Multiple_NATs_using_nftables_maps&amp;diff=987</id>
		<title>Multiple NATs using nftables maps</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Multiple_NATs_using_nftables_maps&amp;diff=987"/>
		<updated>2021-06-21T12:56:35Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Multiple NAT mapping with address and port */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thanks to nftables [[Maps]], if you have a previous iptables NAT (destination NAT) ruleset like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% iptables -t nat -A PREROUTING -p tcp --dport 1000 -j DNAT --to-destination 1.1.1.1:1234&lt;br /&gt;
% iptables -t nat -A PREROUTING -p udp --dport 2000 -j DNAT --to-destination 2.2.2.2:2345&lt;br /&gt;
% iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination 3.3.3.3:3456&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be easily translated to nftables in a single line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat prerouting dnat to \&lt;br /&gt;
      tcp dport map { 1000 : 1.1.1.1, 2000 : 2.2.2.2, 3000 : 3.3.3.3} \&lt;br /&gt;
      : tcp dport map { 1000 : 1234, 2000 : 2345, 3000 : 3456 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Likewise, in iptables NAT (source NAT):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT --to-source 1.1.1.1&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.2.2 -j SNAT --to-source 2.2.2.2&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.3.3 -j SNAT --to-source 3.3.3.3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translated to a nftables one-liner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat postrouting snat to \&lt;br /&gt;
      ip saddr map { 192.168.1.1 : 1.1.1.1, 192.168.2.2 : 2.2.2.2, 192.168.3.3 : 3.3.3.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple NAT mapping with address and port =&lt;br /&gt;
&lt;br /&gt;
You might also need to define a NAT mapping that includes the IP address and port, such as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add map nat foo { type inet_service : ipv4_addr . inet_service ; }&lt;br /&gt;
% nft add element nat foo { \&lt;br /&gt;
    1100 : 192.168.1.2 . 5061, \&lt;br /&gt;
    1101 : 192.168.1.3 . 5061, \&lt;br /&gt;
    1400 : 192.168.1.4 . 5061 \&lt;br /&gt;
}&lt;br /&gt;
% nft add rule nat pre ip protocol udp dnat ip addr . port to udp dport map @foo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your mapping does not need to be updated, you could use a anonymous map in your rule instead:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat pre ip protocol udp dnat ip addr . port to udp dport map { \&lt;br /&gt;
    1100 : 192.168.1.2 . 5061, \&lt;br /&gt;
    1101 : 192.168.1.3 . 5061, \&lt;br /&gt;
    1400 : 192.168.1.4 . 5061 \&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Performing_Network_Address_Translation_(NAT) | Performing NAT with nftables]]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Multiple_NATs_using_nftables_maps&amp;diff=986</id>
		<title>Multiple NATs using nftables maps</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Multiple_NATs_using_nftables_maps&amp;diff=986"/>
		<updated>2021-06-21T12:56:08Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Multiple NAT mapping with address and port */ missing source tag&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thanks to nftables [[Maps]], if you have a previous iptables NAT (destination NAT) ruleset like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% iptables -t nat -A PREROUTING -p tcp --dport 1000 -j DNAT --to-destination 1.1.1.1:1234&lt;br /&gt;
% iptables -t nat -A PREROUTING -p udp --dport 2000 -j DNAT --to-destination 2.2.2.2:2345&lt;br /&gt;
% iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination 3.3.3.3:3456&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be easily translated to nftables in a single line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat prerouting dnat to \&lt;br /&gt;
      tcp dport map { 1000 : 1.1.1.1, 2000 : 2.2.2.2, 3000 : 3.3.3.3} \&lt;br /&gt;
      : tcp dport map { 1000 : 1234, 2000 : 2345, 3000 : 3456 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Likewise, in iptables NAT (source NAT):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT --to-source 1.1.1.1&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.2.2 -j SNAT --to-source 2.2.2.2&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.3.3 -j SNAT --to-source 3.3.3.3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translated to a nftables one-liner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat postrouting snat to \&lt;br /&gt;
      ip saddr map { 192.168.1.1 : 1.1.1.1, 192.168.2.2 : 2.2.2.2, 192.168.3.3 : 3.3.3.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple NAT mapping with address and port =&lt;br /&gt;
&lt;br /&gt;
You might also need to define a NAT mapping that includes the IP address and port, such as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add map nat foo { type inet_service : ipv4_addr . inet_service ; }&lt;br /&gt;
% nft add element nat foo { \&lt;br /&gt;
    1100 : 192.168.1.2 . 5061, \&lt;br /&gt;
    1101 : 192.168.1.3 . 5061, \&lt;br /&gt;
    1400 : 192.168.1.4 . 5061 \&lt;br /&gt;
}&lt;br /&gt;
% nft add rule nat pre ip protocol udp dnat ip addr . port to udp dport map @foo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your mapping does not need to be updated, you could use a anonymous map in your rule instead:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat pre ip protocol udp dnat ip addr . port to udp dport map { 1100 : 192.168.1.2 . 5061, 1101 : 192.168.1.3 . 5061, 1400 : 192.168.1.4 . 5061 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Performing_Network_Address_Translation_(NAT) | Performing NAT with nftables]]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Multiple_NATs_using_nftables_maps&amp;diff=985</id>
		<title>Multiple NATs using nftables maps</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Multiple_NATs_using_nftables_maps&amp;diff=985"/>
		<updated>2021-06-21T12:55:39Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Multiple NAT mapping with address and port */ add example for anonymous map&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thanks to nftables [[Maps]], if you have a previous iptables NAT (destination NAT) ruleset like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% iptables -t nat -A PREROUTING -p tcp --dport 1000 -j DNAT --to-destination 1.1.1.1:1234&lt;br /&gt;
% iptables -t nat -A PREROUTING -p udp --dport 2000 -j DNAT --to-destination 2.2.2.2:2345&lt;br /&gt;
% iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination 3.3.3.3:3456&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be easily translated to nftables in a single line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat prerouting dnat to \&lt;br /&gt;
      tcp dport map { 1000 : 1.1.1.1, 2000 : 2.2.2.2, 3000 : 3.3.3.3} \&lt;br /&gt;
      : tcp dport map { 1000 : 1234, 2000 : 2345, 3000 : 3456 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Likewise, in iptables NAT (source NAT):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT --to-source 1.1.1.1&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.2.2 -j SNAT --to-source 2.2.2.2&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.3.3 -j SNAT --to-source 3.3.3.3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translated to a nftables one-liner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat postrouting snat to \&lt;br /&gt;
      ip saddr map { 192.168.1.1 : 1.1.1.1, 192.168.2.2 : 2.2.2.2, 192.168.3.3 : 3.3.3.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple NAT mapping with address and port =&lt;br /&gt;
&lt;br /&gt;
You might also need to define a NAT mapping that includes the IP address and port, such as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add map nat foo { type inet_service : ipv4_addr . inet_service ; }&lt;br /&gt;
% nft add element nat foo { \&lt;br /&gt;
    1100 : 192.168.1.2 . 5061, \&lt;br /&gt;
    1101 : 192.168.1.3 . 5061, \&lt;br /&gt;
    1400 : 192.168.1.4 . 5061 \&lt;br /&gt;
}&lt;br /&gt;
% nft add rule nat pre ip protocol udp dnat ip addr . port to udp dport map @foo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If your mapping does not need to be updated, you could use a anonymous map in your rule instead:&lt;br /&gt;
&lt;br /&gt;
% nft add rule nat pre ip protocol udp dnat ip addr . port to udp dport map { 1100 : 192.168.1.2 . 5061, 1101 : 192.168.1.3 . 5061, 1400 : 192.168.1.4 . 5061 }&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Performing_Network_Address_Translation_(NAT) | Performing NAT with nftables]]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Multiple_NATs_using_nftables_maps&amp;diff=984</id>
		<title>Multiple NATs using nftables maps</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Multiple_NATs_using_nftables_maps&amp;diff=984"/>
		<updated>2021-06-21T12:43:37Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* multiple NAT mapping with address and port */ minor comestic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thanks to nftables [[Maps]], if you have a previous iptables NAT (destination NAT) ruleset like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% iptables -t nat -A PREROUTING -p tcp --dport 1000 -j DNAT --to-destination 1.1.1.1:1234&lt;br /&gt;
% iptables -t nat -A PREROUTING -p udp --dport 2000 -j DNAT --to-destination 2.2.2.2:2345&lt;br /&gt;
% iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination 3.3.3.3:3456&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be easily translated to nftables in a single line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat prerouting dnat to \&lt;br /&gt;
      tcp dport map { 1000 : 1.1.1.1, 2000 : 2.2.2.2, 3000 : 3.3.3.3} \&lt;br /&gt;
      : tcp dport map { 1000 : 1234, 2000 : 2345, 3000 : 3456 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Likewise, in iptables NAT (source NAT):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT --to-source 1.1.1.1&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.2.2 -j SNAT --to-source 2.2.2.2&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.3.3 -j SNAT --to-source 3.3.3.3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translated to a nftables one-liner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat postrouting snat to \&lt;br /&gt;
      ip saddr map { 192.168.1.1 : 1.1.1.1, 192.168.2.2 : 2.2.2.2, 192.168.3.3 : 3.3.3.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Multiple NAT mapping with address and port =&lt;br /&gt;
&lt;br /&gt;
You might also need to define a NAT mapping that includes the IP address and port, such as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add map nat foo { type inet_service : ipv4_addr . inet_service ; }&lt;br /&gt;
% nft add element nat foo { \&lt;br /&gt;
    1100 : 192.168.1.2 . 5061, \&lt;br /&gt;
    1101 : 192.168.1.3 . 5061, \&lt;br /&gt;
    1400 : 192.168.1.4 . 5061 \&lt;br /&gt;
}&lt;br /&gt;
% nft add rule nat pre ip protocol udp dnat ip addr . port to udp dport map @foo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Performing_Network_Address_Translation_(NAT) | Performing NAT with nftables]]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Multiple_NATs_using_nftables_maps&amp;diff=983</id>
		<title>Multiple NATs using nftables maps</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Multiple_NATs_using_nftables_maps&amp;diff=983"/>
		<updated>2021-06-21T12:42:09Z</updated>

		<summary type="html">&lt;p&gt;Pablo: multiple NAT mapping with address and port&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thanks to nftables [[Maps]], if you have a previous iptables NAT (destination NAT) ruleset like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% iptables -t nat -A PREROUTING -p tcp --dport 1000 -j DNAT --to-destination 1.1.1.1:1234&lt;br /&gt;
% iptables -t nat -A PREROUTING -p udp --dport 2000 -j DNAT --to-destination 2.2.2.2:2345&lt;br /&gt;
% iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to-destination 3.3.3.3:3456&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be easily translated to nftables in a single line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat prerouting dnat to \&lt;br /&gt;
      tcp dport map { 1000 : 1.1.1.1, 2000 : 2.2.2.2, 3000 : 3.3.3.3} \&lt;br /&gt;
      : tcp dport map { 1000 : 1234, 2000 : 2345, 3000 : 3456 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Likewise, in iptables NAT (source NAT):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT --to-source 1.1.1.1&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.2.2 -j SNAT --to-source 2.2.2.2&lt;br /&gt;
% iptables -t nat -A POSTROUTING -s 192.168.3.3 -j SNAT --to-source 3.3.3.3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translated to a nftables one-liner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule nat postrouting snat to \&lt;br /&gt;
      ip saddr map { 192.168.1.1 : 1.1.1.1, 192.168.2.2 : 2.2.2.2, 192.168.3.3 : 3.3.3.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= multiple NAT mapping with address and port =&lt;br /&gt;
&lt;br /&gt;
You might also need to define a NAT mapping that includes the IP address and port mapping, such as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add map nat foo { type inet_service : ipv4_addr . inet_service ; }&lt;br /&gt;
% nft add element nat foo { \&lt;br /&gt;
    1100 : 192.168.1.2 . 5061, \&lt;br /&gt;
    1101 : 192.168.1.3 . 5061, \&lt;br /&gt;
    1400 : 192.168.1.4 . 5061 \&lt;br /&gt;
}&lt;br /&gt;
% nft add rule nat pre ip protocol udp dnat ip addr . port to udp dport map @foo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Performing_Network_Address_Translation_(NAT) | Performing NAT with nftables]]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Main_Page&amp;diff=982</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Main_Page&amp;diff=982"/>
		<updated>2021-06-12T20:07:39Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the &#039;&#039;nftables&#039;&#039; HOWTO documentation page. Here you will find documentation on how to build, install, configure and use nftables.&lt;br /&gt;
&lt;br /&gt;
If you have any suggestion to improve it, please send your comments to Netfilter users mailing list &amp;lt;netfilter@vger.kernel.org&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= [[News]] =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
* [[What is nftables?]]&lt;br /&gt;
* [[How to obtain help/support]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reference =&lt;br /&gt;
* [https://www.netfilter.org/projects/nftables/manpage.html man nft - netfilter website]&lt;br /&gt;
* [https://www.mankier.com/8/nft man nft - mankier.com]&lt;br /&gt;
* [[Quick reference-nftables in 10 minutes|Quick reference, nftables in 10 minutes]]&lt;br /&gt;
* [[Netfilter hooks]] and nftables integration with existing Netfilter components&lt;br /&gt;
* [[nftables families|Understanding nftables families]]&lt;br /&gt;
* [[Data_types|Data types]]&lt;br /&gt;
* [[Connection_Tracking_System|Connection tracking system (conntrack)]], used for stateful firewalling and NAT&lt;br /&gt;
* [[Troubleshooting|Troubleshooting and FAQ]]&lt;br /&gt;
* [[Further_documentation|Additional documentation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Installing nftables =&lt;br /&gt;
* [[nftables from distributions|Using nftables from distributions]]&lt;br /&gt;
* [[Building and installing nftables from sources]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Upgrading from xtables to nftables =&lt;br /&gt;
* [[Legacy xtables tools]]&lt;br /&gt;
* [[Moving from iptables to nftables]]&lt;br /&gt;
* [[Moving from ipset to nftables]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Basic operation =&lt;br /&gt;
* [[Configuring tables]]&lt;br /&gt;
* [[Configuring chains]]&lt;br /&gt;
* [[Simple rule management]]&lt;br /&gt;
* [[Atomic rule replacement]]&lt;br /&gt;
* [[Error reporting from the command line]]&lt;br /&gt;
* [[Building rules through expressions]]&lt;br /&gt;
* [[Operations at ruleset level]]&lt;br /&gt;
* [[Monitoring ruleset updates]]&lt;br /&gt;
* [[Scripting]]&lt;br /&gt;
* [[Ruleset debug/tracing]]&lt;br /&gt;
* [[Output text modifiers]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Expressions: Matching packets =&lt;br /&gt;
* [[Matching packet metainformation]]&lt;br /&gt;
* [[Matching packet headers]]&lt;br /&gt;
* [[Matching connection tracking stateful metainformation]]&lt;br /&gt;
* [[Matching routing information]]&lt;br /&gt;
* [[Rate limiting matchings]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Statements: Acting on packet matches =&lt;br /&gt;
* [[Accepting and dropping packets]]&lt;br /&gt;
* [[Rejecting traffic]]&lt;br /&gt;
* [[Jumping to chain]]&lt;br /&gt;
* [[Counters]]&lt;br /&gt;
* [[Logging traffic]]&lt;br /&gt;
* [[Performing Network Address Translation (NAT)]]&lt;br /&gt;
* [[Setting packet metainformation]]&lt;br /&gt;
* [[Setting packet connection tracking metainformation]]&lt;br /&gt;
* [[Mangling packet headers]] (including stateless NAT)&lt;br /&gt;
* [[Duplicating packets]]&lt;br /&gt;
* [[Load balancing]]&lt;br /&gt;
* [[Queueing to userspace]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Advanced data structures for performance packet classification =&lt;br /&gt;
* [[Intervals]]&lt;br /&gt;
* [[Concatenations]]&lt;br /&gt;
* [[Math operations]]&lt;br /&gt;
* [[Stateful objects]]&lt;br /&gt;
** [[Counters]]&lt;br /&gt;
** [[Quotas]]&lt;br /&gt;
** [[Limits]]&lt;br /&gt;
** [[Connlimits]] (&#039;&#039;ct count&#039;&#039;)&lt;br /&gt;
* Other objects&lt;br /&gt;
** [[Conntrack helpers]] (&#039;&#039;ct helper&#039;&#039;, Layer 7 ALG)&lt;br /&gt;
** [[Ct_timeout|Conntrack timeout policies]] (&#039;&#039;ct timeout&#039;&#039;)&lt;br /&gt;
** [[Ct_expectation|Conntrack expectations]] (&#039;&#039;ct expectation&#039;&#039;)&lt;br /&gt;
** [[Synproxy]]&lt;br /&gt;
** [[Secmark|Secmarks]]&lt;br /&gt;
* Generic set infrastructure&lt;br /&gt;
** [[Sets]]&lt;br /&gt;
** [[Element timeouts]]&lt;br /&gt;
** [[Updating sets from the packet path]]&lt;br /&gt;
** [[Maps]]&lt;br /&gt;
** [[Verdict_Maps_(vmaps) | Verdict maps]]&lt;br /&gt;
** [[Meters|Metering]] (formerly known as flow tables before nftables 0.8.1)&lt;br /&gt;
* [[Flowtables]] (the fastpath network stack bypass)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
* [[Simple ruleset for a workstation]]&lt;br /&gt;
* [[Simple ruleset for a server]]&lt;br /&gt;
* [[Simple ruleset for a router]]&lt;br /&gt;
* [[Bridge filtering]]&lt;br /&gt;
* [[Multiple NATs using nftables maps]]&lt;br /&gt;
* [[Classic perimetral firewall example]]&lt;br /&gt;
* [[Port knocking example]]&lt;br /&gt;
* [[Classification to tc structure example]]&lt;br /&gt;
* [[Using configuration management systems]] (like puppet, ansible, etc)&lt;br /&gt;
* [[GeoIP matching]]&lt;br /&gt;
&lt;br /&gt;
= Development =&lt;br /&gt;
&lt;br /&gt;
Check [[Portal:DeveloperDocs|Portal:DeveloperDocs - documentation for netfilter developers]].&lt;br /&gt;
&lt;br /&gt;
Some hints on the general development progress:&lt;br /&gt;
&lt;br /&gt;
* [[List of updates since Linux kernel 3.13]]&lt;br /&gt;
* [[List of updates in the nft command line tool]]&lt;br /&gt;
* [[Supported features compared to xtables|Supported features compared to {ip,ip6,eb,arp}tables]]&lt;br /&gt;
* [[List of available translations via iptables-translate tool]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= External links =&lt;br /&gt;
&lt;br /&gt;
Watch some videos:&lt;br /&gt;
&lt;br /&gt;
* Watch [https://www.youtube.com/watch?v=FXTRRwXi3b4 Getting a grasp of nftables], thanks to [https://www.nluug.nl/index-en.html NLUUG association] for recording this.&lt;br /&gt;
* Watch [https://www.youtube.com/watch?v=CaYp0d2wiuU#t=1m47s The ultimate packet classifier for GNU/Linux], thanks to the FSFE for paying my trip to Barcelona and for recommending me as speaker to the KDE Spanish branch.&lt;br /&gt;
* [https://www.youtube.com/watch?v=Sy0JDX451ns Florian Westphal - Why nftables?]&lt;br /&gt;
* Watch [https://www.youtube.com/watch?v=0wQfSfDVN94 NLUUG - Goodbye iptables, Hello nftables]&lt;br /&gt;
* Watch [https://www.youtube.com/watch?v=Uf5ULkEWPL0 LCA2018 - nftables from a user perspective]&lt;br /&gt;
&lt;br /&gt;
Watch videos to track updates:&lt;br /&gt;
&lt;br /&gt;
* Watch [https://www.youtube.com/watch?v=qXVOA2MKA1s Netdev 2.1 - Netfilter mini-workshop (2017)]&lt;br /&gt;
* Watch [https://youtu.be/iCj10vEKPrw Netdev 2.2 - Netf‌ilter mini-workshop (2018)]&lt;br /&gt;
* Watch [https://youtu.be/0hqfzp6tpZo Netdev 0x12 - Netf‌ilter mini-workshop (2019)]&lt;br /&gt;
* Watch [https://www.youtube.com/watch?v=GqGGo4svj7s&amp;amp;feature=youtu.be Netdev 0x14 - Netfilter mini-Workshop (2020)] &lt;br /&gt;
&lt;br /&gt;
Additional documentations and articles:&lt;br /&gt;
&lt;br /&gt;
* Tutorial [https://zasdfgbnm.github.io/2017/09/07/Extending-nftables/ Extending nftables by Xiang Gao]&lt;br /&gt;
* Article [http://ral-arturo.org/2017/05/05/debian-stretch-stable-nftables.html New in Debian stable Stretch: nftables]&lt;br /&gt;
* Article [https://ral-arturo.org/2020/11/22/python-nftables-tutorial.html How to use nftables from python] and git repository [https://github.com/aborrero/python-nftables-tutorial python-nftables-tutorial.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Thanks =&lt;br /&gt;
&lt;br /&gt;
To the NLnet foundation for initial sponsorship of this HOWTO:&lt;br /&gt;
&lt;br /&gt;
[https://nlnet.nl https://nlnet.nl/image/logo.gif]&lt;br /&gt;
&lt;br /&gt;
To Eric Leblond, for boostrapping the [https://home.regit.org/netfilter-en/nftables-quick-howto/ Nftables quick howto] in 2013.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=977</id>
		<title>Flowtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Flowtables&amp;diff=977"/>
		<updated>2021-05-27T18:39:22Z</updated>

		<summary type="html">&lt;p&gt;Pablo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;NOTE&#039;&#039;&#039;: [[Meters]] were formerly known as flowtables before nftables 0.8.1 release. Now they are 2 separated, unrelated things.&lt;br /&gt;
&lt;br /&gt;
Flowtables allow you to accelerate packet forwarding in software (and in hardware if your NIC supports it) by using a conntrack-based network stack bypass.&lt;br /&gt;
&lt;br /&gt;
Entries are represented through a tuple that is composed of the input interface, source and destination address, source and destination port; and layer 3/4&lt;br /&gt;
protocols. Each entry also caches the destination interface and the gateway address (to update the destination link-layer address) to forward packets.&lt;br /&gt;
&lt;br /&gt;
The TTL and hoplimit fields are also decremented. Hence, flowtables provides an alternative path that allow packets to bypass the classic forwarding path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                         userspace process&lt;br /&gt;
                                          ^              |&lt;br /&gt;
                                          |              |&lt;br /&gt;
                                     _____|____     ____\/___&lt;br /&gt;
                                    /          \   /         \&lt;br /&gt;
                                    |   input  |   |  output |&lt;br /&gt;
                                    \__________/   \_________/&lt;br /&gt;
                                         ^               |&lt;br /&gt;
                                         |               |&lt;br /&gt;
      _________      __________      ---------     _____\/_____&lt;br /&gt;
     /         \    /          \     |Routing |   /            \&lt;br /&gt;
  --&amp;gt;  ingress  ---&amp;gt; prerouting ---&amp;gt; |decision|   | postrouting|--&amp;gt; neigh_xmit&lt;br /&gt;
     \_________/    \__________/     ----------   \____________/          ^&lt;br /&gt;
       |      ^                          |               ^                |&lt;br /&gt;
   flowtable  |                     ____\/___            |                |&lt;br /&gt;
       |      |                    /         \           |                |&lt;br /&gt;
    __\/___   |                    | forward |------------                |&lt;br /&gt;
    |-----|   |                    \_________/                            |&lt;br /&gt;
    |-----|   |                 &#039;flow offload&#039; rule                       |&lt;br /&gt;
    |-----|   |                   adds entry to                           |&lt;br /&gt;
    |_____|   |                     flowtable                             |&lt;br /&gt;
       |      |                                                           |&lt;br /&gt;
      / \     |                                                           |&lt;br /&gt;
     /hit\_no_|                                                           |&lt;br /&gt;
     \ ? /                                                                |&lt;br /&gt;
      \ /                                                                 |&lt;br /&gt;
       |__yes_________________fastpath bypass ____________________________|&lt;br /&gt;
&lt;br /&gt;
               Fig.1 Netfilter hooks and flowtable interactions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Flowtables reside in the ingress hook that is located before the prerouting hook. You can select which flows you want to offload through the flow expression from the forward chain. Flowtables are identified by their address [[Nftables_families|family]] and their name. The address family must be one of ip, ip6, or inet. When no address family is specified, ip is used by default.&lt;br /&gt;
&lt;br /&gt;
Flows are offloaded after the state is created. A firewall rule to accept the initial traffic is required.&lt;br /&gt;
The flow expression on the forward chain must match the return traffic of the initial connection.&lt;br /&gt;
&lt;br /&gt;
The *priority* can be a signed integer or *filter* which stands for 0. Addition and subtraction can be used to set relative priority, e.g. filter + 5 equals to 5.&lt;br /&gt;
&lt;br /&gt;
The *devices* are specified as [[Data_types|iifname]](s) of the input interface(s) of the traffic that should be offloaded. Devices are required for both traffic directions.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet x {&lt;br /&gt;
&lt;br /&gt;
    flowtable f {&lt;br /&gt;
        hook ingress priority 0 devices = { eth0, eth1 };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    chain forward {&lt;br /&gt;
        type filter hook forward priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # offload established connections&lt;br /&gt;
        ip protocol { tcp, udp } flow offload @f&lt;br /&gt;
        ip6 nexthdr { tcp, udp } flow offload @f&lt;br /&gt;
        counter packets 0 bytes 0&lt;br /&gt;
&lt;br /&gt;
        # established/related connections&lt;br /&gt;
        ct state established,related counter accept&lt;br /&gt;
&lt;br /&gt;
        # allow initial connection&lt;br /&gt;
        ip protocol { tcp, udp } accept&lt;br /&gt;
        ip6 nexthdr { tcp, udp } accept&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.kernel.org/doc/html/latest/networking/nf_flowtable.html Linux kernel documentation on Netfilter flowtable]&lt;br /&gt;
* [https://netdevconf.info/0x13/session.html?workshop-netfilter-mini Netfilter Mini-Workshop, Netdev 0x13, 2019-03]&lt;br /&gt;
* [https://lwn.net/Articles/804384/ Mellanox flowtable hardware offload]&lt;br /&gt;
* [https://www.programmersought.com/article/11833283913/ Some Mellanox flowtable hardware offload performance measurements by Wen Xu of UCloud]&lt;br /&gt;
* [https://linuxplumbersconf.org/event/4/contributions/463/ Netfilter hardware offloads, Pablo Neira Ayuso, Linux Plumbers Conference, 2019-09]&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Mangling_packet_headers&amp;diff=973</id>
		<title>Mangling packet headers</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Mangling_packet_headers&amp;diff=973"/>
		<updated>2021-05-03T21:27:30Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Mangling TCP options */ remove oifname pppoe0, see note regarding mangling TCP MSS option&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since nft v0.6 nftables supports packet header mangling, including stateless NAT.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: if you mangle packet fields that are included in the [https://en.wikipedia.org/wiki/User_Datagram_Protocol#IPv4_Pseudo_Header layer 4 checksum pseudoheader], then you require a Linux kernel version &amp;gt;= 4.10.&lt;br /&gt;
&lt;br /&gt;
To mangle packet header fields you should create a rule to match the packet, match the desired header field and set a new value to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add table raw&lt;br /&gt;
% nft add chain raw prerouting {type filter hook prerouting priority -300\;}&lt;br /&gt;
% nft add rule raw prerouting tcp dport 8080 tcp dport set 80&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The commands above create a table named &#039;&#039;raw&#039;&#039;, a chain named &#039;&#039;prerouting&#039;&#039;, see [[Netfilter hooks]], and a rule to mangle the destination port of packets over TCP from 8080 to 80.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mangling TCP options ==&lt;br /&gt;
&lt;br /&gt;
Since Linux kernel 4.14 and nftables 0.9, you can clamp your TCP MSS to Path MTU. This is very convenient in case your router encapsulates traffic over PPPoE, which is what many DSL (and some FTTH) providers do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nft add rule ip filter forward tcp flags syn tcp option maxseg size set rt mtu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;&#039;rt mtu&#039;&#039;&#039; calculates the MTU in runtime based on what the routing cache has observed via Path MTU Discovery (PMTUD).&lt;br /&gt;
&lt;br /&gt;
Note: The TCP maximum segment size is announced through TCP options in the original syn and the reply syn+ack packets. TCP maximum segment size is not negotiated, the RFC specifies that it is possible to have different TCP maximum segment size in each direction of the flow. Therefore, make sure you mangle both the TCP options of the original syn and the reply syn+ack packets.&lt;br /&gt;
&lt;br /&gt;
Note for iptables users: &#039;tcp option maxseg size set rt mtu&#039; is equivalent to &#039;-j TCPMSS --clamp-mss-to-pmtu&#039;.&lt;br /&gt;
&lt;br /&gt;
You can also manually set to fixed value, eg. PPPoE takes 8 bytes to encapsulate packets, therefore, assuming MTU of 1500 bytes, 1500 - 20 (IPv4 Header) - 20 (TCP header) - 8 (PPPoE header) = 1452 bytes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nft add rule ip filter forward tcp flags syn tcp option maxseg size set 1452&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other supported TCP options are: window, sack-permitted, sack, timestamp and eol.&lt;br /&gt;
&lt;br /&gt;
== Interactions with conntrack ==&lt;br /&gt;
&lt;br /&gt;
Keep in mind the interactions with conntrack, flows with mangled traffic must be [[Setting packet connection tracking metainformation | untracked]]. You can do this in a single rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft add rule ip6 raw prerouting ip6 daddr fd00::1 ip6 daddr set fd00::2 notrack&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information about packet headers to mangle check manpage nft(8), [[Matching packet headers]] and [[Quick reference-nftables in 10 minutes]].&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Mangling_packet_headers&amp;diff=972</id>
		<title>Mangling packet headers</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Mangling_packet_headers&amp;diff=972"/>
		<updated>2021-05-03T21:26:20Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Mangling TCP options */ fix example rule regarding TCP MSS mangling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since nft v0.6 nftables supports packet header mangling, including stateless NAT.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: if you mangle packet fields that are included in the [https://en.wikipedia.org/wiki/User_Datagram_Protocol#IPv4_Pseudo_Header layer 4 checksum pseudoheader], then you require a Linux kernel version &amp;gt;= 4.10.&lt;br /&gt;
&lt;br /&gt;
To mangle packet header fields you should create a rule to match the packet, match the desired header field and set a new value to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add table raw&lt;br /&gt;
% nft add chain raw prerouting {type filter hook prerouting priority -300\;}&lt;br /&gt;
% nft add rule raw prerouting tcp dport 8080 tcp dport set 80&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The commands above create a table named &#039;&#039;raw&#039;&#039;, a chain named &#039;&#039;prerouting&#039;&#039;, see [[Netfilter hooks]], and a rule to mangle the destination port of packets over TCP from 8080 to 80.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mangling TCP options ==&lt;br /&gt;
&lt;br /&gt;
Since Linux kernel 4.14 and nftables 0.9, you can clamp your TCP MSS to Path MTU. This is very convenient in case your router encapsulates traffic over PPPoE, which is what many DSL (and some FTTH) providers do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nft add rule ip filter forward tcp flags syn tcp option maxseg size set rt mtu&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;&#039;rt mtu&#039;&#039;&#039; calculates the MTU in runtime based on what the routing cache has observed via Path MTU Discovery (PMTUD).&lt;br /&gt;
&lt;br /&gt;
Note: The TCP maximum segment size is announced through TCP options in the original syn and the reply syn+ack packets. TCP maximum segment size is not negotiated, the RFC specifies that it is possible to have different TCP maximum segment size in each direction of the flow. Therefore, make sure you mangle both the TCP options of the original syn and the reply syn+ack packets.&lt;br /&gt;
&lt;br /&gt;
Note for iptables users: &#039;tcp option maxseg size set rt mtu&#039; is equivalent to &#039;-j TCPMSS --clamp-mss-to-pmtu&#039;.&lt;br /&gt;
&lt;br /&gt;
You can also manually set to fixed value, eg. PPPoE takes 8 bytes to encapsulate packets, therefore, assuming MTU of 1500 bytes, 1500 - 20 (IPv4 Header) - 20 (TCP header) - 8 (PPPoE header) = 1452 bytes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nft add rule ip filter forward oifname ppp0 tcp flags syn tcp option maxseg size set 1452&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other supported TCP options are: window, sack-permitted, sack, timestamp and eol.&lt;br /&gt;
&lt;br /&gt;
== Interactions with conntrack ==&lt;br /&gt;
&lt;br /&gt;
Keep in mind the interactions with conntrack, flows with mangled traffic must be [[Setting packet connection tracking metainformation | untracked]]. You can do this in a single rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft add rule ip6 raw prerouting ip6 daddr fd00::1 ip6 daddr set fd00::2 notrack&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information about packet headers to mangle check manpage nft(8), [[Matching packet headers]] and [[Quick reference-nftables in 10 minutes]].&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Netfilter_hooks&amp;diff=656</id>
		<title>Netfilter hooks</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Netfilter_hooks&amp;diff=656"/>
		<updated>2021-02-08T02:09:57Z</updated>

		<summary type="html">&lt;p&gt;Pablo: add schematic to represent hooks (contributed by Francisco Javier Rodríguez López)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you are familiar with Netfilter, don&#039;t worry, most of the infrastructure remains the same. &#039;&#039;nftables&#039;&#039; reuses the existing hook infrastructure, [http://people.netfilter.org/pablo/docs/login.pdf Connection Tracking System], NAT engine, logging infrastructure, userspace queueing and so on. Therefore, &#039;&#039;&#039;we have only replaced the packet classification framework&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
For those unfamiliar with Netfilter, we provide the following schematic for the packet flow paths through Linux networking:&lt;br /&gt;
&lt;br /&gt;
https://people.netfilter.org/pablo/nf-hooks.png&lt;br /&gt;
&lt;br /&gt;
Basically, traffic flowing to the local machine in the input path see the prerouting and input hooks. Then, the traffic that is generated by local processes follows the output and postrouting path.&lt;br /&gt;
&lt;br /&gt;
If you configure your Linux box to behave as router, do not forget to enable forwarding via:&lt;br /&gt;
&lt;br /&gt;
 echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
&lt;br /&gt;
And then, the packets that are not addressed to your local system will be seen from the forward hook. In summary, packets that are not addressed to local processes follow this path: prerouting, forward and postrouting.&lt;br /&gt;
&lt;br /&gt;
= Ingress hook =&lt;br /&gt;
&lt;br /&gt;
Since Linux kernel 4.2, Netfilter also comes with an ingress hook that you can use from nftables. So the big picture now look like this:&lt;br /&gt;
                                                          &lt;br /&gt;
                                  .-----------.             &lt;br /&gt;
                                  |           |-----&amp;gt; input ...&lt;br /&gt;
 ---&amp;gt; ingress ---&amp;gt; prerouting ---&amp;gt;|  Routing  |&lt;br /&gt;
                                  | Decision  |&lt;br /&gt;
                                  |           |&lt;br /&gt;
                                  |           |-----&amp;gt; forward ...&lt;br /&gt;
                                  .-----------.&lt;br /&gt;
&lt;br /&gt;
You can use this new ingress hook to filter traffic from Layer 2. This new hook comes before prerouting, so this allows you to enforce very early filtering policies. This new hook basically provides an alternative to &#039;&#039;&#039;tc&#039;&#039;&#039; ingress filtering. You still need tc for traffic shaping/queue management.&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=613</id>
		<title>Quick reference-nftables in 10 minutes</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=613"/>
		<updated>2021-01-15T22:29:10Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Ct */ still use ip prefix for ct [original | reply] ip daddr&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Find below some basic concepts to know before using nftables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;table&#039;&#039;&#039; refers to a container of [[Configuring chains|chains]] with no specific semantics.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;chain&#039;&#039;&#039; within a [[Configuring tables|table]] refers to a container of [[Simple rule management|rules]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rule&#039;&#039;&#039; refers to an action to be configured within a &#039;&#039;chain&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= nft command line =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;nft&#039;&#039; is the command line tool in order to interact with nftables at userspace.&lt;br /&gt;
&lt;br /&gt;
== Tables ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;family&#039;&#039;&#039; refers to a one of the following table types: &#039;&#039;ip&#039;&#039;, &#039;&#039;arp&#039;&#039;, &#039;&#039;ip6&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;inet&#039;&#039;, &#039;&#039;netdev&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list tables [&amp;lt;family&amp;gt;]&lt;br /&gt;
% nft list table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt; [-n] [-a]&lt;br /&gt;
% nft (add | delete | flush) table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The argument &#039;&#039;-n&#039;&#039; shows the addresses and other information that uses names in numeric format. The &#039;&#039;-a&#039;&#039; argument is used to display the &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Chains ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;type&#039;&#039;&#039; refers to the kind of chain to be created. Possible types are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;filter&#039;&#039;: Supported by &#039;&#039;arp&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; table families.&lt;br /&gt;
* &#039;&#039;route&#039;&#039;: Mark packets (like mangle for the &#039;&#039;output&#039;&#039; hook, for other hooks use the type &#039;&#039;filter&#039;&#039; instead), supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
* &#039;&#039;nat&#039;&#039;: In order to perform Network Address Translation, supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hook&#039;&#039;&#039; refers to an specific stage of the packet while it&#039;s being processed through the kernel. More info in [[Netfilter_hooks|Netfilter hooks]].&lt;br /&gt;
&lt;br /&gt;
* The hooks for &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; families are: &#039;&#039;prerouting&#039;&#039;, &#039;&#039;input&#039;&#039;, &#039;&#039;forward&#039;&#039;, &#039;&#039;output&#039;&#039;, &#039;&#039;postrouting&#039;&#039;.&lt;br /&gt;
* The hooks for &#039;&#039;arp&#039;&#039; family are: &#039;&#039; input&#039;&#039;, &#039;&#039;output&#039;&#039;.&lt;br /&gt;
* The &#039;&#039;bridge&#039;&#039; family handles ethernet packets traversing bridge devices.&lt;br /&gt;
* The hook for &#039;&#039;netdev&#039;&#039; is: &#039;&#039;ingress&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;priority&#039;&#039;&#039; refers to a number used to order the chains or to set them between some Netfilter operations. Possible values are: &#039;&#039;NF_IP_PRI_CONNTRACK_DEFRAG (-400)&#039;&#039;, &#039;&#039;NF_IP_PRI_RAW (-300)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_FIRST (-225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK (-200)&#039;&#039;, &#039;&#039;NF_IP_PRI_MANGLE (-150)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_DST (-100)&#039;&#039;, &#039;&#039;NF_IP_PRI_FILTER (0)&#039;&#039;, &#039;&#039;NF_IP_PRI_SECURITY (50)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_SRC (100)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_LAST (225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK_HELPER (300)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;policy&#039;&#039;&#039; is the default verdict statement to control the flow in the chain. Possible values are: &#039;&#039;accept&#039;&#039;, &#039;&#039;drop&#039;&#039;, &#039;&#039;queue&#039;&#039;, &#039;&#039;continue&#039;&#039;, &#039;&#039;return&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ { type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy &amp;lt;policy&amp;gt; \;] } ]&lt;br /&gt;
% nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
% nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;handle&#039;&#039;&#039; is an internal number that identifies a certain &#039;&#039;rule&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;position&#039;&#039;&#039; is an internal number that is used to insert a &#039;&#039;rule&#039;&#039; before a certain &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft insert rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [position &amp;lt;position&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft replace rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft delete rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matches ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;matches&#039;&#039;&#039; are clues used to access to certain packet information and create filters according to them.&lt;br /&gt;
&lt;br /&gt;
==== Ip ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip match&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip dscp cs1&lt;br /&gt;
ip dscp != cs1&lt;br /&gt;
ip dscp 0x38&lt;br /&gt;
ip dscp != 0x20&lt;br /&gt;
ip dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, &lt;br /&gt;
af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip length 232&lt;br /&gt;
ip length != 233&lt;br /&gt;
ip length 333-435&lt;br /&gt;
ip length != 333-453&lt;br /&gt;
ip length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;id&amp;gt;&#039;&#039;&lt;br /&gt;
| IP ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip id 22&lt;br /&gt;
ip id != 233&lt;br /&gt;
ip id 33-45&lt;br /&gt;
ip id != 33-45&lt;br /&gt;
ip id { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Fragmentation offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip frag-off 222&lt;br /&gt;
ip frag-off != 233&lt;br /&gt;
ip frag-off 33-45&lt;br /&gt;
ip frag-off != 33-45&lt;br /&gt;
ip frag-off { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ttl &amp;lt;ttl&amp;gt;&#039;&#039;&lt;br /&gt;
| Time to live&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip ttl 0&lt;br /&gt;
ip ttl 233&lt;br /&gt;
ip ttl 33-55&lt;br /&gt;
ip ttl != 45-50&lt;br /&gt;
ip ttl { 43, 53, 45 }&lt;br /&gt;
ip ttl { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Upper layer protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip protocol tcp&lt;br /&gt;
ip protocol 6&lt;br /&gt;
ip protocol != tcp&lt;br /&gt;
ip protocol { icmp, esp, ah, comp, udp, udplite, tcp, dccp, sctp }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip checksum 13172&lt;br /&gt;
ip checksum 22&lt;br /&gt;
ip checksum != 233&lt;br /&gt;
ip checksum 33-45&lt;br /&gt;
ip checksum != 33-45&lt;br /&gt;
ip checksum { 33, 55, 67, 88 }&lt;br /&gt;
ip checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip saddr 192.168.2.0/24&lt;br /&gt;
ip saddr != 192.168.2.0/24&lt;br /&gt;
ip saddr 192.168.3.1 ip daddr 192.168.3.100&lt;br /&gt;
ip saddr != 1.1.1.1&lt;br /&gt;
ip saddr 1.1.1.1&lt;br /&gt;
ip saddr &amp;amp; 0xff == 1&lt;br /&gt;
ip saddr &amp;amp; 0.0.0.255 &amp;lt; 0.0.0.127&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip daddr 192.168.0.1&lt;br /&gt;
ip daddr != 192.168.0.1&lt;br /&gt;
ip daddr 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr 10.0.0.0-10.255.255.255&lt;br /&gt;
ip daddr 172.16.0.0-172.31.255.255&lt;br /&gt;
ip daddr 192.168.3.1-192.168.4.250&lt;br /&gt;
ip daddr != 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr { 192.168.0.1-192.168.0.250 }&lt;br /&gt;
ip daddr { 192.168.5.1, 192.168.5.2, 192.168.5.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| Ip Header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip version 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;header length&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip hdrlength 0&lt;br /&gt;
ip hdrlength 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ip6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 dscp cs1&lt;br /&gt;
ip6 dscp != cs1&lt;br /&gt;
ip6 dscp 0x38&lt;br /&gt;
ip6 dscp != 0x20&lt;br /&gt;
ip6 dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flowlabel &amp;lt;label&amp;gt;&#039;&#039;&lt;br /&gt;
| Flow label&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 flowlabel 22&lt;br /&gt;
ip6 flowlabel != 233&lt;br /&gt;
ip6 flowlabel { 33, 55, 67, 88 }&lt;br /&gt;
ip6 flowlabel { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 length 232&lt;br /&gt;
ip6 length != 233&lt;br /&gt;
ip6 length 333-435&lt;br /&gt;
ip6 length != 333-453&lt;br /&gt;
ip6 length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;header&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header type (Upper layer protocol number)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 nexthdr {esp, udp, ah, comp, udplite, tcp, dccp, sctp, icmpv6}&lt;br /&gt;
ip6 nexthdr esp&lt;br /&gt;
ip6 nexthdr != esp&lt;br /&gt;
ip6 nexthdr { 33-44 }&lt;br /&gt;
ip6 nexthdr 33-44&lt;br /&gt;
ip6 nexthdr != 33-44&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hoplimit &amp;lt;hoplimit&amp;gt;&#039;&#039;&lt;br /&gt;
| Hop limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 hoplimit 1&lt;br /&gt;
ip6 hoplimit != 233&lt;br /&gt;
ip6 hoplimit 33-45&lt;br /&gt;
ip6 hoplimit != 33-45&lt;br /&gt;
ip6 hoplimit {33, 55, 67, 88}&lt;br /&gt;
ip6 hoplimit {33-55}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 saddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::/64&lt;br /&gt;
ip6 saddr ::1 ip6 daddr ::2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 daddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 daddr != ::1234:1234:1234:1234:1234:1234:1234-1234:1234::1234:1234:1234:1234:1234&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 version 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Tcp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|tcp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp dport 22&lt;br /&gt;
tcp dport != 33-45&lt;br /&gt;
tcp dport { 33-55 }&lt;br /&gt;
tcp dport {telnet, http, https }&lt;br /&gt;
tcp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
tcp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sport 22&lt;br /&gt;
tcp sport != 33-45&lt;br /&gt;
tcp sport { 33, 55, 67, 88}&lt;br /&gt;
tcp sport { 33-55}&lt;br /&gt;
tcp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
tcp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sequence 22&lt;br /&gt;
tcp sequence != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ackseq &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Acknowledgement number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp ackseq 22&lt;br /&gt;
tcp ackseq != 33-45&lt;br /&gt;
tcp ackseq { 33, 55, 67, 88 }&lt;br /&gt;
tcp ackseq { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| TCP flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp flags { fin, syn, rst, psh, ack, urg, ecn, cwr}&lt;br /&gt;
tcp flags cwr&lt;br /&gt;
tcp flags != cwr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;window &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Window&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp window 22&lt;br /&gt;
tcp window != 33-45&lt;br /&gt;
tcp window { 33, 55, 67, 88 }&lt;br /&gt;
tcp window { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp checksum 22&lt;br /&gt;
tcp checksum != 33-45&lt;br /&gt;
tcp checksum { 33, 55, 67, 88 }&lt;br /&gt;
tcp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;urgptr &amp;lt;pointer&amp;gt;&#039;&#039;&lt;br /&gt;
| Urgent pointer&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp urgptr 22&lt;br /&gt;
tcp urgptr != 33-45&lt;br /&gt;
tcp urgptr { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;doff &amp;lt;offset&amp;gt;&#039;&#039;&lt;br /&gt;
| Data offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp doff 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp dport 22&lt;br /&gt;
udp dport != 33-45&lt;br /&gt;
udp dport { 33-55 }&lt;br /&gt;
udp dport {telnet, http, https }&lt;br /&gt;
udp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp sport 22&lt;br /&gt;
udp sport != 33-45&lt;br /&gt;
udp sport { 33, 55, 67, 88}&lt;br /&gt;
udp sport { 33-55}&lt;br /&gt;
udp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp length 6666&lt;br /&gt;
udp length != 50-65&lt;br /&gt;
udp length { 50, 65 }&lt;br /&gt;
udp length { 35-50 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| UDP checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp checksum 22&lt;br /&gt;
udp checksum != 33-45&lt;br /&gt;
udp checksum { 33, 55, 67, 88 }&lt;br /&gt;
udp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udplite ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udplite match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite dport 22&lt;br /&gt;
udplite dport != 33-45&lt;br /&gt;
udplite dport { 33-55 }&lt;br /&gt;
udplite dport {telnet, http, https }&lt;br /&gt;
udplite dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udplite dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite sport 22&lt;br /&gt;
udplite sport != 33-45&lt;br /&gt;
udplite sport { 33, 55, 67, 88}&lt;br /&gt;
udplite sport { 33-55}&lt;br /&gt;
udplite sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udplite sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite checksum 22&lt;br /&gt;
udplite checksum != 33-45&lt;br /&gt;
udplite checksum { 33, 55, 67, 88 }&lt;br /&gt;
udplite checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sctp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|sctp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp dport 22&lt;br /&gt;
sctp dport != 33-45&lt;br /&gt;
sctp dport { 33-55 }&lt;br /&gt;
sctp dport {telnet, http, https }&lt;br /&gt;
sctp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
sctp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp sport 22&lt;br /&gt;
sctp sport != 33-45&lt;br /&gt;
sctp sport { 33, 55, 67, 88}&lt;br /&gt;
sctp sport { 33-55}&lt;br /&gt;
sctp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
sctp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp checksum 22&lt;br /&gt;
sctp checksum != 33-45&lt;br /&gt;
sctp checksum { 33, 55, 67, 88 }&lt;br /&gt;
sctp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;vtag &amp;lt;tag&amp;gt;&#039;&#039;&lt;br /&gt;
| Verification tag&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp vtag 22&lt;br /&gt;
sctp vtag != 33-45&lt;br /&gt;
sctp vtag { 33, 55, 67, 88 }&lt;br /&gt;
sctp vtag { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dccp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dccp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp dport 22&lt;br /&gt;
dccp dport != 33-45&lt;br /&gt;
dccp dport { 33-55 }&lt;br /&gt;
dccp dport {telnet, http, https }&lt;br /&gt;
dccp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
dccp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp sport 22&lt;br /&gt;
dccp sport != 33-45&lt;br /&gt;
dccp sport { 33, 55, 67, 88}&lt;br /&gt;
dccp sport { 33-55}&lt;br /&gt;
dccp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
dccp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Type of packet&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp type {request, response, data, ack, dataack, closereq, close, reset, sync, syncack}&lt;br /&gt;
dccp type request&lt;br /&gt;
dccp type != request&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ah ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ah match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| AH header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah hdrlength 11-23&lt;br /&gt;
ah hdrlength != 11-23&lt;br /&gt;
ah hdrlength {11, 23, 44 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah reserved 22&lt;br /&gt;
ah reserved != 33-45&lt;br /&gt;
ah reserved {23, 100 }&lt;br /&gt;
ah reserved { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah spi 111&lt;br /&gt;
ah spi != 111-222&lt;br /&gt;
ah spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah sequence 123&lt;br /&gt;
ah sequence {23, 25, 33}&lt;br /&gt;
ah sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Esp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|esp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp spi 111&lt;br /&gt;
esp spi != 111-222&lt;br /&gt;
esp spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp sequence 123&lt;br /&gt;
esp sequence {23, 25, 33}&lt;br /&gt;
esp sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Comp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|comp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header protocol (Upper layer protocol)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp nexthdr != esp&lt;br /&gt;
comp nexthdr {esp, ah, comp, udp, udplite, tcp, tcp, dccp, sctp}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| Flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp flags 0x0&lt;br /&gt;
comp flags != 0x33-0x45&lt;br /&gt;
comp flags {0x33, 0x55, 0x67, 0x88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Compression Parameter Index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp cpi 22&lt;br /&gt;
comp cpi != 33-45&lt;br /&gt;
comp cpi {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp type {echo-reply, destination-unreachable, source-quench, redirect, echo-request, time-exceeded, parameter-problem, timestamp-request, timestamp-reply, info-request, info-reply, address-mask-request, address-mask-reply, router-advertisement, router-solicitation}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp code 111&lt;br /&gt;
icmp code != 33-55&lt;br /&gt;
icmp code { 2, 4, 54, 33, 56}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp checksum 12343&lt;br /&gt;
icmp checksum != 11-343&lt;br /&gt;
icmp checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp id 12343&lt;br /&gt;
icmp id != 11-343&lt;br /&gt;
icmp id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp sequence 12343&lt;br /&gt;
icmp sequence != 11-343&lt;br /&gt;
icmp sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp mtu 12343&lt;br /&gt;
icmp mtu != 11-343&lt;br /&gt;
icmp mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;gateway &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet gateway&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp gateway 12343&lt;br /&gt;
icmp gateway != 11-343&lt;br /&gt;
icmp gateway { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmpv6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmpv6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 type {destination-unreachable, packet-too-big, time-exceeded, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, nd-redirect, parameter-problem, router-renumbering}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 code 4&lt;br /&gt;
icmpv6 code 3-66&lt;br /&gt;
icmpv6 code {5, 6, 7}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 checksum 12343&lt;br /&gt;
icmpv6 checksum != 11-343&lt;br /&gt;
icmpv6 checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 id 12343&lt;br /&gt;
icmpv6 id != 11-343&lt;br /&gt;
icmpv6 id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 sequence 12343&lt;br /&gt;
icmpv6 sequence != 11-343&lt;br /&gt;
icmpv6 sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 mtu 12343&lt;br /&gt;
icmpv6 mtu != 11-343&lt;br /&gt;
icmpv6 mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;max-delay &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet max delay&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 max-delay 33-45&lt;br /&gt;
icmpv6 max-delay != 33-45&lt;br /&gt;
icmpv6 max-delay {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ether ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ether match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;mac address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source mac address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether saddr 00:0f:54:0c:11:04&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether type vlan&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Dst ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dst match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp}&lt;br /&gt;
dst nexthdr 22&lt;br /&gt;
dst nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst hdrlength 22&lt;br /&gt;
dst hdrlength != 33-45&lt;br /&gt;
dst hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Frag ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|frag match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp, icmp}&lt;br /&gt;
frag nexthdr 6&lt;br /&gt;
frag nexthdr != 50-51&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag reserved 22&lt;br /&gt;
frag reserved != 33-45&lt;br /&gt;
frag reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag frag-off 22&lt;br /&gt;
frag frag-off != 33-45&lt;br /&gt;
frag frag-off { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;more-fragments &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag id 1&lt;br /&gt;
frag id 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Hbh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|hbh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, icmpv6}&lt;br /&gt;
hbh nexthdr 22&lt;br /&gt;
hbh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh hdrlength 22&lt;br /&gt;
hbh hdrlength != 33-45&lt;br /&gt;
hbh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Mh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|mh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
mh nexthdr 22&lt;br /&gt;
mh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh hdrlength 22&lt;br /&gt;
mh hdrlength != 33-45&lt;br /&gt;
mh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh type {binding-refresh-request, home-test-init, careof-test-init, home-test, careof-test, binding-update, binding-acknowledgement, binding-error, fast-binding-update, fast-binding-acknowledgement, fast-binding-advertisement, experimental-mobility-header, home-agent-switch-message}&lt;br /&gt;
mh type home-agent-switch-message&lt;br /&gt;
mh type != home-agent-switch-message&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh reserved 22&lt;br /&gt;
mh reserved != 33-45&lt;br /&gt;
mh reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh checksum 22&lt;br /&gt;
mh checksum != 33-45&lt;br /&gt;
mh checksum { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Rt ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|rt match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
rt nexthdr 22&lt;br /&gt;
rt nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt hdrlength 22&lt;br /&gt;
rt hdrlength != 33-45&lt;br /&gt;
rt hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt type 22&lt;br /&gt;
rt type != 33-45&lt;br /&gt;
rt type { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;seg-left &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt seg-left 22&lt;br /&gt;
rt seg-left != 33-45&lt;br /&gt;
rt seg-left { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Vlan ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|vlan match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Vlan tag ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan id 4094&lt;br /&gt;
vlan id 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cfi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan cfi 0&lt;br /&gt;
vlan cfi 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pcp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan pcp 7&lt;br /&gt;
vlan pcp 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Arp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|arp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ptype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp ptype 0x0800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;htype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Header type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp htype 1&lt;br /&gt;
arp htype != 33-45&lt;br /&gt;
arp htype { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hlen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp hlen 1&lt;br /&gt;
arp hlen != 33-45&lt;br /&gt;
arp hlen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;plen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp plen 1&lt;br /&gt;
arp plen != 33-45&lt;br /&gt;
arp plen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;operation &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp operation {nak, inreply, inrequest, rreply, rrequest, reply, request}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ct ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ct match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;state &amp;lt;state&amp;gt;&#039;&#039;&lt;br /&gt;
| State of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct state { new, established, related, untracked }&lt;br /&gt;
ct state != related&lt;br /&gt;
ct state established&lt;br /&gt;
ct state 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;direction &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Direction of the packet relative to the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct direction original&lt;br /&gt;
ct direction != original&lt;br /&gt;
ct direction {reply, original}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;status &amp;lt;status&amp;gt;&#039;&#039;&lt;br /&gt;
| Status of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct status expected&lt;br /&gt;
ct status != expected&lt;br /&gt;
ct status {expected,seen-reply,assured,confirmed,snat,dnat,dying}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Mark of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct mark 0&lt;br /&gt;
ct mark or 0x23 == 0x11&lt;br /&gt;
ct mark or 0x3 != 0x1&lt;br /&gt;
ct mark and 0x23 == 0x11&lt;br /&gt;
ct mark and 0x3 != 0x1&lt;br /&gt;
ct mark xor 0x23 == 0x11&lt;br /&gt;
ct mark xor 0x3 != 0x1&lt;br /&gt;
ct mark 0x00000032&lt;br /&gt;
ct mark != 0x00000032&lt;br /&gt;
ct mark 0x00000032-0x00000045&lt;br /&gt;
ct mark != 0x00000032-0x00000045&lt;br /&gt;
ct mark {0x32, 0x2222, 0x42de3}&lt;br /&gt;
ct mark {0x32-0x2222, 0x4444-0x42de3}&lt;br /&gt;
ct mark set 0x11 xor 0x1331&lt;br /&gt;
ct mark set 0x11333 and 0x11&lt;br /&gt;
ct mark set 0x12 or 0x11&lt;br /&gt;
ct mark set 0x11&lt;br /&gt;
ct mark set mark&lt;br /&gt;
ct mark set mark map { 1 : 10, 2 : 20, 3 : 30 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;expiration &amp;lt;time&amp;gt;&#039;&#039;&lt;br /&gt;
| Connection expiration time&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct expiration 30&lt;br /&gt;
ct expiration 30s&lt;br /&gt;
ct expiration != 233&lt;br /&gt;
ct expiration != 3m53s&lt;br /&gt;
ct expiration 33-45&lt;br /&gt;
ct expiration 33s-45s&lt;br /&gt;
ct expiration != 33-45&lt;br /&gt;
ct expiration != 33s-45s&lt;br /&gt;
ct expiration {33, 55, 67, 88}&lt;br /&gt;
ct expiration { 1m7s, 33s, 55s, 1m28s}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;helper &amp;quot;&amp;lt;helper&amp;gt;&amp;quot;&#039;&#039;&lt;br /&gt;
| Helper associated with the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct helper &amp;quot;ftp&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] bytes &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original bytes &amp;gt; 100000&lt;br /&gt;
ct bytes &amp;gt; 100000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] packets &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply packets &amp;lt; 100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip saddr 192.168.0.1&lt;br /&gt;
ct reply ip saddr 192.168.0.1&lt;br /&gt;
ct original ip saddr 192.168.1.0/24&lt;br /&gt;
ct reply ip saddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip daddr 192.168.0.1&lt;br /&gt;
ct reply ip daddr 192.168.0.1&lt;br /&gt;
ct original ip daddr 192.168.1.0/24&lt;br /&gt;
ct reply ip daddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] l3proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original l3proto ipv4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original protocol 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-dst &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original proto-dst 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-src &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply proto-src 53&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Meta ====&lt;br /&gt;
&lt;br /&gt;
[[Matching packet metainformation|&#039;&#039;meta&#039;&#039;]] matches packet by metainformation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|meta match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifname &amp;lt;input interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta iifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifname &amp;lt;output interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta oifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iif &amp;lt;input interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iif eth0&lt;br /&gt;
meta iif != eth0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oif &amp;lt;output interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oif lo&lt;br /&gt;
meta oif != lo&lt;br /&gt;
meta oif {eth0, lo}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iiftype &amp;lt;input interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta iiftype != ether&lt;br /&gt;
meta iiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oiftype &amp;lt;output interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface hardware type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta oiftype != ether&lt;br /&gt;
meta oiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Length of the packet in bytes&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta length 1000&lt;br /&gt;
meta length != 1000&lt;br /&gt;
meta length &amp;gt; 1000&lt;br /&gt;
meta length 33-45&lt;br /&gt;
meta length != 33-45&lt;br /&gt;
meta length { 33, 55, 67, 88 }&lt;br /&gt;
meta length { 33-55, 67-88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| ethertype protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta protocol ip&lt;br /&gt;
meta protocol != ip&lt;br /&gt;
meta protocol { ip, arp, ip6, vlan }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nfproto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta nfproto ipv4&lt;br /&gt;
meta nfproto != ipv6&lt;br /&gt;
meta nfproto { ipv4, ipv6 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;l4proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta l4proto 22&lt;br /&gt;
meta l4proto != 233&lt;br /&gt;
meta l4proto 33-45&lt;br /&gt;
meta l4proto { 33, 55, 67, 88 }&lt;br /&gt;
meta l4proto { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet mark&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta mark 0x4&lt;br /&gt;
meta mark 0x00000032&lt;br /&gt;
meta mark and 0x03 == 0x01&lt;br /&gt;
meta mark and 0x03 != 0x01&lt;br /&gt;
meta mark != 0x10&lt;br /&gt;
meta mark or 0x03 == 0x01&lt;br /&gt;
meta mark or 0x03 != 0x01&lt;br /&gt;
meta mark xor 0x03 == 0x01&lt;br /&gt;
meta mark xor 0x03 != 0x01&lt;br /&gt;
meta mark set 0xffffffc8 xor 0x16&lt;br /&gt;
meta mark set 0x16 and 0x16&lt;br /&gt;
meta mark set 0xffffffe9 or 0x16&lt;br /&gt;
meta mark set 0xffffffde and 0x16&lt;br /&gt;
meta mark set 0x32 or 0xfffff&lt;br /&gt;
meta mark set 0xfffe xor 0x16&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;priority [set] &amp;lt;priority&amp;gt;&#039;&#039;&lt;br /&gt;
| tc class id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta priority none&lt;br /&gt;
meta priority 0x1:0x1&lt;br /&gt;
meta priority 0x1:0xffff&lt;br /&gt;
meta priority 0xffff:0xffff&lt;br /&gt;
meta priority set 0x1:0x1&lt;br /&gt;
meta priority set 0x1:0xffff&lt;br /&gt;
meta priority set 0xffff:0xffff&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skuid &amp;lt;user id&amp;gt;&#039;&#039;&lt;br /&gt;
| UID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skuid {bin, root, daemon}&lt;br /&gt;
meta skuid root&lt;br /&gt;
meta skuid != root&lt;br /&gt;
meta skuid lt 3000&lt;br /&gt;
meta skuid gt 3000&lt;br /&gt;
meta skuid eq 3000&lt;br /&gt;
meta skuid 3001-3005&lt;br /&gt;
meta skuid != 2001-2005&lt;br /&gt;
meta skuid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skgid &amp;lt;group id&amp;gt;&#039;&#039;&lt;br /&gt;
| GID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skgid {bin, root, daemon}&lt;br /&gt;
meta skgid root&lt;br /&gt;
meta skgid != root&lt;br /&gt;
meta skgid lt 3000&lt;br /&gt;
meta skgid gt 3000&lt;br /&gt;
meta skgid eq 3000&lt;br /&gt;
meta skgid 3001-3005&lt;br /&gt;
meta skgid != 2001-2005&lt;br /&gt;
meta skgid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rtclassid &amp;lt;class&amp;gt;&#039;&#039;&lt;br /&gt;
| Routing realm&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta rtclassid cosmos&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pkttype &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta pkttype broadcast&lt;br /&gt;
meta pkttype != broadcast&lt;br /&gt;
meta pkttype { broadcast, unicast, multicast}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpu &amp;lt;cpu index&amp;gt;&#039;&#039;&lt;br /&gt;
| CPU ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cpu 1&lt;br /&gt;
meta cpu != 1&lt;br /&gt;
meta cpu 1-3&lt;br /&gt;
meta cpu != 1-2&lt;br /&gt;
meta cpu { 2,3 }&lt;br /&gt;
meta cpu { 2-3, 5-7 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifgroup &amp;lt;input group&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifgroup 0&lt;br /&gt;
meta iifgroup != 0&lt;br /&gt;
meta iifgroup default&lt;br /&gt;
meta iifgroup != default&lt;br /&gt;
meta iifgroup {default}&lt;br /&gt;
meta iifgroup { 11,33 }&lt;br /&gt;
meta iifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifgroup 0&lt;br /&gt;
meta oifgroup != 0&lt;br /&gt;
meta oifgroup default&lt;br /&gt;
meta oifgroup != default&lt;br /&gt;
meta oifgroup {default}&lt;br /&gt;
meta oifgroup { 11,33 }&lt;br /&gt;
meta oifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cgroup 1048577&lt;br /&gt;
meta cgroup != 1048577&lt;br /&gt;
meta cgroup { 1048577, 1048578 }&lt;br /&gt;
meta cgroup 1048577-1048578&lt;br /&gt;
meta cgroup != 1048577-1048578&lt;br /&gt;
meta cgroup {1048577-1048578}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Statements ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;statement&#039;&#039;&#039; is the action performed when the packet match the rule. It could be &#039;&#039;terminal&#039;&#039; and &#039;&#039;non-terminal&#039;&#039;. In a certain rule we can consider several non-terminal statements but only a single terminal statement.&lt;br /&gt;
&lt;br /&gt;
==== Verdict statements ====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;verdict statement&#039;&#039;&#039; alters control flow in the ruleset and issues policy decisions for packets. The valid verdict statements are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;accept&#039;&#039;: Accept the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;drop&#039;&#039;: Drop the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;queue&#039;&#039;: Queue the packet to userspace and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;continue&#039;&#039;: Continue the ruleset evaluation with the next rule.&lt;br /&gt;
* &#039;&#039;return&#039;&#039;: Return from the current chain and continue at the next rule of the last chain. In a base chain it is equivalent to accept&lt;br /&gt;
* &#039;&#039;jump &amp;lt;chain&amp;gt;&#039;&#039;: Continue at the first rule of &amp;lt;chain&amp;gt;. It will continue at the next rule after a return statement is issued&lt;br /&gt;
* &#039;&#039;goto &amp;lt;chain&amp;gt;&#039;&#039;: Similar to jump, but after the new chain the evaluation will continue at the last chain instead of the one containing the goto statement&lt;br /&gt;
&lt;br /&gt;
==== Log ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|log statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;level [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Log level&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log&lt;br /&gt;
log level emerg&lt;br /&gt;
log level alert&lt;br /&gt;
log level crit&lt;br /&gt;
log level err&lt;br /&gt;
log level warn&lt;br /&gt;
log level notice&lt;br /&gt;
log level info&lt;br /&gt;
log level debug&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;group &amp;lt;value&amp;gt; [queue-threshold &amp;lt;value&amp;gt;] [snaplen &amp;lt;value&amp;gt;] [prefix &amp;quot;&amp;lt;prefix&amp;gt;&amp;quot;]&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log prefix aaaaa-aaaaaa group 2 snaplen 33&lt;br /&gt;
log group 2 queue-threshold 2&lt;br /&gt;
log group 2 snaplen 33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reject ====&lt;br /&gt;
&lt;br /&gt;
The default &#039;&#039;&#039;reject&#039;&#039;&#039; will be the ICMP type &#039;&#039;&#039;port-unreachable&#039;&#039;&#039;. The &#039;&#039;&#039;icmpx&#039;&#039;&#039; is only used for inet family support.&lt;br /&gt;
&lt;br /&gt;
More information on the [[Rejecting_traffic]] page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|reject statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;with &amp;lt;protocol&amp;gt; type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
reject&lt;br /&gt;
reject with icmp type host-unreachable&lt;br /&gt;
reject with icmp type net-unreachable&lt;br /&gt;
reject with icmp type prot-unreachable&lt;br /&gt;
reject with icmp type port-unreachable&lt;br /&gt;
reject with icmp type net-prohibited&lt;br /&gt;
reject with icmp type host-prohibited&lt;br /&gt;
reject with icmp type admin-prohibited&lt;br /&gt;
reject with icmpv6 type no-route&lt;br /&gt;
reject with icmpv6 type admin-prohibited&lt;br /&gt;
reject with icmpv6 type addr-unreachable&lt;br /&gt;
reject with icmpv6 type port-unreachable&lt;br /&gt;
reject with icmpx type host-unreachable&lt;br /&gt;
reject with icmpx type no-route&lt;br /&gt;
reject with icmpx type admin-prohibited&lt;br /&gt;
reject with icmpx type port-unreachable&lt;br /&gt;
ip protocol tcp reject with tcp reset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Counter ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|counter statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;packets &amp;lt;packets&amp;gt; bytes &amp;lt;bytes&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
counter&lt;br /&gt;
counter packets 0 bytes 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Limit ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|limit statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rate [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Rate limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
limit rate 400/minute&lt;br /&gt;
limit rate 400/hour&lt;br /&gt;
limit rate over 40/day&lt;br /&gt;
limit rate over 400/week&lt;br /&gt;
limit rate over 1023/second burst 10 packets&lt;br /&gt;
limit rate 1025 kbytes/second&lt;br /&gt;
limit rate 1023000 mbytes/second&lt;br /&gt;
limit rate 1025 bytes/second burst 512 bytes&lt;br /&gt;
limit rate 1025 kbytes/second burst 1023 kbytes&lt;br /&gt;
limit rate 1025 mbytes/second burst 1025 kbytes&lt;br /&gt;
limit rate 1025000 mbytes/second burst 1023 mbytes&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nat ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|nat statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dnat &amp;lt;destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dnat 192.168.3.2&lt;br /&gt;
dnat ct mark map { 0x00000014 : 1.2.3.4}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;snat &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
snat 192.168.3.2&lt;br /&gt;
snat 2001:838:35f:1::-2001:838:35f:2:::100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;masquerade [&amp;lt;type&amp;gt;] [to :&amp;lt;port&amp;gt;]&#039;&#039;&lt;br /&gt;
| Masquerade&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
masquerade&lt;br /&gt;
masquerade persistent,fully-random,random&lt;br /&gt;
masquerade to :1024&lt;br /&gt;
masquerade to :1024-2048&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Queue ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|queue statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;num &amp;lt;value&amp;gt; &amp;lt;scheduler&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
queue&lt;br /&gt;
queue num 2&lt;br /&gt;
queue num 2-3&lt;br /&gt;
queue num 4-5 fanout bypass&lt;br /&gt;
queue num 4-5 fanout&lt;br /&gt;
queue num 4-5 bypass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Export Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft export (xml | json)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monitor Events ===&lt;br /&gt;
&lt;br /&gt;
Monitor events from Netlink creating filters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft monitor [new | destroy] [tables | chains | sets | rules | elements] [xml | json]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Nft scripting =&lt;br /&gt;
&lt;br /&gt;
== List ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flush ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Load ruleset ==&lt;br /&gt;
&lt;br /&gt;
Create a command batch file and load it with the nft interpreter,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% echo &amp;quot;flush ruleset&amp;quot; &amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add table filter&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add chain filter input&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add rule filter input meta iifname lo accept&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/nftables.rules&lt;br /&gt;
&amp;gt; #!/usr/local/sbin/nft -f&lt;br /&gt;
&amp;gt; flush ruleset&lt;br /&gt;
&amp;gt; add table filter&lt;br /&gt;
&amp;gt; add chain filter input&lt;br /&gt;
&amp;gt; add rule filter input meta iifname lo accept&lt;br /&gt;
&amp;gt; EOF&lt;br /&gt;
% chmod u+x /etc/nftables.rules&lt;br /&gt;
% /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file from an already created ruleset,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset &amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
== Simple IP/IPv6 Firewall ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    icmp type echo-request accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table ip6 firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # invalid connections&lt;br /&gt;
    ct state invalid drop&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    # routers may also want: mld-listener-query, nd-router-solicit&lt;br /&gt;
    icmpv6 type {echo-request,nd-neighbor-solicit} accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=612</id>
		<title>Quick reference-nftables in 10 minutes</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=612"/>
		<updated>2021-01-15T22:25:36Z</updated>

		<summary type="html">&lt;p&gt;Pablo: /* Ct */ update ct original ip {s,d}addr syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Find below some basic concepts to know before using nftables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;table&#039;&#039;&#039; refers to a container of [[Configuring chains|chains]] with no specific semantics.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;chain&#039;&#039;&#039; within a [[Configuring tables|table]] refers to a container of [[Simple rule management|rules]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;rule&#039;&#039;&#039; refers to an action to be configured within a &#039;&#039;chain&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= nft command line =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;nft&#039;&#039; is the command line tool in order to interact with nftables at userspace.&lt;br /&gt;
&lt;br /&gt;
== Tables ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;family&#039;&#039;&#039; refers to a one of the following table types: &#039;&#039;ip&#039;&#039;, &#039;&#039;arp&#039;&#039;, &#039;&#039;ip6&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;inet&#039;&#039;, &#039;&#039;netdev&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list tables [&amp;lt;family&amp;gt;]&lt;br /&gt;
% nft list table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt; [-n] [-a]&lt;br /&gt;
% nft (add | delete | flush) table [&amp;lt;family&amp;gt;] &amp;lt;name&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The argument &#039;&#039;-n&#039;&#039; shows the addresses and other information that uses names in numeric format. The &#039;&#039;-a&#039;&#039; argument is used to display the &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Chains ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;type&#039;&#039;&#039; refers to the kind of chain to be created. Possible types are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;filter&#039;&#039;: Supported by &#039;&#039;arp&#039;&#039;, &#039;&#039;bridge&#039;&#039;, &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; table families.&lt;br /&gt;
* &#039;&#039;route&#039;&#039;: Mark packets (like mangle for the &#039;&#039;output&#039;&#039; hook, for other hooks use the type &#039;&#039;filter&#039;&#039; instead), supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
* &#039;&#039;nat&#039;&#039;: In order to perform Network Address Translation, supported by &#039;&#039;ip&#039;&#039; and &#039;&#039;ip6&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;hook&#039;&#039;&#039; refers to an specific stage of the packet while it&#039;s being processed through the kernel. More info in [[Netfilter_hooks|Netfilter hooks]].&lt;br /&gt;
&lt;br /&gt;
* The hooks for &#039;&#039;ip&#039;&#039;, &#039;&#039;ip6&#039;&#039; and &#039;&#039;inet&#039;&#039; families are: &#039;&#039;prerouting&#039;&#039;, &#039;&#039;input&#039;&#039;, &#039;&#039;forward&#039;&#039;, &#039;&#039;output&#039;&#039;, &#039;&#039;postrouting&#039;&#039;.&lt;br /&gt;
* The hooks for &#039;&#039;arp&#039;&#039; family are: &#039;&#039; input&#039;&#039;, &#039;&#039;output&#039;&#039;.&lt;br /&gt;
* The &#039;&#039;bridge&#039;&#039; family handles ethernet packets traversing bridge devices.&lt;br /&gt;
* The hook for &#039;&#039;netdev&#039;&#039; is: &#039;&#039;ingress&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;priority&#039;&#039;&#039; refers to a number used to order the chains or to set them between some Netfilter operations. Possible values are: &#039;&#039;NF_IP_PRI_CONNTRACK_DEFRAG (-400)&#039;&#039;, &#039;&#039;NF_IP_PRI_RAW (-300)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_FIRST (-225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK (-200)&#039;&#039;, &#039;&#039;NF_IP_PRI_MANGLE (-150)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_DST (-100)&#039;&#039;, &#039;&#039;NF_IP_PRI_FILTER (0)&#039;&#039;, &#039;&#039;NF_IP_PRI_SECURITY (50)&#039;&#039;, &#039;&#039;NF_IP_PRI_NAT_SRC (100)&#039;&#039;, &#039;&#039;NF_IP_PRI_SELINUX_LAST (225)&#039;&#039;, &#039;&#039;NF_IP_PRI_CONNTRACK_HELPER (300)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;policy&#039;&#039;&#039; is the default verdict statement to control the flow in the chain. Possible values are: &#039;&#039;accept&#039;&#039;, &#039;&#039;drop&#039;&#039;, &#039;&#039;queue&#039;&#039;, &#039;&#039;continue&#039;&#039;, &#039;&#039;return&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ { type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy &amp;lt;policy&amp;gt; \;] } ]&lt;br /&gt;
% nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
% nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rules ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;handle&#039;&#039;&#039; is an internal number that identifies a certain &#039;&#039;rule&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;position&#039;&#039;&#039; is an internal number that is used to insert a &#039;&#039;rule&#039;&#039; before a certain &#039;&#039;handle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft insert rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [position &amp;lt;position&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft replace rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;] &amp;lt;matches&amp;gt; &amp;lt;statements&amp;gt;&lt;br /&gt;
% nft delete rule [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; [handle &amp;lt;handle&amp;gt;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Matches ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;matches&#039;&#039;&#039; are clues used to access to certain packet information and create filters according to them.&lt;br /&gt;
&lt;br /&gt;
==== Ip ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip match&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip dscp cs1&lt;br /&gt;
ip dscp != cs1&lt;br /&gt;
ip dscp 0x38&lt;br /&gt;
ip dscp != 0x20&lt;br /&gt;
ip dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, &lt;br /&gt;
af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip length 232&lt;br /&gt;
ip length != 233&lt;br /&gt;
ip length 333-435&lt;br /&gt;
ip length != 333-453&lt;br /&gt;
ip length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;id&amp;gt;&#039;&#039;&lt;br /&gt;
| IP ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip id 22&lt;br /&gt;
ip id != 233&lt;br /&gt;
ip id 33-45&lt;br /&gt;
ip id != 33-45&lt;br /&gt;
ip id { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Fragmentation offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip frag-off 222&lt;br /&gt;
ip frag-off != 233&lt;br /&gt;
ip frag-off 33-45&lt;br /&gt;
ip frag-off != 33-45&lt;br /&gt;
ip frag-off { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ttl &amp;lt;ttl&amp;gt;&#039;&#039;&lt;br /&gt;
| Time to live&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip ttl 0&lt;br /&gt;
ip ttl 233&lt;br /&gt;
ip ttl 33-55&lt;br /&gt;
ip ttl != 45-50&lt;br /&gt;
ip ttl { 43, 53, 45 }&lt;br /&gt;
ip ttl { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Upper layer protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip protocol tcp&lt;br /&gt;
ip protocol 6&lt;br /&gt;
ip protocol != tcp&lt;br /&gt;
ip protocol { icmp, esp, ah, comp, udp, udplite, tcp, dccp, sctp }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip checksum 13172&lt;br /&gt;
ip checksum 22&lt;br /&gt;
ip checksum != 233&lt;br /&gt;
ip checksum 33-45&lt;br /&gt;
ip checksum != 33-45&lt;br /&gt;
ip checksum { 33, 55, 67, 88 }&lt;br /&gt;
ip checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip saddr 192.168.2.0/24&lt;br /&gt;
ip saddr != 192.168.2.0/24&lt;br /&gt;
ip saddr 192.168.3.1 ip daddr 192.168.3.100&lt;br /&gt;
ip saddr != 1.1.1.1&lt;br /&gt;
ip saddr 1.1.1.1&lt;br /&gt;
ip saddr &amp;amp; 0xff == 1&lt;br /&gt;
ip saddr &amp;amp; 0.0.0.255 &amp;lt; 0.0.0.127&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip daddr 192.168.0.1&lt;br /&gt;
ip daddr != 192.168.0.1&lt;br /&gt;
ip daddr 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr 10.0.0.0-10.255.255.255&lt;br /&gt;
ip daddr 172.16.0.0-172.31.255.255&lt;br /&gt;
ip daddr 192.168.3.1-192.168.4.250&lt;br /&gt;
ip daddr != 192.168.0.1-192.168.0.250&lt;br /&gt;
ip daddr { 192.168.0.1-192.168.0.250 }&lt;br /&gt;
ip daddr { 192.168.5.1, 192.168.5.2, 192.168.5.3 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| Ip Header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip version 4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;header length&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip hdrlength 0&lt;br /&gt;
ip hdrlength 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ip6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ip6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dscp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 dscp cs1&lt;br /&gt;
ip6 dscp != cs1&lt;br /&gt;
ip6 dscp 0x38&lt;br /&gt;
ip6 dscp != 0x20&lt;br /&gt;
ip6 dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, af22, af23, af31, af32, af33, af41, af42, af43, ef}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flowlabel &amp;lt;label&amp;gt;&#039;&#039;&lt;br /&gt;
| Flow label&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 flowlabel 22&lt;br /&gt;
ip6 flowlabel != 233&lt;br /&gt;
ip6 flowlabel { 33, 55, 67, 88 }&lt;br /&gt;
ip6 flowlabel { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 length 232&lt;br /&gt;
ip6 length != 233&lt;br /&gt;
ip6 length 333-435&lt;br /&gt;
ip6 length != 333-453&lt;br /&gt;
ip6 length { 333, 553, 673, 838}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;header&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header type (Upper layer protocol number)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 nexthdr {esp, udp, ah, comp, udplite, tcp, dccp, sctp, icmpv6}&lt;br /&gt;
ip6 nexthdr esp&lt;br /&gt;
ip6 nexthdr != esp&lt;br /&gt;
ip6 nexthdr { 33-44 }&lt;br /&gt;
ip6 nexthdr 33-44&lt;br /&gt;
ip6 nexthdr != 33-44&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hoplimit &amp;lt;hoplimit&amp;gt;&#039;&#039;&lt;br /&gt;
| Hop limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 hoplimit 1&lt;br /&gt;
ip6 hoplimit != 233&lt;br /&gt;
ip6 hoplimit 33-45&lt;br /&gt;
ip6 hoplimit != 33-45&lt;br /&gt;
ip6 hoplimit {33, 55, 67, 88}&lt;br /&gt;
ip6 hoplimit {33-55}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 saddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 saddr ::/64&lt;br /&gt;
ip6 saddr ::1 ip6 daddr ::2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination Address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 daddr 1234:1234:1234:1234:1234:1234:1234:1234&lt;br /&gt;
ip6 daddr != ::1234:1234:1234:1234:1234:1234:1234-1234:1234::1234:1234:1234:1234:1234&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;version &amp;lt;version&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header version&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip6 version 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Tcp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|tcp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp dport 22&lt;br /&gt;
tcp dport != 33-45&lt;br /&gt;
tcp dport { 33-55 }&lt;br /&gt;
tcp dport {telnet, http, https }&lt;br /&gt;
tcp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
tcp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sport 22&lt;br /&gt;
tcp sport != 33-45&lt;br /&gt;
tcp sport { 33, 55, 67, 88}&lt;br /&gt;
tcp sport { 33-55}&lt;br /&gt;
tcp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
tcp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp sequence 22&lt;br /&gt;
tcp sequence != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ackseq &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Acknowledgement number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp ackseq 22&lt;br /&gt;
tcp ackseq != 33-45&lt;br /&gt;
tcp ackseq { 33, 55, 67, 88 }&lt;br /&gt;
tcp ackseq { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| TCP flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp flags { fin, syn, rst, psh, ack, urg, ecn, cwr}&lt;br /&gt;
tcp flags cwr&lt;br /&gt;
tcp flags != cwr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;window &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Window&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp window 22&lt;br /&gt;
tcp window != 33-45&lt;br /&gt;
tcp window { 33, 55, 67, 88 }&lt;br /&gt;
tcp window { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| IP header checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp checksum 22&lt;br /&gt;
tcp checksum != 33-45&lt;br /&gt;
tcp checksum { 33, 55, 67, 88 }&lt;br /&gt;
tcp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;urgptr &amp;lt;pointer&amp;gt;&#039;&#039;&lt;br /&gt;
| Urgent pointer&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp urgptr 22&lt;br /&gt;
tcp urgptr != 33-45&lt;br /&gt;
tcp urgptr { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;doff &amp;lt;offset&amp;gt;&#039;&#039;&lt;br /&gt;
| Data offset&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tcp doff 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp dport 22&lt;br /&gt;
udp dport != 33-45&lt;br /&gt;
udp dport { 33-55 }&lt;br /&gt;
udp dport {telnet, http, https }&lt;br /&gt;
udp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp sport 22&lt;br /&gt;
udp sport != 33-45&lt;br /&gt;
udp sport { 33, 55, 67, 88}&lt;br /&gt;
udp sport { 33-55}&lt;br /&gt;
udp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Total packet length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp length 6666&lt;br /&gt;
udp length != 50-65&lt;br /&gt;
udp length { 50, 65 }&lt;br /&gt;
udp length { 35-50 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| UDP checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udp checksum 22&lt;br /&gt;
udp checksum != 33-45&lt;br /&gt;
udp checksum { 33, 55, 67, 88 }&lt;br /&gt;
udp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Udplite ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|udplite match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite dport 22&lt;br /&gt;
udplite dport != 33-45&lt;br /&gt;
udplite dport { 33-55 }&lt;br /&gt;
udplite dport {telnet, http, https }&lt;br /&gt;
udplite dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
udplite dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite sport 22&lt;br /&gt;
udplite sport != 33-45&lt;br /&gt;
udplite sport { 33, 55, 67, 88}&lt;br /&gt;
udplite sport { 33-55}&lt;br /&gt;
udplite sport vmap { 25:accept, 28:drop }&lt;br /&gt;
udplite sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
udplite checksum 22&lt;br /&gt;
udplite checksum != 33-45&lt;br /&gt;
udplite checksum { 33, 55, 67, 88 }&lt;br /&gt;
udplite checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Sctp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|sctp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp dport 22&lt;br /&gt;
sctp dport != 33-45&lt;br /&gt;
sctp dport { 33-55 }&lt;br /&gt;
sctp dport {telnet, http, https }&lt;br /&gt;
sctp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
sctp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp sport 22&lt;br /&gt;
sctp sport != 33-45&lt;br /&gt;
sctp sport { 33, 55, 67, 88}&lt;br /&gt;
sctp sport { 33-55}&lt;br /&gt;
sctp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
sctp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;checksum&amp;gt;&#039;&#039;&lt;br /&gt;
| Checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp checksum 22&lt;br /&gt;
sctp checksum != 33-45&lt;br /&gt;
sctp checksum { 33, 55, 67, 88 }&lt;br /&gt;
sctp checksum { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;vtag &amp;lt;tag&amp;gt;&#039;&#039;&lt;br /&gt;
| Verification tag&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sctp vtag 22&lt;br /&gt;
sctp vtag != 33-45&lt;br /&gt;
sctp vtag { 33, 55, 67, 88 }&lt;br /&gt;
sctp vtag { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dccp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dccp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dport &amp;lt;destination port&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp dport 22&lt;br /&gt;
dccp dport != 33-45&lt;br /&gt;
dccp dport { 33-55 }&lt;br /&gt;
dccp dport {telnet, http, https }&lt;br /&gt;
dccp dport vmap { 22 : accept, 23 : drop }&lt;br /&gt;
dccp dport vmap { 25:accept, 28:drop }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sport &amp;lt; source port&amp;gt;&#039;&#039;&lt;br /&gt;
| Source port&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp sport 22&lt;br /&gt;
dccp sport != 33-45&lt;br /&gt;
dccp sport { 33, 55, 67, 88}&lt;br /&gt;
dccp sport { 33-55}&lt;br /&gt;
dccp sport vmap { 25:accept, 28:drop }&lt;br /&gt;
dccp sport 1024 tcp dport 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Type of packet&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dccp type {request, response, data, ack, dataack, closereq, close, reset, sync, syncack}&lt;br /&gt;
dccp type request&lt;br /&gt;
dccp type != request&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ah ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ah match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| AH header length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah hdrlength 11-23&lt;br /&gt;
ah hdrlength != 11-23&lt;br /&gt;
ah hdrlength {11, 23, 44 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah reserved 22&lt;br /&gt;
ah reserved != 33-45&lt;br /&gt;
ah reserved {23, 100 }&lt;br /&gt;
ah reserved { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah spi 111&lt;br /&gt;
ah spi != 111-222&lt;br /&gt;
ah spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ah sequence 123&lt;br /&gt;
ah sequence {23, 25, 33}&lt;br /&gt;
ah sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Esp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|esp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;spi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp spi 111&lt;br /&gt;
esp spi != 111-222&lt;br /&gt;
esp spi {111, 122 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;sequence&amp;gt;&#039;&#039;&lt;br /&gt;
| Sequence Number&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
esp sequence 123&lt;br /&gt;
esp sequence {23, 25, 33}&lt;br /&gt;
esp sequence != 23-33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Comp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|comp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| Next header protocol (Upper layer protocol)&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp nexthdr != esp&lt;br /&gt;
comp nexthdr {esp, ah, comp, udp, udplite, tcp, tcp, dccp, sctp}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;flags &amp;lt;flags&amp;gt;&#039;&#039;&lt;br /&gt;
| Flags&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp flags 0x0&lt;br /&gt;
comp flags != 0x33-0x45&lt;br /&gt;
comp flags {0x33, 0x55, 0x67, 0x88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Compression Parameter Index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
comp cpi 22&lt;br /&gt;
comp cpi != 33-45&lt;br /&gt;
comp cpi {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp type {echo-reply, destination-unreachable, source-quench, redirect, echo-request, time-exceeded, parameter-problem, timestamp-request, timestamp-reply, info-request, info-reply, address-mask-request, address-mask-reply, router-advertisement, router-solicitation}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp code 111&lt;br /&gt;
icmp code != 33-55&lt;br /&gt;
icmp code { 2, 4, 54, 33, 56}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp checksum 12343&lt;br /&gt;
icmp checksum != 11-343&lt;br /&gt;
icmp checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp id 12343&lt;br /&gt;
icmp id != 11-343&lt;br /&gt;
icmp id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp sequence 12343&lt;br /&gt;
icmp sequence != 11-343&lt;br /&gt;
icmp sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp mtu 12343&lt;br /&gt;
icmp mtu != 11-343&lt;br /&gt;
icmp mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;gateway &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMP packet gateway&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmp gateway 12343&lt;br /&gt;
icmp gateway != 11-343&lt;br /&gt;
icmp gateway { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Icmpv6 ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|icmpv6 match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 type {destination-unreachable, packet-too-big, time-exceeded, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, nd-redirect, parameter-problem, router-renumbering}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;code &amp;lt;code&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet code&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 code 4&lt;br /&gt;
icmpv6 code 3-66&lt;br /&gt;
icmpv6 code {5, 6, 7}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet checksum&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 checksum 12343&lt;br /&gt;
icmpv6 checksum != 11-343&lt;br /&gt;
icmpv6 checksum { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 id 12343&lt;br /&gt;
icmpv6 id != 11-343&lt;br /&gt;
icmpv6 id { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;sequence &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet sequence&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 sequence 12343&lt;br /&gt;
icmpv6 sequence != 11-343&lt;br /&gt;
icmpv6 sequence { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mtu &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet mtu&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 mtu 12343&lt;br /&gt;
icmpv6 mtu != 11-343&lt;br /&gt;
icmpv6 mtu { 1111, 222, 343 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;max-delay &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| ICMPv6 packet max delay&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
icmpv6 max-delay 33-45&lt;br /&gt;
icmpv6 max-delay != 33-45&lt;br /&gt;
icmpv6 max-delay {33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ether ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ether match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;saddr &amp;lt;mac address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source mac address&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether saddr 00:0f:54:0c:11:04&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ether type vlan&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Dst ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|dst match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp}&lt;br /&gt;
dst nexthdr 22&lt;br /&gt;
dst nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dst hdrlength 22&lt;br /&gt;
dst hdrlength != 33-45&lt;br /&gt;
dst hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Frag ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|frag match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp, icmp}&lt;br /&gt;
frag nexthdr 6&lt;br /&gt;
frag nexthdr != 50-51&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag reserved 22&lt;br /&gt;
frag reserved != 33-45&lt;br /&gt;
frag reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;frag-off &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag frag-off 22&lt;br /&gt;
frag frag-off != 33-45&lt;br /&gt;
frag frag-off { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;more-fragments &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
frag more-fragments 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
frag id 1&lt;br /&gt;
frag id 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Hbh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|hbh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, icmpv6}&lt;br /&gt;
hbh nexthdr 22&lt;br /&gt;
hbh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hbh hdrlength 22&lt;br /&gt;
hbh hdrlength != 33-45&lt;br /&gt;
hbh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Mh ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|mh match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
mh nexthdr 22&lt;br /&gt;
mh nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh hdrlength 22&lt;br /&gt;
mh hdrlength != 33-45&lt;br /&gt;
mh hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh type {binding-refresh-request, home-test-init, careof-test-init, home-test, careof-test, binding-update, binding-acknowledgement, binding-error, fast-binding-update, fast-binding-acknowledgement, fast-binding-advertisement, experimental-mobility-header, home-agent-switch-message}&lt;br /&gt;
mh type home-agent-switch-message&lt;br /&gt;
mh type != home-agent-switch-message&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;reserved &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh reserved 22&lt;br /&gt;
mh reserved != 33-45&lt;br /&gt;
mh reserved { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;checksum &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mh checksum 22&lt;br /&gt;
mh checksum != 33-45&lt;br /&gt;
mh checksum { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Rt ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|rt match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nexthdr &amp;lt;proto&amp;gt;&#039;&#039;&lt;br /&gt;
| Next protocol header&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }&lt;br /&gt;
rt nexthdr 22&lt;br /&gt;
rt nexthdr != 33-45&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hdrlength &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt hdrlength 22&lt;br /&gt;
rt hdrlength != 33-45&lt;br /&gt;
rt hdrlength { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt type 22&lt;br /&gt;
rt type != 33-45&lt;br /&gt;
rt type { 33, 55, 67, 88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;seg-left &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rt seg-left 22&lt;br /&gt;
rt seg-left != 33-45&lt;br /&gt;
rt seg-left { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Vlan ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|vlan match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;id &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Vlan tag ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan id 4094&lt;br /&gt;
vlan id 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cfi &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan cfi 0&lt;br /&gt;
vlan cfi 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pcp &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vlan pcp 7&lt;br /&gt;
vlan pcp 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Arp ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|arp match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;ptype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp ptype 0x0800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;htype &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Header type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp htype 1&lt;br /&gt;
arp htype != 33-45&lt;br /&gt;
arp htype { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;hlen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Header Length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp hlen 1&lt;br /&gt;
arp hlen != 33-45&lt;br /&gt;
arp hlen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;plen &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Payload length&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp plen 1&lt;br /&gt;
arp plen != 33-45&lt;br /&gt;
arp plen { 33, 55, 67, 88}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;operation &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
arp operation {nak, inreply, inrequest, rreply, rrequest, reply, request}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Ct ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|ct match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;state &amp;lt;state&amp;gt;&#039;&#039;&lt;br /&gt;
| State of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct state { new, established, related, untracked }&lt;br /&gt;
ct state != related&lt;br /&gt;
ct state established&lt;br /&gt;
ct state 8&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;direction &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| Direction of the packet relative to the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct direction original&lt;br /&gt;
ct direction != original&lt;br /&gt;
ct direction {reply, original}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;status &amp;lt;status&amp;gt;&#039;&#039;&lt;br /&gt;
| Status of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct status expected&lt;br /&gt;
ct status != expected&lt;br /&gt;
ct status {expected,seen-reply,assured,confirmed,snat,dnat,dying}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Mark of the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct mark 0&lt;br /&gt;
ct mark or 0x23 == 0x11&lt;br /&gt;
ct mark or 0x3 != 0x1&lt;br /&gt;
ct mark and 0x23 == 0x11&lt;br /&gt;
ct mark and 0x3 != 0x1&lt;br /&gt;
ct mark xor 0x23 == 0x11&lt;br /&gt;
ct mark xor 0x3 != 0x1&lt;br /&gt;
ct mark 0x00000032&lt;br /&gt;
ct mark != 0x00000032&lt;br /&gt;
ct mark 0x00000032-0x00000045&lt;br /&gt;
ct mark != 0x00000032-0x00000045&lt;br /&gt;
ct mark {0x32, 0x2222, 0x42de3}&lt;br /&gt;
ct mark {0x32-0x2222, 0x4444-0x42de3}&lt;br /&gt;
ct mark set 0x11 xor 0x1331&lt;br /&gt;
ct mark set 0x11333 and 0x11&lt;br /&gt;
ct mark set 0x12 or 0x11&lt;br /&gt;
ct mark set 0x11&lt;br /&gt;
ct mark set mark&lt;br /&gt;
ct mark set mark map { 1 : 10, 2 : 20, 3 : 30 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;expiration &amp;lt;time&amp;gt;&#039;&#039;&lt;br /&gt;
| Connection expiration time&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct expiration 30&lt;br /&gt;
ct expiration 30s&lt;br /&gt;
ct expiration != 233&lt;br /&gt;
ct expiration != 3m53s&lt;br /&gt;
ct expiration 33-45&lt;br /&gt;
ct expiration 33s-45s&lt;br /&gt;
ct expiration != 33-45&lt;br /&gt;
ct expiration != 33s-45s&lt;br /&gt;
ct expiration {33, 55, 67, 88}&lt;br /&gt;
ct expiration { 1m7s, 33s, 55s, 1m28s}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;helper &amp;quot;&amp;lt;helper&amp;gt;&amp;quot;&#039;&#039;&lt;br /&gt;
| Helper associated with the connection&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct helper &amp;quot;ftp&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] bytes &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original bytes &amp;gt; 100000&lt;br /&gt;
ct bytes &amp;gt; 100000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] packets &amp;lt;value&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply packets &amp;lt; 100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] ip saddr &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip saddr 192.168.0.1&lt;br /&gt;
ct reply ip saddr 192.168.0.1&lt;br /&gt;
ct original ip saddr 192.168.1.0/24&lt;br /&gt;
ct reply ip saddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] daddr &amp;lt;ip destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original ip daddr 192.168.0.1&lt;br /&gt;
ct reply ip daddr 192.168.0.1&lt;br /&gt;
ct original ip daddr 192.168.1.0/24&lt;br /&gt;
ct reply ip daddr 192.168.1.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] l3proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original l3proto ipv4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original protocol 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-dst &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct original proto-dst 22&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| | &#039;&#039;[original | reply] proto-src &amp;lt;port&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ct reply proto-src 53&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Meta ====&lt;br /&gt;
&lt;br /&gt;
[[Matching packet metainformation|&#039;&#039;meta&#039;&#039;]] matches packet by metainformation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|meta match&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifname &amp;lt;input interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta iifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta iifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifname &amp;lt;output interface name&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface name&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifname &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname != &amp;quot;eth0&amp;quot;&lt;br /&gt;
meta oifname {&amp;quot;eth0&amp;quot;, &amp;quot;lo&amp;quot;}&lt;br /&gt;
meta oifname &amp;quot;eth*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iif &amp;lt;input interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iif eth0&lt;br /&gt;
meta iif != eth0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oif &amp;lt;output interface index&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface index&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oif lo&lt;br /&gt;
meta oif != lo&lt;br /&gt;
meta oif {eth0, lo}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iiftype &amp;lt;input interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta iiftype != ether&lt;br /&gt;
meta iiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oiftype &amp;lt;output interface type&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface hardware type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}&lt;br /&gt;
meta oiftype != ether&lt;br /&gt;
meta oiftype ether&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;length &amp;lt;length&amp;gt;&#039;&#039;&lt;br /&gt;
| Length of the packet in bytes&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta length 1000&lt;br /&gt;
meta length != 1000&lt;br /&gt;
meta length &amp;gt; 1000&lt;br /&gt;
meta length 33-45&lt;br /&gt;
meta length != 33-45&lt;br /&gt;
meta length { 33, 55, 67, 88 }&lt;br /&gt;
meta length { 33-55, 67-88 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;protocol &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| ethertype protocol&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta protocol ip&lt;br /&gt;
meta protocol != ip&lt;br /&gt;
meta protocol { ip, arp, ip6, vlan }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;nfproto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta nfproto ipv4&lt;br /&gt;
meta nfproto != ipv6&lt;br /&gt;
meta nfproto { ipv4, ipv6 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;l4proto &amp;lt;protocol&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta l4proto 22&lt;br /&gt;
meta l4proto != 233&lt;br /&gt;
meta l4proto 33-45&lt;br /&gt;
meta l4proto { 33, 55, 67, 88 }&lt;br /&gt;
meta l4proto { 33-55 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;mark [set] &amp;lt;mark&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet mark&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta mark 0x4&lt;br /&gt;
meta mark 0x00000032&lt;br /&gt;
meta mark and 0x03 == 0x01&lt;br /&gt;
meta mark and 0x03 != 0x01&lt;br /&gt;
meta mark != 0x10&lt;br /&gt;
meta mark or 0x03 == 0x01&lt;br /&gt;
meta mark or 0x03 != 0x01&lt;br /&gt;
meta mark xor 0x03 == 0x01&lt;br /&gt;
meta mark xor 0x03 != 0x01&lt;br /&gt;
meta mark set 0xffffffc8 xor 0x16&lt;br /&gt;
meta mark set 0x16 and 0x16&lt;br /&gt;
meta mark set 0xffffffe9 or 0x16&lt;br /&gt;
meta mark set 0xffffffde and 0x16&lt;br /&gt;
meta mark set 0x32 or 0xfffff&lt;br /&gt;
meta mark set 0xfffe xor 0x16&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;priority [set] &amp;lt;priority&amp;gt;&#039;&#039;&lt;br /&gt;
| tc class id&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta priority none&lt;br /&gt;
meta priority 0x1:0x1&lt;br /&gt;
meta priority 0x1:0xffff&lt;br /&gt;
meta priority 0xffff:0xffff&lt;br /&gt;
meta priority set 0x1:0x1&lt;br /&gt;
meta priority set 0x1:0xffff&lt;br /&gt;
meta priority set 0xffff:0xffff&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skuid &amp;lt;user id&amp;gt;&#039;&#039;&lt;br /&gt;
| UID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skuid {bin, root, daemon}&lt;br /&gt;
meta skuid root&lt;br /&gt;
meta skuid != root&lt;br /&gt;
meta skuid lt 3000&lt;br /&gt;
meta skuid gt 3000&lt;br /&gt;
meta skuid eq 3000&lt;br /&gt;
meta skuid 3001-3005&lt;br /&gt;
meta skuid != 2001-2005&lt;br /&gt;
meta skuid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;skgid &amp;lt;group id&amp;gt;&#039;&#039;&lt;br /&gt;
| GID associated with originating socket&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta skgid {bin, root, daemon}&lt;br /&gt;
meta skgid root&lt;br /&gt;
meta skgid != root&lt;br /&gt;
meta skgid lt 3000&lt;br /&gt;
meta skgid gt 3000&lt;br /&gt;
meta skgid eq 3000&lt;br /&gt;
meta skgid 3001-3005&lt;br /&gt;
meta skgid != 2001-2005&lt;br /&gt;
meta skgid { 2001-2005 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rtclassid &amp;lt;class&amp;gt;&#039;&#039;&lt;br /&gt;
| Routing realm&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta rtclassid cosmos&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;pkttype &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| Packet type&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta pkttype broadcast&lt;br /&gt;
meta pkttype != broadcast&lt;br /&gt;
meta pkttype { broadcast, unicast, multicast}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cpu &amp;lt;cpu index&amp;gt;&#039;&#039;&lt;br /&gt;
| CPU ID&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cpu 1&lt;br /&gt;
meta cpu != 1&lt;br /&gt;
meta cpu 1-3&lt;br /&gt;
meta cpu != 1-2&lt;br /&gt;
meta cpu { 2,3 }&lt;br /&gt;
meta cpu { 2-3, 5-7 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;iifgroup &amp;lt;input group&amp;gt;&#039;&#039;&lt;br /&gt;
| Input interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta iifgroup 0&lt;br /&gt;
meta iifgroup != 0&lt;br /&gt;
meta iifgroup default&lt;br /&gt;
meta iifgroup != default&lt;br /&gt;
meta iifgroup {default}&lt;br /&gt;
meta iifgroup { 11,33 }&lt;br /&gt;
meta iifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;oifgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| Output interface group&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta oifgroup 0&lt;br /&gt;
meta oifgroup != 0&lt;br /&gt;
meta oifgroup default&lt;br /&gt;
meta oifgroup != default&lt;br /&gt;
meta oifgroup {default}&lt;br /&gt;
meta oifgroup { 11,33 }&lt;br /&gt;
meta oifgroup {11-33}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;cgroup &amp;lt;group&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
meta cgroup 1048577&lt;br /&gt;
meta cgroup != 1048577&lt;br /&gt;
meta cgroup { 1048577, 1048578 }&lt;br /&gt;
meta cgroup 1048577-1048578&lt;br /&gt;
meta cgroup != 1048577-1048578&lt;br /&gt;
meta cgroup {1048577-1048578}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Statements ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;statement&#039;&#039;&#039; is the action performed when the packet match the rule. It could be &#039;&#039;terminal&#039;&#039; and &#039;&#039;non-terminal&#039;&#039;. In a certain rule we can consider several non-terminal statements but only a single terminal statement.&lt;br /&gt;
&lt;br /&gt;
==== Verdict statements ====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;verdict statement&#039;&#039;&#039; alters control flow in the ruleset and issues policy decisions for packets. The valid verdict statements are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;accept&#039;&#039;: Accept the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;drop&#039;&#039;: Drop the packet and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;queue&#039;&#039;: Queue the packet to userspace and stop the remain rules evaluation.&lt;br /&gt;
* &#039;&#039;continue&#039;&#039;: Continue the ruleset evaluation with the next rule.&lt;br /&gt;
* &#039;&#039;return&#039;&#039;: Return from the current chain and continue at the next rule of the last chain. In a base chain it is equivalent to accept&lt;br /&gt;
* &#039;&#039;jump &amp;lt;chain&amp;gt;&#039;&#039;: Continue at the first rule of &amp;lt;chain&amp;gt;. It will continue at the next rule after a return statement is issued&lt;br /&gt;
* &#039;&#039;goto &amp;lt;chain&amp;gt;&#039;&#039;: Similar to jump, but after the new chain the evaluation will continue at the last chain instead of the one containing the goto statement&lt;br /&gt;
&lt;br /&gt;
==== Log ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|log statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;level [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Log level&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log&lt;br /&gt;
log level emerg&lt;br /&gt;
log level alert&lt;br /&gt;
log level crit&lt;br /&gt;
log level err&lt;br /&gt;
log level warn&lt;br /&gt;
log level notice&lt;br /&gt;
log level info&lt;br /&gt;
log level debug&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;group &amp;lt;value&amp;gt; [queue-threshold &amp;lt;value&amp;gt;] [snaplen &amp;lt;value&amp;gt;] [prefix &amp;quot;&amp;lt;prefix&amp;gt;&amp;quot;]&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
log prefix aaaaa-aaaaaa group 2 snaplen 33&lt;br /&gt;
log group 2 queue-threshold 2&lt;br /&gt;
log group 2 snaplen 33&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Reject ====&lt;br /&gt;
&lt;br /&gt;
The default &#039;&#039;&#039;reject&#039;&#039;&#039; will be the ICMP type &#039;&#039;&#039;port-unreachable&#039;&#039;&#039;. The &#039;&#039;&#039;icmpx&#039;&#039;&#039; is only used for inet family support.&lt;br /&gt;
&lt;br /&gt;
More information on the [[Rejecting_traffic]] page.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|reject statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;with &amp;lt;protocol&amp;gt; type &amp;lt;type&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
reject&lt;br /&gt;
reject with icmp type host-unreachable&lt;br /&gt;
reject with icmp type net-unreachable&lt;br /&gt;
reject with icmp type prot-unreachable&lt;br /&gt;
reject with icmp type port-unreachable&lt;br /&gt;
reject with icmp type net-prohibited&lt;br /&gt;
reject with icmp type host-prohibited&lt;br /&gt;
reject with icmp type admin-prohibited&lt;br /&gt;
reject with icmpv6 type no-route&lt;br /&gt;
reject with icmpv6 type admin-prohibited&lt;br /&gt;
reject with icmpv6 type addr-unreachable&lt;br /&gt;
reject with icmpv6 type port-unreachable&lt;br /&gt;
reject with icmpx type host-unreachable&lt;br /&gt;
reject with icmpx type no-route&lt;br /&gt;
reject with icmpx type admin-prohibited&lt;br /&gt;
reject with icmpx type port-unreachable&lt;br /&gt;
ip protocol tcp reject with tcp reset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Counter ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|counter statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;packets &amp;lt;packets&amp;gt; bytes &amp;lt;bytes&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
counter&lt;br /&gt;
counter packets 0 bytes 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Limit ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|limit statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;rate [over] &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt; [burst &amp;lt;value&amp;gt; &amp;lt;unit&amp;gt;]&#039;&#039;&lt;br /&gt;
| Rate limit&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
limit rate 400/minute&lt;br /&gt;
limit rate 400/hour&lt;br /&gt;
limit rate over 40/day&lt;br /&gt;
limit rate over 400/week&lt;br /&gt;
limit rate over 1023/second burst 10 packets&lt;br /&gt;
limit rate 1025 kbytes/second&lt;br /&gt;
limit rate 1023000 mbytes/second&lt;br /&gt;
limit rate 1025 bytes/second burst 512 bytes&lt;br /&gt;
limit rate 1025 kbytes/second burst 1023 kbytes&lt;br /&gt;
limit rate 1025 mbytes/second burst 1025 kbytes&lt;br /&gt;
limit rate 1025000 mbytes/second burst 1023 mbytes&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Nat ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|nat statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dnat &amp;lt;destination address&amp;gt;&#039;&#039;&lt;br /&gt;
| Destination address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dnat 192.168.3.2&lt;br /&gt;
dnat ct mark map { 0x00000014 : 1.2.3.4}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;snat &amp;lt;ip source address&amp;gt;&#039;&#039;&lt;br /&gt;
| Source address translation&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
snat 192.168.3.2&lt;br /&gt;
snat 2001:838:35f:1::-2001:838:35f:2:::100&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;masquerade [&amp;lt;type&amp;gt;] [to :&amp;lt;port&amp;gt;]&#039;&#039;&lt;br /&gt;
| Masquerade&lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
masquerade&lt;br /&gt;
masquerade persistent,fully-random,random&lt;br /&gt;
masquerade to :1024&lt;br /&gt;
masquerade to :1024-2048&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Queue ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|queue statement&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;num &amp;lt;value&amp;gt; &amp;lt;scheduler&amp;gt;&#039;&#039;&lt;br /&gt;
| &lt;br /&gt;
|&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
queue&lt;br /&gt;
queue num 2&lt;br /&gt;
queue num 2-3&lt;br /&gt;
queue num 4-5 fanout bypass&lt;br /&gt;
queue num 4-5 fanout&lt;br /&gt;
queue num 4-5 bypass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Extras ==&lt;br /&gt;
&lt;br /&gt;
=== Export Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft export (xml | json)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monitor Events ===&lt;br /&gt;
&lt;br /&gt;
Monitor events from Netlink creating filters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft monitor [new | destroy] [tables | chains | sets | rules | elements] [xml | json]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Nft scripting =&lt;br /&gt;
&lt;br /&gt;
== List ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flush ruleset ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Load ruleset ==&lt;br /&gt;
&lt;br /&gt;
Create a command batch file and load it with the nft interpreter,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% echo &amp;quot;flush ruleset&amp;quot; &amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add table filter&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add chain filter input&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% echo &amp;quot;add rule filter input meta iifname lo accept&amp;quot; &amp;gt;&amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/nftables.rules&lt;br /&gt;
&amp;gt; #!/usr/local/sbin/nft -f&lt;br /&gt;
&amp;gt; flush ruleset&lt;br /&gt;
&amp;gt; add table filter&lt;br /&gt;
&amp;gt; add chain filter input&lt;br /&gt;
&amp;gt; add rule filter input meta iifname lo accept&lt;br /&gt;
&amp;gt; EOF&lt;br /&gt;
% chmod u+x /etc/nftables.rules&lt;br /&gt;
% /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or create an executable nft script file from an already created ruleset,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft list ruleset &amp;gt; /etc/nftables.rules&lt;br /&gt;
% nft flush ruleset&lt;br /&gt;
% nft -f /etc/nftables.rules&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
== Simple IP/IPv6 Firewall ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    icmp type echo-request accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table ip6 firewall {&lt;br /&gt;
  chain incoming {&lt;br /&gt;
    type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
    # established/related connections&lt;br /&gt;
    ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
    # invalid connections&lt;br /&gt;
    ct state invalid drop&lt;br /&gt;
&lt;br /&gt;
    # loopback interface&lt;br /&gt;
    iifname lo accept&lt;br /&gt;
&lt;br /&gt;
    # icmp&lt;br /&gt;
    # routers may also want: mld-listener-query, nd-router-solicit&lt;br /&gt;
    icmpv6 type {echo-request,nd-neighbor-solicit} accept&lt;br /&gt;
&lt;br /&gt;
    # open tcp ports: sshd (22), httpd (80)&lt;br /&gt;
    tcp dport {ssh, http} accept&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Mangling_packet_headers&amp;diff=609</id>
		<title>Mangling packet headers</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Mangling_packet_headers&amp;diff=609"/>
		<updated>2020-12-18T18:05:29Z</updated>

		<summary type="html">&lt;p&gt;Pablo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since nft v0.6 nftables supports packet header mangling, including stateless NAT.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: if you mangle packet fields that are included in the [https://en.wikipedia.org/wiki/User_Datagram_Protocol#IPv4_Pseudo_Header layer 4 checksum pseudoheader], then you require a Linux kernel version &amp;gt;= 4.10.&lt;br /&gt;
&lt;br /&gt;
To mangle packet header fields you should create a rule to match the packet, match the desired header field and set a new value to it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add table raw&lt;br /&gt;
% nft add chain raw prerouting {type filter hook prerouting priority -300\;}&lt;br /&gt;
% nft add rule raw prerouting tcp dport 8080 tcp dport set 80&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The commands above create a table named &#039;&#039;raw&#039;&#039;, a chain named &#039;&#039;prerouting&#039;&#039;, see [[Netfilter hooks]], and a rule to mangle the destination port of packets over TCP from 8080 to 80.&lt;br /&gt;
&lt;br /&gt;
= Interactions with conntrack =&lt;br /&gt;
&lt;br /&gt;
Keep in mind the interactions with conntrack, flows with mangled traffic must be [[Setting packet connection tracking metainformation | untracked]]. You can do this in a single rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft add rule ip6 raw prerouting ip6 daddr fd00::1 ip6 daddr set fd00::2 notrack&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more information about packet headers to mangle check manpage nft(8), [[Matching packet header fields]] and [[Quick reference-nftables in 10 minutes]].&lt;/div&gt;</summary>
		<author><name>Pablo</name></author>
	</entry>
</feed>