<?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=Nevola</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=Nevola"/>
	<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php/Special:Contributions/Nevola"/>
	<updated>2026-04-12T18:03:24Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=What_is_nftables%3F&amp;diff=1156</id>
		<title>What is nftables?</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=What_is_nftables%3F&amp;diff=1156"/>
		<updated>2024-12-03T15:49:34Z</updated>

		<summary type="html">&lt;p&gt;Nevola: zevenet repository is obsolete&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= What is nftables? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;nftables&#039;&#039;&#039; is the modern Linux kernel packet classification framework. New code should use it instead of the legacy &lt;br /&gt;
{ip,ip6,arp,eb}_tables (xtables) infrastructure. For existing codebases that have not yet converted, the legacy xtables infrastructure is still maintained as of 2021. Automated tools assist the xtables to nftables conversion process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;nftables&#039;&#039;&#039; in a nutshell:&lt;br /&gt;
&lt;br /&gt;
* It is available in Linux kernels &amp;gt;= 3.13.&lt;br /&gt;
&lt;br /&gt;
* It comes with a new command line utility &#039;&#039;nft&#039;&#039; whose syntax is different to iptables.&lt;br /&gt;
&lt;br /&gt;
* It also comes with a compatibility layer that allows you to run iptables commands over the new nftables kernel framework.&lt;br /&gt;
&lt;br /&gt;
* It provides a generic set infrastructure that allows you to construct maps and concatenations. You can use these new structures to arrange your ruleset in a multidimensional tree which &#039;&#039;&#039;drastically&#039;&#039;&#039; reduces the number of rules that need to be inspected until reaching the final action on a packet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Why nftables? =&lt;br /&gt;
&lt;br /&gt;
We like iptables after all, this tool has been serving us (and will likely keep serving still for a while in many deployments) to filter out traffic on both per-packet and per-flow basis, log suspicious traffic activity, perform NAT and many other things. It comes with more than a hundred of extensions that have been contributed along the last 15 years!. &lt;br /&gt;
&lt;br /&gt;
Nevertheless, the iptables framework suffers from limitations that cannot be easily worked around:&lt;br /&gt;
&lt;br /&gt;
* Avoid code duplication and inconsistencies: Many of the iptables extensions are protocol specific, so there is no a consolidated way to match packet fields, instead we have one extension for each protocol that it supports. This bloats the codebase with very similar code to perform a similar task: payload matching. &lt;br /&gt;
&lt;br /&gt;
* Faster packet classification through enhanced generic set and map infrastructure. &lt;br /&gt;
&lt;br /&gt;
* Simplified dual stack IPv4/IPv6 administration, through the new inet family that allows you to register base chains that see both IPv4 and IPv6 traffic. &lt;br /&gt;
&lt;br /&gt;
* Better dynamic ruleset updates support. &lt;br /&gt;
&lt;br /&gt;
* Provide a Netlink API for third party applications, just as other Linux Networking and Netfilter subsystem do. &lt;br /&gt;
&lt;br /&gt;
* Address syntax inconsistencies and provide nicer and more compact syntax. &lt;br /&gt;
&lt;br /&gt;
These, among other things not listed here, triggered the nftables development which was originally presented to the Netfilter community in the 6th Netfilter Workshop in Paris (France).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Main differences with iptables =&lt;br /&gt;
&lt;br /&gt;
Some key differences between nftables and iptables from the user point of view are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;nftables uses a new syntax&#039;&#039;&#039;. The &#039;&#039;iptables&#039;&#039; command line tool uses a getopt_long()-based parser where keys are always preceded by double minus, eg. &#039;&#039;--key&#039;&#039; or one single minus, eg. &#039;&#039;-p tcp&#039;&#039;. In contrast, nftables uses a compact syntax inspired by &#039;&#039;tcpdump&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tables and chains are fully configurable.&#039;&#039;&#039; &#039;&#039;iptables&#039;&#039; has multiple pre-defined tables and base chains, all of which are registered even if you only need one of them. There have been reports of even unused base chains harming performance. With nftables there are no pre-defined tables or chains. Each table is explicitly defined, and contains only the objects (chains, sets, maps, flowtables and stateful objects) that you explicitly add to it. Now you register only the base chains that you need. You choose table and chain names and netfilter hook priorities that efficiently implement your specific packet processing pipeline.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;A single nftables rule can take multiple actions.&#039;&#039;&#039; Instead of the matches and single target action used in iptables, an nftables rule consists of zero or more expressions followed by one or more statements. Each expression tests whether a packet matches a specific payload field or packet/flow metadata. Multiple expressions are linearly evaluated from left to right: if the first expression matches, then the next expression is evaluated and so on. If we reach the final expression, then the packet matches all of the expressions in the rule, and the rule&#039;s statements are executed. Each statement takes an action, such as setting the netfilter mark, counting the packet, logging the packet, or rendering a verdict such as accepting or dropping the packet or jumping to another chain. As with expressions, multiple statements are linearly evaluated from left to right: a single rule can take multiple actions by using multiple statements. Do note that a verdict statement by its nature ends the rule.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;No built-in counter per chain and rule.&#039;&#039;&#039; In nftables counters are optional, you can enable them as needed.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Better support for dynamic ruleset updates.&#039;&#039;&#039; In contrast to the monolithic blob used by iptables, nftables rulesets are represented internally in a linked list. Now adding or deleting a rule leaves the rest of the ruleset untouched, simplifying maintenance of internal state information.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Simplified dual stack IPv4/IPv6 administration.&#039;&#039;&#039; The nftables &#039;&#039;inet&#039;&#039; family allows you to register base chains that see both IPv4 and IPv6 traffic. It is no longer necessary to rely on scripts to duplicate your ruleset.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;New generic [[sets|set]] infrastructure&#039;&#039;&#039;. This infrastructure integrates tightly into the nftables core and allows advanced configurations such as [[maps]], [[Verdict_Maps_(vmaps) | verdict&amp;amp;nbsp;maps]] and [[intervals]] to achieve performance-oriented packet classification. The most important thing is that you can use &#039;&#039;any&#039;&#039; supported selector to classify traffic.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Support for [[concatenations]].&#039;&#039;&#039; Since Linux kernel 4.1, you can concatenate several keys and combine them with [[maps]] and [[Verdict_Maps_(vmaps) | verdict maps]]. The idea is to build a tuple whose values are hashed to obtain the action to be performed nearly O(1).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Support new protocols without a kernel upgrade&#039;&#039;&#039;. Kernel upgrades can be a time-consuming and daunting task, especially if you have to maintain more than a single firewall in your network. Distribution kernels usually lag the newest release. With the new nftables virtual machine approach, supporting a new protocol will often not require a new kernel, just a relatively simple [[List_of_updates_in_the_nft_command_line_tool|&#039;&#039;nft&#039;&#039; userspace software update]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Adoption =&lt;br /&gt;
&lt;br /&gt;
The Netfilter project and community is focused on replacing the iptables framework with nftables, adding new features and refreshing some workflows along the way.&lt;br /&gt;
&lt;br /&gt;
Many upstream projects use iptables to handle filtering, NAT, mangling and other networking tasks. This page tracks &#039;&#039;&#039;nftables adoption&#039;&#039;&#039; in the wider community.&lt;br /&gt;
&lt;br /&gt;
== Cases ==&lt;br /&gt;
&lt;br /&gt;
Known cases and examples we could heard of. &#039;&#039;&#039;TODO: extend with more current data&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
All major Linux distributions contains the nftables framework ready to use. Check [[Nftables from distributions]].&lt;br /&gt;
&lt;br /&gt;
=== system / firewalling / management ===&lt;br /&gt;
&lt;br /&gt;
==== Supporting nftables ====&lt;br /&gt;
&lt;br /&gt;
The following projects are known to either directly support nftables or have authors actively working on nftables integration.&lt;br /&gt;
&lt;br /&gt;
* https://www.fail2ban.org/ -- the fail2ban tool already includes native support for nftables.&lt;br /&gt;
* https://firewalld.org/ -- firewalld by RedHat is currently developing a native integration with nftables.&lt;br /&gt;
* https://suricata-ids.org/ -- suricata can work natively with nftables ([https://home.regit.org/2014/02/suricata-and-nftables/ link])&lt;br /&gt;
* https://keepalived.org/ -- keepalived works natively with nftables ([https://github.com/acassen/keepalived/issues/924])&lt;br /&gt;
&lt;br /&gt;
==== Supporting iptables only ====&lt;br /&gt;
&lt;br /&gt;
The following projects are known to only support iptables/iptables-nft, with no plans to support nftables in the future.&lt;br /&gt;
&lt;br /&gt;
* http://ferm.foo-projects.org/ -- [https://github.com/MaxKellermann/ferm/issues/35#issuecomment-386091563 citation]&lt;br /&gt;
* https://shorewall.org/ -- [https://sourceforge.net/p/shorewall/mailman/message/35458915/ citation]&lt;br /&gt;
&lt;br /&gt;
=== virtualization / cloud / infrastructure ===&lt;br /&gt;
&lt;br /&gt;
* https://github.com/relianoid/nftlb -- nftlb by [https://www.relianoid.com Relianoid ADC] is a nftables-based loadbalancer which can outperform LVS by 10x&lt;br /&gt;
* https://www.docker.com/ -- Some discussion happened in the Docker community regarding a native integration with nftables, which could ease some of their use cases ([https://github.com/moby/moby/issues/26824 link]) ([https://github.com/robbertkl/docker-ipv6nat/issues/17 link]) ([https://stephank.nl/p/2017-06-05-ipv6-on-production-docker.html running docker with IPv6 using nftables])&lt;br /&gt;
* https://kubernetes.io/ -- Kubernetes does not support nftables yes, but some discussion happened already ([https://github.com/kubernetes/kubernetes/issues/45385 link]). Compat tools may be used to trick kubernetes into using nftables transparently.&lt;br /&gt;
* http://openstack.org/ -- Openstack does not support nftables yet. Compat tools may be used to trick neutron and other components into using nftables transparently.&lt;br /&gt;
* https://libvirt.org/ -- there are reports of people running libvirt with nftables for bridge filtering for virtual machines&lt;br /&gt;
* https://saltstack.com/ -- SaltStack includes native support for nftables ([https://docs.saltstack.com/en/latest/ref/states/all/salt.states.nftables.html link]).&lt;br /&gt;
* https://coreos.com/ -- the CoreOS ecosystem includes native support for nftables ([https://github.com/coreos/coreos-overlay/pull/2662 link])&lt;br /&gt;
&lt;br /&gt;
=== others ===&lt;br /&gt;
&lt;br /&gt;
* https://openwrt.org/ -- there are reports of people running nftables rather than iptables in openwrt systems&lt;br /&gt;
* https://www.cica.es/ -- this regional [https://en.wikipedia.org/wiki/National_research_and_education_network NREN] uses nftables in the datacenter for their perimetral firewalls ([http://workshop.netfilter.org/2017/wiki/index.php/Developer_days.html#nftables_at_CICA.2C_our_experience slides])&lt;br /&gt;
* [[Nftables from distributions]] -- all major Linux distribution already include nftables ready to use&lt;br /&gt;
* https://www.nano-editor.org/ -- The nano editor includes syntax highlighting for nftables in files with .nft name extension or nft shebang&lt;br /&gt;
* https://github.com/nfnty/vim-nftables -- the VIM editor includes syntax highlighting for nftables&lt;br /&gt;
* [https://github.com/ipr-cnrs Institut de Physique de Rennes] -- this french research entity seems to be using nftables with ansible ([https://github.com/ipr-cnrs/nftables link])&lt;br /&gt;
* VPN -- nftables can be combined with other software packages like OpenVPN to build great VPN solutions ([http://ral-arturo.org/2017/04/07/openvpn-debian-stretch.html link])&lt;br /&gt;
* [https://github.com/mdlayher/netlink netlink golang package] -- the Golang Netlink package got batching support to be able to work with nftables ([https://github.com/mdlayher/netlink/issues/81 link])&lt;br /&gt;
* [https://github.com/google/nftables nftables golang library] -- This nftables golang integration library was made by Google&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Moving from iptables to nftables]]&lt;br /&gt;
* [[Moving from ipset to nftables]]&lt;br /&gt;
* [[List of updates since Linux kernel 3.13]]&lt;br /&gt;
* [[Supported features compared to xtables]]&lt;br /&gt;
* [[List of available translations via iptables-translate tool]]&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Adoption&amp;diff=1155</id>
		<title>Adoption</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Adoption&amp;diff=1155"/>
		<updated>2024-12-03T15:47:29Z</updated>

		<summary type="html">&lt;p&gt;Nevola: zevenet repository is obsolete&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Netfilter project and community is focused on replacing the iptables framework with nftables, adding new features and refreshing some workflows along the way.&lt;br /&gt;
&lt;br /&gt;
Many upstream projects use iptables to handle filtering, NAT, mangling and other networking tasks. This page tracks &#039;&#039;&#039;nftables adoption&#039;&#039;&#039; in the wider community.&lt;br /&gt;
&lt;br /&gt;
= Cases =&lt;br /&gt;
&lt;br /&gt;
Known cases and examples we could heard of. &#039;&#039;&#039;TODO: extend with more current data&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
All major Linux distributions contains the nftables framework ready to use. Check [[Nftables from distributions]].&lt;br /&gt;
&lt;br /&gt;
== system / firewalling / management ==&lt;br /&gt;
&lt;br /&gt;
=== Supporting nftables ===&lt;br /&gt;
&lt;br /&gt;
The following projects are known to either directly support nftables or have authors actively working on nftables integration.&lt;br /&gt;
&lt;br /&gt;
* https://www.fail2ban.org/ -- the fail2ban tool already includes native support for nftables.&lt;br /&gt;
* https://firewalld.org/ -- firewalld by RedHat is currently developing a native integration with nftables.&lt;br /&gt;
* https://suricata-ids.org/ -- suricata can work natively with nftables ([https://home.regit.org/2014/02/suricata-and-nftables/ link])&lt;br /&gt;
* https://keepalived.org/ -- keepalived works natively with nftables ([https://github.com/acassen/keepalived/issues/924])&lt;br /&gt;
&lt;br /&gt;
=== Supporting iptables only ===&lt;br /&gt;
&lt;br /&gt;
The following projects are known to only support iptables/iptables-nft, with no plans to support nftables in the future.&lt;br /&gt;
&lt;br /&gt;
* http://ferm.foo-projects.org/ -- [https://github.com/MaxKellermann/ferm/issues/35#issuecomment-386091563 citation]&lt;br /&gt;
* https://shorewall.org/ -- [https://sourceforge.net/p/shorewall/mailman/message/35458915/ citation]&lt;br /&gt;
&lt;br /&gt;
== virtualization / cloud / infrastructure ==&lt;br /&gt;
&lt;br /&gt;
* https://github.com/relianoid/nftlb -- nftlb by [https://www.relianoid.com Relianoid ADC] is a nftables-based loadbalancer&lt;br /&gt;
* https://www.docker.com/ -- Some discussion happened in the Docker community regarding a native integration with nftables, which could ease some of their use cases ([https://github.com/moby/moby/issues/26824 link]) ([https://github.com/robbertkl/docker-ipv6nat/issues/17 link]) ([https://stephank.nl/p/2017-06-05-ipv6-on-production-docker.html running docker with IPv6 using nftables])&lt;br /&gt;
* https://kubernetes.io/ -- Kubernetes does not support nftables yes, but some discussion happened already ([https://github.com/kubernetes/kubernetes/issues/45385 link]). Compat tools may be used to trick kubernetes into using nftables transparently.&lt;br /&gt;
* http://openstack.org/ -- Openstack does not support nftables yet. Compat tools may be used to trick neutron and other components into using nftables transparently.&lt;br /&gt;
* https://libvirt.org/ -- there are reports of people running libvirt with nftables for bridge filtering for virtual machines&lt;br /&gt;
* https://saltstack.com/ -- SaltStack includes native support for nftables ([https://docs.saltstack.com/en/latest/ref/states/all/salt.states.nftables.html link]).&lt;br /&gt;
* https://coreos.com/ -- the CoreOS ecosystem includes native support for nftables ([https://github.com/coreos/coreos-overlay/pull/2662 link])&lt;br /&gt;
&lt;br /&gt;
== others ==&lt;br /&gt;
&lt;br /&gt;
* https://openwrt.org/ -- there are reports of people running nftables rather than iptables in openwrt systems&lt;br /&gt;
* https://www.cica.es/ -- this regional [https://en.wikipedia.org/wiki/National_research_and_education_network NREN] uses nftables in the datacenter for their perimetral firewalls ([http://workshop.netfilter.org/2017/wiki/index.php/Developer_days.html#nftables_at_CICA.2C_our_experience slides])&lt;br /&gt;
* [[Nftables from distributions]] -- all major Linux distribution already include nftables ready to use&lt;br /&gt;
* https://www.nano-editor.org/ -- The nano editor includes syntax highlighting for nftables in files with .nft name extension or nft shebang&lt;br /&gt;
* https://github.com/nfnty/vim-nftables -- the VIM editor includes syntax highlighting for nftables&lt;br /&gt;
* [https://github.com/ipr-cnrs Institut de Physique de Rennes] -- this french research entity seems to be using nftables with ansible ([https://github.com/ipr-cnrs/nftables link])&lt;br /&gt;
* VPN -- nftables can be combined with other software packages like OpenVPN to build great VPN solutions ([http://ral-arturo.org/2017/04/07/openvpn-debian-stretch.html link])&lt;br /&gt;
* [https://github.com/mdlayher/netlink netlink golang package] -- the Golang Netlink package got batching support to be able to work with nftables ([https://github.com/mdlayher/netlink/issues/81 link])&lt;br /&gt;
* [https://github.com/google/nftables nftables golang library] -- This nftables golang integration library was made by Google&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Moving from iptables to nftables]]&lt;br /&gt;
* [[Moving from ipset to nftables]]&lt;br /&gt;
* [[List of updates since Linux kernel 3.13]]&lt;br /&gt;
* [[Supported features compared to xtables]]&lt;br /&gt;
* [[List of available translations via iptables-translate tool]]&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Scripting&amp;diff=754</id>
		<title>Scripting</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Scripting&amp;diff=754"/>
		<updated>2021-02-19T18:47:12Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* Including files */ According to the comment, it was expected a directory not a file&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;
= 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>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Nftables_from_distributions&amp;diff=658</id>
		<title>Nftables from distributions</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Nftables_from_distributions&amp;diff=658"/>
		<updated>2021-02-09T19:29:44Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* ubuntu */ fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Most major Linux distributions have support for nftables:&lt;br /&gt;
* they include a kernel with nf_tables support&lt;br /&gt;
* they include userspace support&lt;br /&gt;
&lt;br /&gt;
Normally, you can get nftables working just by installing the software using the corresponding package manager.&lt;br /&gt;
&lt;br /&gt;
Be aware that distributions commonly don&#039;t use the absolute last version of nftables or the linux kernel.&lt;br /&gt;
If you need latest version of the framework, you may need [[Building and installing nftables from sources]].&lt;br /&gt;
&lt;br /&gt;
For reference, here are some links where you can get distribution-specific info about nftables.&lt;br /&gt;
&lt;br /&gt;
== debian ==&lt;br /&gt;
Debian includes latests nftables also in &#039;stable-backports&#039;, so you don&#039;t need to run &#039;testing&#039; to get nftables.&lt;br /&gt;
&lt;br /&gt;
* wiki page: https://wiki.debian.org/nftables&lt;br /&gt;
* kernel package: https://tracker.debian.org/pkg/linux&lt;br /&gt;
* libnftnl: https://tracker.debian.org/pkg/libnftnl&lt;br /&gt;
* nft utility: https://tracker.debian.org/pkg/nftables&lt;br /&gt;
&lt;br /&gt;
By the way, nf_tables is the default iptables backend starting with Debian Buster.&lt;br /&gt;
&lt;br /&gt;
== arch linux ==&lt;br /&gt;
* wiki page: https://wiki.archlinux.org/index.php/Nftables&lt;br /&gt;
* kernel package: https://www.archlinux.org/packages/core/x86_64/linux/&lt;br /&gt;
* nft utility: https://www.archlinux.org/packages/extra/x86_64/nftables/&lt;br /&gt;
* libnftnl: https://www.archlinux.org/packages/extra/x86_64/libnftnl/&lt;br /&gt;
&lt;br /&gt;
== ubuntu ==&lt;br /&gt;
* kernel package: https://launchpad.net/ubuntu/+source/linux&lt;br /&gt;
* nft utility: https://launchpad.net/ubuntu/+source/nftables&lt;br /&gt;
* libnftnl: https://launchpad.net/ubuntu/+source/libnftnl&lt;br /&gt;
&lt;br /&gt;
== fedora ==&lt;br /&gt;
* kernel package: https://src.fedoraproject.org/rpms/kernel&lt;br /&gt;
* nft utlity: https://src.fedoraproject.org/rpms/nftables&lt;br /&gt;
* libnftnl: https://src.fedoraproject.org/rpms/libnftnl&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Building_and_installing_nftables_from_sources&amp;diff=657</id>
		<title>Building and installing nftables from sources</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Building_and_installing_nftables_from_sources&amp;diff=657"/>
		<updated>2021-02-09T18:57:28Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* Installing from git */ fix git URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;nftables requires several userspace libraries, the &#039;nft&#039; userspace command line utility and the kernel modules.&lt;br /&gt;
&lt;br /&gt;
If you are using a major linux distribution, you may consider using [[nftables from distributions]].&lt;br /&gt;
&lt;br /&gt;
= Installing userspace libraries =&lt;br /&gt;
&lt;br /&gt;
You have to install the following userspace libraries:&lt;br /&gt;
&lt;br /&gt;
* [http://www.netfilter.org/projects/libmnl libmnl ], this library provides the interfaces to communicate kernel and userspace via Netlink. &#039;&#039;It is very likely that your distribution already provides a package for libmnl that you can use&#039;&#039;. If you decide to use your distributor package, make sure you install the development package as well.&lt;br /&gt;
&lt;br /&gt;
* [http://www.netfilter.org/projects/libnftnl libnftnl], this library provides the low-level API to transform netlink messages to objects.&lt;br /&gt;
&lt;br /&gt;
You also need &#039;&#039;libgmp&#039;&#039; and &#039;&#039;libreadline&#039;&#039;, most distributions already provide packages for these two libraries, so make sure you install the development extensions of this packages to successfully compile &#039;&#039;nftables&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If you plan to give a test to &#039;&#039;nftables&#039;&#039;, we recommend you to use git snapshots for &#039;&#039;libnftnl&#039;&#039; and &#039;&#039;nft&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Installing userspace libraries from git ==&lt;br /&gt;
&lt;br /&gt;
To install &#039;&#039;libnftnl&#039;&#039;, to can type these magic spells:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone git://git.netfilter.org/libnftnl&lt;br /&gt;
$ cd libnftnl&lt;br /&gt;
$ sh autogen.sh&lt;br /&gt;
$ ./configure&lt;br /&gt;
$ make&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
If you are working behind proxy than it might possible that you are not able to clone using git protocol so try to clone using &amp;quot;http/https:&amp;quot; instead &amp;quot;git:&amp;quot;&lt;br /&gt;
&amp;lt;br &amp;gt; Reasons:- 1) The git protocol, by default, uses the port 9418. It might possible that your traffic is blocked on that port.&lt;br /&gt;
&amp;lt;br &amp;gt; 2) Also take help and can relate from the [http://stackoverflow.com/a/28494985 solution] &lt;br /&gt;
&lt;br /&gt;
If you have any compilation problem, please report them to the [https://www.netfilter.org/mailinglists.html netfilter developer mailing list] providing as much detailed information as possible.&lt;br /&gt;
&lt;br /&gt;
== Installing userspace libraries from snapshots ==&lt;br /&gt;
&lt;br /&gt;
You can retrieve daily snapshots of this library from the [ftp://ftp.netfilter.org/pub/libnftnl/snapshot/ Netfilter FTP]. Then, to install it you have to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ wget ftp://ftp.netfilter.org/pub/libnftnl/snapshot/libnftnl-20140217.tar.bz2&lt;br /&gt;
$ tar xvjf libnftnl-20140217.tar.bz2&lt;br /&gt;
$ ./configure&lt;br /&gt;
$ make&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installing userspace nft command line utility =&lt;br /&gt;
&lt;br /&gt;
This is the command line utility that provides a user interface to configure &#039;&#039;nftables&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Installing from git ==&lt;br /&gt;
&lt;br /&gt;
Just type these commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% git clone git://git.netfilter.org/nftables&lt;br /&gt;
% cd nftables&lt;br /&gt;
% sh autogen.sh&lt;br /&gt;
% ./configure&lt;br /&gt;
% make&lt;br /&gt;
% make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should check that &#039;&#039;nft&#039;&#039; is installed in your system by typing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft&lt;br /&gt;
nft: no command specified&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That means &#039;&#039;nft&#039;&#039; has been correctly installed.&lt;br /&gt;
&lt;br /&gt;
= Installing Linux kernel with nftables support =&lt;br /&gt;
&lt;br /&gt;
Prerequisites: nftables is available in Linux kernels since version 3.13 but this is software under development, so we encourage you to run the latest stable kernel.&lt;br /&gt;
&lt;br /&gt;
== Validating your installation ==&lt;br /&gt;
&lt;br /&gt;
You can validate that your installation is working by checking if you can install the &#039;nf_tables&#039; kernel module.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% modprobe nf_tables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you can check that&#039;s actually there via &#039;&#039;lsmod&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# lsmod | grep nf_tables&lt;br /&gt;
nf_tables              42349  0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure you also have loaded the family support, eg.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% modprobe nf_tables_ipv4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;lsmod&#039;&#039; command should show something like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# lsmod | grep nf_tables&lt;br /&gt;
nf_tables_ipv4         12869  0 &lt;br /&gt;
nf_tables              42349  1 nf_tables_ipv4&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other family modules are &#039;&#039;nf_tables_ipv6&#039;&#039;, &#039;&#039;nf_tables_bridge&#039;&#039;, &#039;&#039;nf_tables_arp&#039;&#039; and (since Linux kernel &amp;gt;= 3.14) &#039;&#039;nf_tables_inet&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
These modules provide the corresponding [[Configuring_tables|table]] and the filter [[Configuring_chains|chain]] support for the given family.&lt;br /&gt;
&lt;br /&gt;
You could also check which modules are supported by your current kernel. How to to do this, depends on your distro:&lt;br /&gt;
* on debian, look in /boot/config-XXX-YYY, where XXX is your kernel package version, and YYY is your arch, e.g. /boot/config-4.2.0-1-amd64&lt;br /&gt;
* on Arch, look in /proc/config.gz. As this is compressed, use a command such as zcat or zgrep.&lt;br /&gt;
&lt;br /&gt;
In the debian example below, CONFIG_NFT_REDIR_IPV4 and CONFIG_NFT_REDIR_IPV6 are not set, so you can&#039;t use [http://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_(NAT)#Redirect redirect] in the ruleset:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% grep CONFIG_NFT_ /boot/config-4.2.0-1-amd64&lt;br /&gt;
CONFIG_NFT_EXTHDR=m&lt;br /&gt;
CONFIG_NFT_META=m&lt;br /&gt;
CONFIG_NFT_CT=m&lt;br /&gt;
CONFIG_NFT_RBTREE=m&lt;br /&gt;
CONFIG_NFT_HASH=m&lt;br /&gt;
CONFIG_NFT_COUNTER=m&lt;br /&gt;
CONFIG_NFT_LOG=m&lt;br /&gt;
CONFIG_NFT_LIMIT=m&lt;br /&gt;
CONFIG_NFT_MASQ=m&lt;br /&gt;
CONFIG_NFT_REDIR=m&lt;br /&gt;
CONFIG_NFT_NAT=m&lt;br /&gt;
CONFIG_NFT_QUEUE=m&lt;br /&gt;
CONFIG_NFT_REJECT=m&lt;br /&gt;
CONFIG_NFT_REJECT_INET=m&lt;br /&gt;
CONFIG_NFT_COMPAT=m&lt;br /&gt;
CONFIG_NFT_CHAIN_ROUTE_IPV4=m&lt;br /&gt;
CONFIG_NFT_REJECT_IPV4=m&lt;br /&gt;
CONFIG_NFT_CHAIN_NAT_IPV4=m&lt;br /&gt;
CONFIG_NFT_MASQ_IPV4=m&lt;br /&gt;
# CONFIG_NFT_REDIR_IPV4 is not set&lt;br /&gt;
CONFIG_NFT_CHAIN_ROUTE_IPV6=m&lt;br /&gt;
CONFIG_NFT_REJECT_IPV6=m&lt;br /&gt;
CONFIG_NFT_CHAIN_NAT_IPV6=m&lt;br /&gt;
CONFIG_NFT_MASQ_IPV6=m&lt;br /&gt;
# CONFIG_NFT_REDIR_IPV6 is not set&lt;br /&gt;
CONFIG_NFT_BRIDGE_META=m&lt;br /&gt;
CONFIG_NFT_BRIDGE_REJECT=m&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing from git ==&lt;br /&gt;
&lt;br /&gt;
This is slower as you will retrieve the Linux kernel git tree for nftables:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After retrieving the git tree, you have to follow the same steps described in the installation from sources.&lt;br /&gt;
&lt;br /&gt;
But you will get the most recent changes for the &#039;&#039;nftables&#039;&#039; kernel code there.&lt;br /&gt;
&lt;br /&gt;
When configuring the kernel, be sure to enable all the nftables modules (choose &#039;m&#039; or &#039;y&#039;). This is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ make oldconfig&lt;br /&gt;
&lt;br /&gt;
Netfilter Xtables support (required for ip_tables) (NETFILTER_XTABLES) [M/y/?] m&lt;br /&gt;
Netfilter nf_tables support (NF_TABLES) [N/m] (NEW) m&lt;br /&gt;
  Netfilter nf_tables payload module (NFT_PAYLOAD) [N/m] (NEW) m&lt;br /&gt;
  Netfilter nf_tables IPv6 exthdr module (NFT_EXTHDR) [N/m] (NEW) m&lt;br /&gt;
  Netfilter nf_tables meta module (NFT_META) [N/m] (NEW) m&lt;br /&gt;
  Netfilter nf_tables conntrack module (NFT_CT) [N/m] (NEW) m&lt;br /&gt;
  Netfilter nf_tables rbtree set module (NFT_RBTREE) [N/m] (NEW) m&lt;br /&gt;
  Netfilter nf_tables hash set module (NFT_HASH) [N/m] (NEW) m&lt;br /&gt;
  Netfilter nf_tables counter module (NFT_COUNTER) [N/m] (NEW) m&lt;br /&gt;
  Netfilter nf_tables log module (NFT_LOG) [N/m] (NEW) m&lt;br /&gt;
  Netfilter nf_tables limit module (NFT_LIMIT) [N/m] (NEW) m&lt;br /&gt;
  Netfilter nf_tables nat module (NFT_NAT) [N/m] (NEW) m&lt;br /&gt;
  Netfilter x_tables over nf_tables module (NFT_COMPAT) [N/m/?] (NEW) m&lt;br /&gt;
&lt;br /&gt;
IPv4 nf_tables support (NF_TABLES_IPV4) [N/m] (NEW) m&lt;br /&gt;
  nf_tables IPv4 reject support (NFT_REJECT_IPV4) [N/m] (NEW) m&lt;br /&gt;
  IPv4 nf_tables route chain support (NFT_CHAIN_ROUTE_IPV4) [N/m] (NEW) m&lt;br /&gt;
  IPv4 nf_tables nat chain support (NFT_CHAIN_NAT_IPV4) [N/m] (NEW) m&lt;br /&gt;
&lt;br /&gt;
IPv6 nf_tables support (NF_TABLES_IPV6) [M/n] m&lt;br /&gt;
  IPv6 nf_tables route chain support (NFT_CHAIN_ROUTE_IPV6) [M/n] m&lt;br /&gt;
  IPv6 nf_tables nat chain support (NFT_CHAIN_NAT_IPV6) [M/n] m&lt;br /&gt;
&lt;br /&gt;
Ethernet Bridge nf_tables support (NF_TABLES_BRIDGE) [N/m/y] (NEW) m&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=504</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=504"/>
		<updated>2020-05-22T10:01:48Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* Reject */ Add link to local page.&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] 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 saddr 192.168.0.1&lt;br /&gt;
ct reply saddr 192.168.0.1&lt;br /&gt;
ct original saddr 192.168.1.0/24&lt;br /&gt;
ct reply 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 daddr 192.168.0.1&lt;br /&gt;
ct reply daddr 192.168.0.1&lt;br /&gt;
ct original daddr 192.168.1.0/24&lt;br /&gt;
ct reply 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;
&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>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Rejecting_traffic&amp;diff=503</id>
		<title>Rejecting traffic</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Rejecting_traffic&amp;diff=503"/>
		<updated>2020-05-22T09:59:24Z</updated>

		<summary type="html">&lt;p&gt;Nevola: fix typo, include default option and improve formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note&#039;&#039;&#039;: Full reject support is available since Linux kernel 3.18.&lt;br /&gt;
&lt;br /&gt;
The following rule shows how to reject any traffic from the network:&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 reject&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t specify any reason, an ICMP/ICMPv6 port unreachable packet is sent to the origin.&lt;br /&gt;
&lt;br /&gt;
You can narrow down this through the [[matching connection tracking stateful metainformation|ct]] selector, so this only rejects traffic coming to the local machine which was &#039;&#039;&#039;not&#039;&#039;&#039; originated from us.&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 ct state new reject&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also specify the reject reason. 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 filter input reject with icmp type host-unreachable&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For ICMP, you can use the following reject reasons:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;net-unreachable&#039;&#039;&#039;: Destination network unreachable&lt;br /&gt;
* &#039;&#039;&#039;host-unreachable&#039;&#039;&#039;: Destination host unreachable&lt;br /&gt;
* &#039;&#039;&#039;prot-unreachable&#039;&#039;&#039;: Destination protocol unreachable&lt;br /&gt;
* &#039;&#039;&#039;port-unreachable&#039;&#039;&#039;: Destination port unreachable (this is the default)&lt;br /&gt;
* &#039;&#039;&#039;net-prohibited&#039;&#039;&#039;: Network administratively prohibited&lt;br /&gt;
* &#039;&#039;&#039;host-prohibited&#039;&#039;&#039;: Host administratively prohibited&lt;br /&gt;
* &#039;&#039;&#039;admin-prohibited&#039;&#039;&#039;: Communication administratively prohibited&lt;br /&gt;
&lt;br /&gt;
You can also reject IPv6 traffic indicating the reject reason, 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 ip6 filter input reject with icmpv6 type no-route&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For ICMPv6, you can use the following reasons:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no-route&#039;&#039;&#039;: No route to destination.&lt;br /&gt;
* &#039;&#039;&#039;admin-prohibited&#039;&#039;&#039;: Communication with destination administratively prohibited&lt;br /&gt;
* &#039;&#039;&#039;addr-unreachable&#039;&#039;&#039;: Address unreachable&lt;br /&gt;
* &#039;&#039;&#039;port-unreachable&#039;&#039;&#039;: Port unreachable&lt;br /&gt;
&lt;br /&gt;
From the inet family, you can use an abstraction, the so-called &#039;&#039;icmpx&#039;&#039;, to reject the IPv4 and IPv6 traffic&lt;br /&gt;
using one single rule. 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 inet filter input reject with icmpx type no-route&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rule rejects IPv4 traffic with the reason &amp;quot;net unreachable&amp;quot; and the IPv6 traffic with the reason &amp;quot;no route&amp;quot;. The mapping is shown in the following table:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;ICMPX REASON&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;ICMPv6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;ICMPv4&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|admin-prohibited&lt;br /&gt;
|admin-prohibited&lt;br /&gt;
|admin-prohibited&lt;br /&gt;
|-&lt;br /&gt;
|port-unreachable&lt;br /&gt;
|port-unreachable&lt;br /&gt;
|port-unreachable&lt;br /&gt;
|-&lt;br /&gt;
|no-route&lt;br /&gt;
|no-route&lt;br /&gt;
|net-unreachable&lt;br /&gt;
|-&lt;br /&gt;
|host-unreachable&lt;br /&gt;
|addr-unreachable&lt;br /&gt;
|host-unreachable&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Quick_reference-nftables_in_10_minutes&amp;diff=502</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=502"/>
		<updated>2020-05-22T09:50:42Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* Reject */&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] 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 saddr 192.168.0.1&lt;br /&gt;
ct reply saddr 192.168.0.1&lt;br /&gt;
ct original saddr 192.168.1.0/24&lt;br /&gt;
ct reply 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 daddr 192.168.0.1&lt;br /&gt;
ct reply daddr 192.168.0.1&lt;br /&gt;
ct original daddr 192.168.1.0/24&lt;br /&gt;
ct reply 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;
&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;
{| 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>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Element_timeouts&amp;diff=500</id>
		<title>Element timeouts</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Element_timeouts&amp;diff=500"/>
		<updated>2020-04-06T08:06:29Z</updated>

		<summary type="html">&lt;p&gt;Nevola: complete description of timeout and expires in a set&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;set&#039;&#039;&#039; infrastructure support establishing timeouts. A given timed &#039;&#039;&#039;set element&#039;&#039;&#039; has 2 attributes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;timeout&#039;&#039;&#039;: This time value, in seconds (10s), in minutes (12m), in hours (2h) or combination of all of them (2h12m10s), does not change and will be used to reset the &#039;&#039;&#039;expires&#039;&#039;&#039; value when required.&lt;br /&gt;
* &#039;&#039;&#039;expires&#039;&#039;&#039;: This value is a countdown time counter which starts with the &#039;&#039;&#039;timeout&#039;&#039;&#039; value, and could be reset from the packet path or the element will be deleted when it reaches the 0 value.&lt;br /&gt;
&lt;br /&gt;
Example, with per-element timeout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add table inet myfilter&lt;br /&gt;
% nft add set inet myfilter myset {type ipv4_addr\; flags timeout\; }&lt;br /&gt;
% nft add element inet myfilter myset {10.0.0.1 timeout 10s }&lt;br /&gt;
% nft list ruleset&lt;br /&gt;
table inet myfilter {&lt;br /&gt;
	set myset {&lt;br /&gt;
		type ipv4_addr&lt;br /&gt;
		flags timeout&lt;br /&gt;
		elements = { 10.0.0.1 timeout 10s expires 8s}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;timeout&#039;&#039;&#039; and &#039;&#039;&#039;expires&#039;&#039;&#039; parameters cannot be modified in this case. The element should be recreated again if you need to reset them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft delete element inet myfilter myset { 10.0.0.1 }&lt;br /&gt;
% nft add element inet myfilter myset { 10.0.0.1 timeout 7s expires 5s }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to be able to reset it from packet path among other things you can use this feature by [[Updating sets from the packet path]].&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Element_timeouts&amp;diff=499</id>
		<title>Element timeouts</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Element_timeouts&amp;diff=499"/>
		<updated>2020-04-05T17:52:38Z</updated>

		<summary type="html">&lt;p&gt;Nevola: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;set&#039;&#039;&#039; infrastructure support establishing timeouts. A given &#039;&#039;&#039;set element&#039;&#039;&#039; which is given a &#039;&#039;&#039;timeout&#039;&#039;&#039; will be deleted from the &#039;&#039;&#039;set&#039;&#039;&#039; after the timeout expires.&lt;br /&gt;
&lt;br /&gt;
Example, with per-element timeout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
% nft add table inet myfilter&lt;br /&gt;
% nft add set inet myfilter myset {type ipv4_addr\; flags timeout\; }&lt;br /&gt;
% nft add element inet myfilter myset {10.0.0.1 timeout 10s }&lt;br /&gt;
% nft list ruleset&lt;br /&gt;
table inet myfilter {&lt;br /&gt;
	set myset {&lt;br /&gt;
		type ipv4_addr&lt;br /&gt;
		flags timeout&lt;br /&gt;
		elements = { 10.0.0.1 timeout 10s expires 8s}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;timeout&#039;&#039;&#039; and &#039;&#039;&#039;expires&#039;&#039;&#039; parameters cannot be modified in this case. The element should be recreated again if you need to reset them. In order to be able to reset it from packet path among other things you can use this feature by [[Updating sets from the packet path]].&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=449</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=449"/>
		<updated>2019-08-06T14:09:05Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* Doing connlimit with nft */ fix small typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meters ==&lt;br /&gt;
&lt;br /&gt;
Meters used to be known as &#039;&#039;flow tables&#039;&#039; before nft v0.8.1 and Linux kernel 4.3, and are a way to use maps with stateful objects.&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 map my_filter_table my_ssh_meter&lt;br /&gt;
table ip my_filter_table {&lt;br /&gt;
	map my_ssh_meter {&lt;br /&gt;
		type ipv4_addr . inet_service&lt;br /&gt;
                size 65535&lt;br /&gt;
		flags dynamic,timeout&lt;br /&gt;
		elements = { 64.62.190.36 . 55000 expires 38s : counter packets 2 bytes 220, 83.98.201.47 . 35460 expires 39s : counter packets 10 bytes 5988, 172.217.7.142 . 43254 expires 46s : counter packets 1 bytes 98}&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;
== 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>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=448</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=448"/>
		<updated>2019-08-06T14:07:44Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* Doing connlimit with nft */ use &amp;quot;my&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meters ==&lt;br /&gt;
&lt;br /&gt;
Meters used to be known as &#039;&#039;flow tables&#039;&#039; before nft v0.8.1 and Linux kernel 4.3, and are a way to use maps with stateful objects.&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 map my_filter_table my_ssh_meter&lt;br /&gt;
table ip my_filter_table {&lt;br /&gt;
	map my_ssh_meter {&lt;br /&gt;
		type ipv4_addr . inet_service&lt;br /&gt;
                size 65535&lt;br /&gt;
		flags dynamic,timeout&lt;br /&gt;
		elements = { 64.62.190.36 . 55000 expires 38s : counter packets 2 bytes 220, 83.98.201.47 . 35460 expires 39s : counter packets 10 bytes 5988, 172.217.7.142 . 43254 expires 46s : counter packets 1 bytes 98}&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 connection 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;
== 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>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=447</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=447"/>
		<updated>2019-08-06T14:03:06Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* Listing meters */ update with &amp;quot;my&amp;quot; and update new syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meters ==&lt;br /&gt;
&lt;br /&gt;
Meters used to be known as &#039;&#039;flow tables&#039;&#039; before nft v0.8.1 and Linux kernel 4.3, and are a way to use maps with stateful objects.&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 map my_filter_table my_ssh_meter&lt;br /&gt;
table ip my_filter_table {&lt;br /&gt;
	map my_ssh_meter {&lt;br /&gt;
		type ipv4_addr . inet_service&lt;br /&gt;
                size 65535&lt;br /&gt;
		flags dynamic,timeout&lt;br /&gt;
		elements = { 64.62.190.36 . 55000 expires 38s : counter packets 2 bytes 220, 83.98.201.47 . 35460 expires 39s : counter packets 10 bytes 5988, 172.217.7.142 . 43254 expires 46s : counter packets 1 bytes 98}&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 filter {&lt;br /&gt;
        set 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 y {&lt;br /&gt;
                type filter hook output priority filter; policy accept;&lt;br /&gt;
                ct state new add @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 connection 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;
== 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>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=446</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=446"/>
		<updated>2019-08-06T14:00:33Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* Using meters */ use &amp;quot;my&amp;quot; and fix some incorrect syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meters ==&lt;br /&gt;
&lt;br /&gt;
Meters used to be known as &#039;&#039;flow tables&#039;&#039; before nft v0.8.1 and Linux kernel 4.3, and are a way to use maps with stateful objects.&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 map filter ssh-meter&lt;br /&gt;
table ip filter {&lt;br /&gt;
	map ssh-meter {&lt;br /&gt;
		type iface_index . ipv4_addr . inet_service&lt;br /&gt;
		flags timeout&lt;br /&gt;
		elements = { &amp;quot;wlan1&amp;quot; . 64.62.190.36 . 55000 expires 38s : counter packets 2 bytes 220, &amp;quot;wlan1&amp;quot; . 83.98.201.47 . 35460 expires 39s : counter packets 10 bytes 5988, &amp;quot;wlan1&amp;quot; . 172.217.7.142 . 43254 expires 46s : counter packets 1 bytes 98}&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 filter {&lt;br /&gt;
        set 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 y {&lt;br /&gt;
                type filter hook output priority filter; policy accept;&lt;br /&gt;
                ct state new add @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 connection 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;
== 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>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=445</id>
		<title>Meters</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Meters&amp;diff=445"/>
		<updated>2019-08-06T13:21:55Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* Meters */, make it more readable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Meters ==&lt;br /&gt;
&lt;br /&gt;
Meters used to be known as &#039;&#039;flow tables&#039;&#039; before nft v0.8.1 and Linux kernel 4.3, and are a way to use maps with stateful objects.&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;filter&#039;&#039;, a chain named &#039;&#039;input&#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 filter&lt;br /&gt;
% nft add chain filter input {type filter hook input priority 0\;}&lt;br /&gt;
% nft add map filter ssh-meter { type ipv4_addr : limit; }&lt;br /&gt;
% nft add rule filter input tcp dport 22 ct state new update @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;  &#039;&#039;ssh&#039;&#039; (port 22) connections, which uses a meter named &#039;&#039;ssh-meter&#039;&#039; to limit the traffic rate to 10 packets 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 rule filter input tcp dport 22 ct state new update @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 packets based on the tuple &#039;&#039;(input interface index, 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 map filter ssh-meter&lt;br /&gt;
table ip filter {&lt;br /&gt;
	map ssh-meter {&lt;br /&gt;
		type iface_index . ipv4_addr . inet_service&lt;br /&gt;
		flags timeout&lt;br /&gt;
		elements = { &amp;quot;wlan1&amp;quot; . 64.62.190.36 . 55000 expires 38s : counter packets 2 bytes 220, &amp;quot;wlan1&amp;quot; . 83.98.201.47 . 35460 expires 39s : counter packets 10 bytes 5988, &amp;quot;wlan1&amp;quot; . 172.217.7.142 . 43254 expires 46s : counter packets 1 bytes 98}&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 filter {&lt;br /&gt;
        set 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 y {&lt;br /&gt;
                type filter hook output priority filter; policy accept;&lt;br /&gt;
                ct state new add @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 connection 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;
== 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>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Supported_features_compared_to_xtables&amp;diff=342</id>
		<title>Supported features compared to xtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Supported_features_compared_to_xtables&amp;diff=342"/>
		<updated>2018-08-19T17:03:06Z</updated>

		<summary type="html">&lt;p&gt;Nevola: fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Last update: Aug/2018&lt;br /&gt;
                                                                                 &lt;br /&gt;
This page tracks the list of supported and unsupported extensions with comments and suggestions.&lt;br /&gt;
                                                                                 &lt;br /&gt;
== Unsupported extensions ==                                                     &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches: xt ===                                                              &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== bpf ====                                                                    &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== cluster ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== rateest ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== string ====                                                                 &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== time ====&lt;br /&gt;
* consider native interface                                                    &lt;br /&gt;
==== u32 ====                                                                    &lt;br /&gt;
* raw expressions?                                                               &lt;br /&gt;
&lt;br /&gt;
=== targets: xt ===                                                              &lt;br /&gt;
                                                         &lt;br /&gt;
==== CHECKSUM ====                                                               &lt;br /&gt;
* add nft_payload.&lt;br /&gt;
* To the day, the only use case for this was DHCP clients not working with partial checksums. That should be fixed nowadays.&lt;br /&gt;
* See https://lwn.net/Articles/396466/ and https://www.spinics.net/lists/kvm/msg37660.html&lt;br /&gt;
* See https://bugs.launchpad.net/ubuntu/+source/isc-dhcp/+bug/930962 and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=832090&lt;br /&gt;
&lt;br /&gt;
==== CONNSECMARK ====&lt;br /&gt;
* nft_ct                                                                      &lt;br /&gt;
==== CT ====                                                                     &lt;br /&gt;
* nft_ct_target. Refer to [[Matching_connection_tracking_stateful_metainformation]].                                              &lt;br /&gt;
==== IDLETIMER ====                                                              &lt;br /&gt;
* consider native interface&lt;br /&gt;
==== LED ====                                                                    &lt;br /&gt;
* consider native (need this?)                                                   &lt;br /&gt;
==== NETMAP ====                                                                 &lt;br /&gt;
* nft_nat.                                                                       &lt;br /&gt;
==== RATEEST ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== SECMARK ====                                                                &lt;br /&gt;
* nft_meta_target&lt;br /&gt;
==== SET ====                                                                 &lt;br /&gt;
* consider native interface &lt;br /&gt;
==== SYNPROXY ====                                                                 &lt;br /&gt;
* consider native interface                                                                 &lt;br /&gt;
==== TCPOPTSTRIP ====                                                            &lt;br /&gt;
* consider native interface, need to extend nft_exthdr.c&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== TTL ====&lt;br /&gt;
                                                                                 &lt;br /&gt;
=== targets: ipv6 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== NPT ====                                                                    &lt;br /&gt;
* consider native interface&lt;br /&gt;
&lt;br /&gt;
=== targets: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== arpreply ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
&lt;br /&gt;
=== watchers: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== log ====&lt;br /&gt;
* nft_log&lt;br /&gt;
&lt;br /&gt;
==== nflog ====&lt;br /&gt;
* nft_log&lt;br /&gt;
&lt;br /&gt;
=== targets: arp ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Supported extensions ==                                                       &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches: xt ===                                                              &lt;br /&gt;
&lt;br /&gt;
==== addrtype ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel. Refer to [[Routing_information]].&lt;br /&gt;
==== cgroup ====&lt;br /&gt;
* nft_meta. Refer to [[Quick_reference-nftables_in_10_minutes#Meta]].&lt;br /&gt;
[Awaits support for cgroup2]                                                                             &lt;br /&gt;
==== comment ====&lt;br /&gt;
* Built-in support via NFTA_RULE_USERDATA, since 3.15 (Pablo Neira). Refer to [[Matching_packet_header_fields#Matching_UDP.2FTCP_headers_in_the_same_rule]].&lt;br /&gt;
==== connbytes ====                                                              &lt;br /&gt;
* nft_ct, 4.5 kernel. Refer to [[Meters]].&lt;br /&gt;
==== connlabel ====                                                              &lt;br /&gt;
* nft_meta, since 3.16.&lt;br /&gt;
==== connlimit ====&lt;br /&gt;
* consider native interface. Refer to [[Meters]].&lt;br /&gt;
==== connmark ====&lt;br /&gt;
* nft_meta.&lt;br /&gt;
==== conntrack ====&lt;br /&gt;
* nft_ct.&lt;br /&gt;
==== cpu ====&lt;br /&gt;
* nft_meta, since 3.18.&lt;br /&gt;
==== dccp ====                                                                   &lt;br /&gt;
* nft_payload.    &lt;br /&gt;
[Unsupported option : dccp-option]&lt;br /&gt;
==== devgroup ====                                                               &lt;br /&gt;
* nft_meta, since 3.18.  &lt;br /&gt;
==== dscp ====                                              &lt;br /&gt;
* nft_payload.&lt;br /&gt;
==== ecn ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== esp ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== hashlimit ====                                                              &lt;br /&gt;
* meter statement. Refer to [[Meters]].&lt;br /&gt;
==== helper ====                                                                 &lt;br /&gt;
* nft_ct.&lt;br /&gt;
==== ipcomp ====&lt;br /&gt;
* nft_payload.&lt;br /&gt;
[Unsupported option : compres]&lt;br /&gt;
==== iprange ====                                                                &lt;br /&gt;
* nft_payload, through native range support. To emulate iptables --ports you need two rules.                                                   &lt;br /&gt;
==== ipvs ====&lt;br /&gt;
* consider native interface. Refer to [[Load balancing]].&lt;br /&gt;
==== length ====                                                                 &lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== limit ====                                                                  &lt;br /&gt;
* nft_limit. Refer to [[Stateful objects]].&lt;br /&gt;
==== mac ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== mark ====                                                                   &lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== multiport ====                                                              &lt;br /&gt;
* nft_payload. &lt;br /&gt;
[Unsupported option : ports]                                                                                         &lt;br /&gt;
==== nfacct ====&lt;br /&gt;
* consider native interface. Refer to [[Stateful objects]].&lt;br /&gt;
==== osf ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
==== owner ====                                                                  &lt;br /&gt;
* nft_meta. &lt;br /&gt;
[Unsupported option : socket-exists]                                                                     &lt;br /&gt;
==== pkttype ====                                                                &lt;br /&gt;
* nft_meta                                                                                                                 &lt;br /&gt;
==== sctp ====                                                                   &lt;br /&gt;
* nft_payload.&lt;br /&gt;
[Unsupported option: --chunk-types]&lt;br /&gt;
==== socket ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
==== statistic ====&lt;br /&gt;
* nft_numgen. Refer to [[Load balancing]].&lt;br /&gt;
==== policy ====&lt;br /&gt;
* consider native interface. Refer to [[Configuring_chains#Base_chain_policy]].&lt;br /&gt;
==== recent ====                                                                 &lt;br /&gt;
* consider native interface. Refer to [[Sets]].&lt;br /&gt;
==== set ====&lt;br /&gt;
* Use native nf_tables set infrastructure.                                       &lt;br /&gt;
==== state ====                                                                  &lt;br /&gt;
* nft_ct                                                                         &lt;br /&gt;
==== tcp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
==== tcpmss ====                                                                 &lt;br /&gt;
* nft_exthdr, since 4.14&lt;br /&gt;
==== udp ====                                                                 &lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
=== targets: xt ===                                                              &lt;br /&gt;
&lt;br /&gt;
==== AUDIT ====                                                              &lt;br /&gt;
* nft_log, since 4.18.&lt;br /&gt;
==== CLASSIFY ====                                                               &lt;br /&gt;
* nft_meta, since 3.14.    &lt;br /&gt;
==== CONNMARK ====                                                                                                                    &lt;br /&gt;
* nft_ct&lt;br /&gt;
==== DSCP ====                                                                                                                    &lt;br /&gt;
==== HL ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
==== HMARK ====&lt;br /&gt;
* nft_meta + nft_hash.&lt;br /&gt;
==== MARK ====                                                                   &lt;br /&gt;
* nft_meta, since 3.14.&lt;br /&gt;
==== NFLOG ====                                                                  &lt;br /&gt;
* nft_log, since 3.17.                                             &lt;br /&gt;
==== NFQUEUE ====                                                                &lt;br /&gt;
* nft_queue, since 3.14.&lt;br /&gt;
==== TEE ====&lt;br /&gt;
* nft_dup, since 4.3.&lt;br /&gt;
==== TPROXY ====&lt;br /&gt;
* nft_tproxy, upcoming release (4.19)&lt;br /&gt;
==== TRACE ====                                                                  &lt;br /&gt;
* nft_meta, since 3.14.&lt;br /&gt;
&lt;br /&gt;
==== TCPMSS ====                                                                 &lt;br /&gt;
* nft_exthdr, since 4.14&lt;br /&gt;
&lt;br /&gt;
=== matches: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== ah ====                                                                     &lt;br /&gt;
* nft_payload + nft_cmp&lt;br /&gt;
==== icmp ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
[Unsupported codes: network-unreachable, host-unreachable, protocol-unreachable, port-unreachable, fragmentation-needed, source-route-failed, network-unknown, host-unknown, network-prohibited, host-prohibited, TOS-network-unreachable, TOS-host-unreachable, communication-prohibited, host-precedence-violation, precedence-cutoff, network-redirect, host-redirect, TOS-network-redirect, TOS-host-redirect, ttl-zero-during-transit, ttl-zero-during-reassembly, ip-header-bad and required-option-missing ]&lt;br /&gt;
==== realm ====                                                                  &lt;br /&gt;
* nft_meta, through NFT_META_RTCLASSID. &lt;br /&gt;
==== rp_filter ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel&lt;br /&gt;
==== ttl ====&lt;br /&gt;
&lt;br /&gt;
=== matches: ipv6 ===                                                            &lt;br /&gt;
            &lt;br /&gt;
==== rp_filter ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel                                                                    &lt;br /&gt;
==== ah  ====                                                                    &lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
==== eui64 ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
==== frag ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
==== hbh ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
HBH options are not supported yet.&lt;br /&gt;
[Unsupported option: --hbh-opts]&lt;br /&gt;
==== hl ==== &lt;br /&gt;
* nft_payload.    &lt;br /&gt;
==== icmp6 ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
[Unsupported icmpv6 codes: no-route, communication-prohibited, beyond-scope, address-unreachable, port-unreachable, failed-policy, reject-route, ttl-zero-during-transit, ttl-zero-during-reassembly, bad-header, unknown-header-type and unknown-option]&lt;br /&gt;
==== ipv6header ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
==== mh ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
[Needs bug fixation for option mh-type with range]&lt;br /&gt;
==== rt ====&lt;br /&gt;
* nft_exthdr + nft_cmp&lt;br /&gt;
[Unsupported options: --rt-0-res, --rt-0-addrs, --rt-0-not-strict]&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===&lt;br /&gt;
==== ECN ====                                                                    &lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== DNAT ====    &lt;br /&gt;
* nft_nat, since 3.13.    &lt;br /&gt;
==== LOG ====                                                                    &lt;br /&gt;
* nft_log, since 3.17.  &lt;br /&gt;
[Unsupported options : log-tcp-sequence, log-tcp-options, log-ip-options, log-uid, log-macdecode]&lt;br /&gt;
==== MASQUERADE ====&lt;br /&gt;
* nft_masq, since 3.18.&lt;br /&gt;
==== REDIRECT ====&lt;br /&gt;
* nft_redirect, since 3.19.&lt;br /&gt;
&lt;br /&gt;
==== REJECT ====                                                                 &lt;br /&gt;
* nft_reject_ipv4, since 3.13.                                         &lt;br /&gt;
* nft_reject_inet, since 3.14.&lt;br /&gt;
* nft_reject_bridge, since 3.18.  &lt;br /&gt;
==== SNAT ====                                                            &lt;br /&gt;
* nft_nat, since 3.13.&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv6 ===&lt;br /&gt;
==== DNAT ====&lt;br /&gt;
* nft_nat, since 3.13.    &lt;br /&gt;
==== LOG ====&lt;br /&gt;
* nft_log, since 3.17.  &lt;br /&gt;
[Unsupported options : log-tcp-sequence, log-tcp-options, log-ip-options, log-uid, log-macdecode]&lt;br /&gt;
==== MASQUERADE ====                                                             &lt;br /&gt;
* nft_masq, since 3.18.&lt;br /&gt;
==== REDIRECT ====                                                               &lt;br /&gt;
* nft_redirect, since 3.19.&lt;br /&gt;
&lt;br /&gt;
==== REJECT ====                                                                                   &lt;br /&gt;
* nft_reject_ipv6, since 3.14.                     &lt;br /&gt;
* nft_reject_inet, since 3.14.&lt;br /&gt;
* nft_reject_bridge, since 3.18.    &lt;br /&gt;
==== SNAT ====                                                                                                                          &lt;br /&gt;
* nft_nat, since 3.13.&lt;br /&gt;
&lt;br /&gt;
=== matches: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== 802.3 ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== among ====&lt;br /&gt;
* sets&lt;br /&gt;
&lt;br /&gt;
==== arp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== ip ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== ip6 ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== limit ====&lt;br /&gt;
* nft_limit&lt;br /&gt;
&lt;br /&gt;
==== mark ====&lt;br /&gt;
* nft_mark&lt;br /&gt;
&lt;br /&gt;
==== pkttype ====&lt;br /&gt;
* nft_meta&lt;br /&gt;
&lt;br /&gt;
==== stp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== vlan ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== targets: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== dnat ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== snat ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== redirect ====&lt;br /&gt;
* nft_payload + nft_meta (pkttype set unicast)&lt;br /&gt;
&lt;br /&gt;
==== mark ====&lt;br /&gt;
* nft_mark&lt;br /&gt;
&lt;br /&gt;
== Deprecated extensions ==                                                      &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches ===                                                                  &lt;br /&gt;
 &lt;br /&gt;
==== physdev ====                                                                &lt;br /&gt;
* br_netfilter aims to be deprecated by nftables.                                                                                &lt;br /&gt;
==== quota ====                                                                  &lt;br /&gt;
* nfacct already provides quota support.  &lt;br /&gt;
==== tos ====&lt;br /&gt;
* deprecated by dscp                                       &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== targets ===                                                                  &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== CLUSTERIP ====                                                              &lt;br /&gt;
* deprecated by cluster match.                                                   &lt;br /&gt;
==== TOS ====                                                                 &lt;br /&gt;
* deprecated by DSCP&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== ULOG ====                                                                   &lt;br /&gt;
* Removed from tree since 3.17.&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Supported_features_compared_to_xtables&amp;diff=341</id>
		<title>Supported features compared to xtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Supported_features_compared_to_xtables&amp;diff=341"/>
		<updated>2018-08-19T17:01:46Z</updated>

		<summary type="html">&lt;p&gt;Nevola: remove authors, agreed with pablo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Last update: Aug/2018&lt;br /&gt;
                                                                                 &lt;br /&gt;
This page tracks the list of supported and unsupported extensions with comments and suggestions.&lt;br /&gt;
                                                                                 &lt;br /&gt;
== Unsupported extensions ==                                                     &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches: xt ===                                                              &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== bpf ====                                                                    &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== cluster ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== rateest ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== string ====                                                                 &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== time ====&lt;br /&gt;
* consider native interface                                                    &lt;br /&gt;
==== u32 ====                                                                    &lt;br /&gt;
* raw expressions?                                                               &lt;br /&gt;
&lt;br /&gt;
=== targets: xt ===                                                              &lt;br /&gt;
                                                         &lt;br /&gt;
==== CHECKSUM ====                                                               &lt;br /&gt;
* add nft_payload.&lt;br /&gt;
* To the day, the only use case for this was DHCP clients not working with partial checksums. That should be fixed nowadays.&lt;br /&gt;
* See https://lwn.net/Articles/396466/ and https://www.spinics.net/lists/kvm/msg37660.html&lt;br /&gt;
* See https://bugs.launchpad.net/ubuntu/+source/isc-dhcp/+bug/930962 and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=832090&lt;br /&gt;
&lt;br /&gt;
==== CONNSECMARK ====&lt;br /&gt;
* nft_ct                                                                      &lt;br /&gt;
==== CT ====                                                                     &lt;br /&gt;
* nft_ct_target. Refer to [[Matching_connection_tracking_stateful_metainformation]].                                              &lt;br /&gt;
==== IDLETIMER ====                                                              &lt;br /&gt;
* consider native interfac&lt;br /&gt;
==== LED ====                                                                    &lt;br /&gt;
* consider native (need this?)                                                   &lt;br /&gt;
==== NETMAP ====                                                                 &lt;br /&gt;
* nft_nat.                                                                       &lt;br /&gt;
==== RATEEST ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== SECMARK ====                                                                &lt;br /&gt;
* nft_meta_target&lt;br /&gt;
==== SET ====                                                                 &lt;br /&gt;
* consider native interface &lt;br /&gt;
==== SYNPROXY ====                                                                 &lt;br /&gt;
* consider native interface                                                                 &lt;br /&gt;
==== TCPOPTSTRIP ====                                                            &lt;br /&gt;
* consider native interface, need to extend nft_exthdr.c&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== TTL ====&lt;br /&gt;
                                                                                 &lt;br /&gt;
=== targets: ipv6 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== NPT ====                                                                    &lt;br /&gt;
* consider native interface&lt;br /&gt;
&lt;br /&gt;
=== targets: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== arpreply ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
&lt;br /&gt;
=== watchers: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== log ====&lt;br /&gt;
* nft_log&lt;br /&gt;
&lt;br /&gt;
==== nflog ====&lt;br /&gt;
* nft_log&lt;br /&gt;
&lt;br /&gt;
=== targets: arp ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Supported extensions ==                                                       &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches: xt ===                                                              &lt;br /&gt;
&lt;br /&gt;
==== addrtype ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel. Refer to [[Routing_information]].&lt;br /&gt;
==== cgroup ====&lt;br /&gt;
* nft_meta. Refer to [[Quick_reference-nftables_in_10_minutes#Meta]].&lt;br /&gt;
[Awaits support for cgroup2]                                                                             &lt;br /&gt;
==== comment ====&lt;br /&gt;
* Built-in support via NFTA_RULE_USERDATA, since 3.15 (Pablo Neira). Refer to [[Matching_packet_header_fields#Matching_UDP.2FTCP_headers_in_the_same_rule]].&lt;br /&gt;
==== connbytes ====                                                              &lt;br /&gt;
* nft_ct, 4.5 kernel. Refer to [[Meters]].&lt;br /&gt;
==== connlabel ====                                                              &lt;br /&gt;
* nft_meta, since 3.16.&lt;br /&gt;
==== connlimit ====&lt;br /&gt;
* consider native interface. Refer to [[Meters]].&lt;br /&gt;
==== connmark ====&lt;br /&gt;
* nft_meta.&lt;br /&gt;
==== conntrack ====&lt;br /&gt;
* nft_ct.&lt;br /&gt;
==== cpu ====&lt;br /&gt;
* nft_meta, since 3.18.&lt;br /&gt;
==== dccp ====                                                                   &lt;br /&gt;
* nft_payload.    &lt;br /&gt;
[Unsupported option : dccp-option]&lt;br /&gt;
==== devgroup ====                                                               &lt;br /&gt;
* nft_meta, since 3.18.  &lt;br /&gt;
==== dscp ====                                              &lt;br /&gt;
* nft_payload.&lt;br /&gt;
==== ecn ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== esp ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== hashlimit ====                                                              &lt;br /&gt;
* meter statement. Refer to [[Meters]].&lt;br /&gt;
==== helper ====                                                                 &lt;br /&gt;
* nft_ct.&lt;br /&gt;
==== ipcomp ====&lt;br /&gt;
* nft_payload.&lt;br /&gt;
[Unsupported option : compres]&lt;br /&gt;
==== iprange ====                                                                &lt;br /&gt;
* nft_payload, through native range support. To emulate iptables --ports you need two rules.                                                   &lt;br /&gt;
==== ipvs ====&lt;br /&gt;
* consider native interface. Refer to [[Load balancing]].&lt;br /&gt;
==== length ====                                                                 &lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== limit ====                                                                  &lt;br /&gt;
* nft_limit. Refer to [[Stateful objects]].&lt;br /&gt;
==== mac ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== mark ====                                                                   &lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== multiport ====                                                              &lt;br /&gt;
* nft_payload. &lt;br /&gt;
[Unsupported option : ports]                                                                                         &lt;br /&gt;
==== nfacct ====&lt;br /&gt;
* consider native interface. Refer to [[Stateful objects]].&lt;br /&gt;
==== osf ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
==== owner ====                                                                  &lt;br /&gt;
* nft_meta. &lt;br /&gt;
[Unsupported option : socket-exists]                                                                     &lt;br /&gt;
==== pkttype ====                                                                &lt;br /&gt;
* nft_meta                                                                                                                 &lt;br /&gt;
==== sctp ====                                                                   &lt;br /&gt;
* nft_payload.&lt;br /&gt;
[Unsupported option: --chunk-types]&lt;br /&gt;
==== socket ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
==== statistic ====&lt;br /&gt;
* nft_numgen. Refer to [[Load balancing]].&lt;br /&gt;
==== policy ====&lt;br /&gt;
* consider native interface. Refer to [[Configuring_chains#Base_chain_policy]].&lt;br /&gt;
==== recent ====                                                                 &lt;br /&gt;
* consider native interface. Refer to [[Sets]].&lt;br /&gt;
==== set ====&lt;br /&gt;
* Use native nf_tables set infrastructure.                                       &lt;br /&gt;
==== state ====                                                                  &lt;br /&gt;
* nft_ct                                                                         &lt;br /&gt;
==== tcp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
==== tcpmss ====                                                                 &lt;br /&gt;
* nft_exthdr, since 4.14&lt;br /&gt;
==== udp ====                                                                 &lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
=== targets: xt ===                                                              &lt;br /&gt;
&lt;br /&gt;
==== AUDIT ====                                                              &lt;br /&gt;
* nft_log, since 4.18.&lt;br /&gt;
==== CLASSIFY ====                                                               &lt;br /&gt;
* nft_meta, since 3.14.    &lt;br /&gt;
==== CONNMARK ====                                                                                                                    &lt;br /&gt;
* nft_ct&lt;br /&gt;
==== DSCP ====                                                                                                                    &lt;br /&gt;
==== HL ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
==== HMARK ====&lt;br /&gt;
* nft_meta + nft_hash.&lt;br /&gt;
==== MARK ====                                                                   &lt;br /&gt;
* nft_meta, since 3.14.&lt;br /&gt;
==== NFLOG ====                                                                  &lt;br /&gt;
* nft_log, since 3.17.                                             &lt;br /&gt;
==== NFQUEUE ====                                                                &lt;br /&gt;
* nft_queue, since 3.14.&lt;br /&gt;
==== TEE ====&lt;br /&gt;
* nft_dup, since 4.3.&lt;br /&gt;
==== TPROXY ====&lt;br /&gt;
* nft_tproxy, upcoming release (4.19)&lt;br /&gt;
==== TRACE ====                                                                  &lt;br /&gt;
* nft_meta, since 3.14.&lt;br /&gt;
&lt;br /&gt;
==== TCPMSS ====                                                                 &lt;br /&gt;
* nft_exthdr, since 4.14&lt;br /&gt;
&lt;br /&gt;
=== matches: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== ah ====                                                                     &lt;br /&gt;
* nft_payload + nft_cmp&lt;br /&gt;
==== icmp ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
[Unsupported codes: network-unreachable, host-unreachable, protocol-unreachable, port-unreachable, fragmentation-needed, source-route-failed, network-unknown, host-unknown, network-prohibited, host-prohibited, TOS-network-unreachable, TOS-host-unreachable, communication-prohibited, host-precedence-violation, precedence-cutoff, network-redirect, host-redirect, TOS-network-redirect, TOS-host-redirect, ttl-zero-during-transit, ttl-zero-during-reassembly, ip-header-bad and required-option-missing ]&lt;br /&gt;
==== realm ====                                                                  &lt;br /&gt;
* nft_meta, through NFT_META_RTCLASSID. &lt;br /&gt;
==== rp_filter ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel&lt;br /&gt;
==== ttl ====&lt;br /&gt;
&lt;br /&gt;
=== matches: ipv6 ===                                                            &lt;br /&gt;
            &lt;br /&gt;
==== rp_filter ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel                                                                    &lt;br /&gt;
==== ah  ====                                                                    &lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
==== eui64 ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
==== frag ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
==== hbh ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
HBH options are not supported yet.&lt;br /&gt;
[Unsupported option: --hbh-opts]&lt;br /&gt;
==== hl ==== &lt;br /&gt;
* nft_payload.    &lt;br /&gt;
==== icmp6 ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
[Unsupported icmpv6 codes: no-route, communication-prohibited, beyond-scope, address-unreachable, port-unreachable, failed-policy, reject-route, ttl-zero-during-transit, ttl-zero-during-reassembly, bad-header, unknown-header-type and unknown-option]&lt;br /&gt;
==== ipv6header ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
==== mh ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
[Needs bug fixation for option mh-type with range]&lt;br /&gt;
==== rt ====&lt;br /&gt;
* nft_exthdr + nft_cmp&lt;br /&gt;
[Unsupported options: --rt-0-res, --rt-0-addrs, --rt-0-not-strict]&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===&lt;br /&gt;
==== ECN ====                                                                    &lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== DNAT ====    &lt;br /&gt;
* nft_nat, since 3.13.    &lt;br /&gt;
==== LOG ====                                                                    &lt;br /&gt;
* nft_log, since 3.17.  &lt;br /&gt;
[Unsupported options : log-tcp-sequence, log-tcp-options, log-ip-options, log-uid, log-macdecode]&lt;br /&gt;
==== MASQUERADE ====&lt;br /&gt;
* nft_masq, since 3.18.&lt;br /&gt;
==== REDIRECT ====&lt;br /&gt;
* nft_redirect, since 3.19.&lt;br /&gt;
&lt;br /&gt;
==== REJECT ====                                                                 &lt;br /&gt;
* nft_reject_ipv4, since 3.13.                                         &lt;br /&gt;
* nft_reject_inet, since 3.14.&lt;br /&gt;
* nft_reject_bridge, since 3.18.  &lt;br /&gt;
==== SNAT ====                                                            &lt;br /&gt;
* nft_nat, since 3.13.&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv6 ===&lt;br /&gt;
==== DNAT ====&lt;br /&gt;
* nft_nat, since 3.13.    &lt;br /&gt;
==== LOG ====&lt;br /&gt;
* nft_log, since 3.17.  &lt;br /&gt;
[Unsupported options : log-tcp-sequence, log-tcp-options, log-ip-options, log-uid, log-macdecode]&lt;br /&gt;
==== MASQUERADE ====                                                             &lt;br /&gt;
* nft_masq, since 3.18.&lt;br /&gt;
==== REDIRECT ====                                                               &lt;br /&gt;
* nft_redirect, since 3.19.&lt;br /&gt;
&lt;br /&gt;
==== REJECT ====                                                                                   &lt;br /&gt;
* nft_reject_ipv6, since 3.14.                     &lt;br /&gt;
* nft_reject_inet, since 3.14.&lt;br /&gt;
* nft_reject_bridge, since 3.18.    &lt;br /&gt;
==== SNAT ====                                                                                                                          &lt;br /&gt;
* nft_nat, since 3.13.&lt;br /&gt;
&lt;br /&gt;
=== matches: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== 802.3 ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== among ====&lt;br /&gt;
* sets&lt;br /&gt;
&lt;br /&gt;
==== arp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== ip ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== ip6 ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== limit ====&lt;br /&gt;
* nft_limit&lt;br /&gt;
&lt;br /&gt;
==== mark ====&lt;br /&gt;
* nft_mark&lt;br /&gt;
&lt;br /&gt;
==== pkttype ====&lt;br /&gt;
* nft_meta&lt;br /&gt;
&lt;br /&gt;
==== stp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== vlan ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== targets: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== dnat ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== snat ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== redirect ====&lt;br /&gt;
* nft_payload + nft_meta (pkttype set unicast)&lt;br /&gt;
&lt;br /&gt;
==== mark ====&lt;br /&gt;
* nft_mark&lt;br /&gt;
&lt;br /&gt;
== Deprecated extensions ==                                                      &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches ===                                                                  &lt;br /&gt;
 &lt;br /&gt;
==== physdev ====                                                                &lt;br /&gt;
* br_netfilter aims to be deprecated by nftables.                                                                                &lt;br /&gt;
==== quota ====                                                                  &lt;br /&gt;
* nfacct already provides quota support.  &lt;br /&gt;
==== tos ====&lt;br /&gt;
* deprecated by dscp                                       &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== targets ===                                                                  &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== CLUSTERIP ====                                                              &lt;br /&gt;
* deprecated by cluster match.                                                   &lt;br /&gt;
==== TOS ====                                                                 &lt;br /&gt;
* deprecated by DSCP&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== ULOG ====                                                                   &lt;br /&gt;
* Removed from tree since 3.17.&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Supported_features_compared_to_xtables&amp;diff=338</id>
		<title>Supported features compared to xtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Supported_features_compared_to_xtables&amp;diff=338"/>
		<updated>2018-08-18T22:10:43Z</updated>

		<summary type="html">&lt;p&gt;Nevola: link some documents referrals&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Last update: 2016/Jan/11                                                        &lt;br /&gt;
                                                                                 &lt;br /&gt;
This page tracks the list of supported and unsupported extensions with comments and suggestions.&lt;br /&gt;
                                                                                 &lt;br /&gt;
== Unsupported extensions ==                                                     &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches: xt ===                                                              &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== bpf ====                                                                    &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== cluster ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== rateest ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== string ====                                                                 &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== time ====&lt;br /&gt;
* consider native interface                                                    &lt;br /&gt;
==== u32 ====                                                                    &lt;br /&gt;
* raw expressions?                                                               &lt;br /&gt;
&lt;br /&gt;
=== targets: xt ===                                                              &lt;br /&gt;
                                                         &lt;br /&gt;
==== CHECKSUM ====                                                               &lt;br /&gt;
* add nft_payload.&lt;br /&gt;
* To the day, the only use case for this was DHCP clients not working with partial checksums. That should be fixed nowadays.&lt;br /&gt;
* See https://lwn.net/Articles/396466/ and https://www.spinics.net/lists/kvm/msg37660.html&lt;br /&gt;
* See https://bugs.launchpad.net/ubuntu/+source/isc-dhcp/+bug/930962 and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=832090&lt;br /&gt;
&lt;br /&gt;
==== CONNSECMARK ====&lt;br /&gt;
* nft_ct                                                                      &lt;br /&gt;
==== CT ====                                                                     &lt;br /&gt;
* nft_ct_target. Refer to [[Matching_connection_tracking_stateful_metainformation]].                                              &lt;br /&gt;
==== IDLETIMER ====                                                              &lt;br /&gt;
* consider native interfac&lt;br /&gt;
==== LED ====                                                                    &lt;br /&gt;
* consider native (need this?)                                                   &lt;br /&gt;
==== NETMAP ====                                                                 &lt;br /&gt;
* nft_nat.                                                                       &lt;br /&gt;
==== RATEEST ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== SECMARK ====                                                                &lt;br /&gt;
* nft_meta_target&lt;br /&gt;
==== SET ====                                                                 &lt;br /&gt;
* consider native interface &lt;br /&gt;
==== SYNPROXY ====                                                                 &lt;br /&gt;
* consider native interface                                                                 &lt;br /&gt;
==== TCPOPTSTRIP ====                                                            &lt;br /&gt;
* consider native interface, need to extend nft_exthdr.c&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== TTL ====&lt;br /&gt;
                                                                                 &lt;br /&gt;
=== targets: ipv6 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== NPT ====                                                                    &lt;br /&gt;
* consider native interface&lt;br /&gt;
&lt;br /&gt;
=== targets: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== arpreply ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
&lt;br /&gt;
=== watchers: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== log ====&lt;br /&gt;
* nft_log&lt;br /&gt;
&lt;br /&gt;
==== nflog ====&lt;br /&gt;
* nft_log&lt;br /&gt;
&lt;br /&gt;
=== targets: arp ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Supported extensions ==                                                       &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches: xt ===                                                              &lt;br /&gt;
&lt;br /&gt;
==== addrtype ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel. Refer to [[Routing_information]].&lt;br /&gt;
==== cgroup ====&lt;br /&gt;
* nft_meta. Refer to [[Quick_reference-nftables_in_10_minutes#Meta]].&lt;br /&gt;
[Awaits support for cgroup2]                                                                             &lt;br /&gt;
==== comment ====&lt;br /&gt;
* Built-in support via NFTA_RULE_USERDATA, since 3.15 (Pablo Neira). Refer to [[Matching_packet_header_fields#Matching_UDP.2FTCP_headers_in_the_same_rule]].&lt;br /&gt;
==== connbytes ====                                                              &lt;br /&gt;
* nft_ct, 4.5 kernel. Refer to [[Meters]].&lt;br /&gt;
==== connlabel ====                                                              &lt;br /&gt;
* nft_meta, since 3.16 (Florian Westphal).&lt;br /&gt;
==== connlimit ====&lt;br /&gt;
* consider native interface. Refer to [[Meters]].&lt;br /&gt;
==== connmark ====&lt;br /&gt;
* nft_meta.&lt;br /&gt;
==== conntrack ====&lt;br /&gt;
* nft_ct.&lt;br /&gt;
==== cpu ====&lt;br /&gt;
* nft_meta, since 3.18 (Valentina Giusti/Ana Rey).&lt;br /&gt;
==== dccp ====                                                                   &lt;br /&gt;
* nft_payload.    &lt;br /&gt;
[Unsupported option : dccp-option]&lt;br /&gt;
==== devgroup ====                                                               &lt;br /&gt;
* nft_meta, since 3.18 (Ana Rey).  &lt;br /&gt;
==== dscp ====                                              &lt;br /&gt;
* nft_payload.&lt;br /&gt;
==== ecn ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== esp ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== hashlimit ====                                                              &lt;br /&gt;
* meter statement. Refer to [[Meters]].&lt;br /&gt;
==== helper ====                                                                 &lt;br /&gt;
* nft_ct.&lt;br /&gt;
==== ipcomp ====&lt;br /&gt;
* nft_payload.&lt;br /&gt;
[Unsupported option : compres]&lt;br /&gt;
==== iprange ====                                                                &lt;br /&gt;
* nft_payload, through native range support. To emulate iptables --ports you need two rules.                                                   &lt;br /&gt;
==== ipvs ====&lt;br /&gt;
* consider native interface. Refer to [[Load balancing]].&lt;br /&gt;
==== length ====                                                                 &lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== limit ====                                                                  &lt;br /&gt;
* nft_limit. Refer to [[Stateful objects]].&lt;br /&gt;
==== mac ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== mark ====                                                                   &lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== multiport ====                                                              &lt;br /&gt;
* nft_payload. &lt;br /&gt;
[Unsupported option : ports]                                                                                         &lt;br /&gt;
==== nfacct ====&lt;br /&gt;
* consider native interface. Refer to [[Stateful objects]].&lt;br /&gt;
==== osf ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
==== owner ====                                                                  &lt;br /&gt;
* nft_meta. &lt;br /&gt;
[Unsupported option : socket-exists]                                                                     &lt;br /&gt;
==== pkttype ====                                                                &lt;br /&gt;
* nft_meta                                                                                                                 &lt;br /&gt;
==== sctp ====                                                                   &lt;br /&gt;
* nft_payload.&lt;br /&gt;
[Unsupported option: --chunk-types]&lt;br /&gt;
==== socket ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
==== statistic ====&lt;br /&gt;
* nft_numgen. Refer to [[Load balancing]].&lt;br /&gt;
==== policy ====&lt;br /&gt;
* consider native interface. Refer to [[Configuring_chains#Base_chain_policy]].&lt;br /&gt;
==== recent ====                                                                 &lt;br /&gt;
* consider native interface. Refer to [[Sets]].&lt;br /&gt;
==== set ====&lt;br /&gt;
* Use native nf_tables set infrastructure.                                       &lt;br /&gt;
==== state ====                                                                  &lt;br /&gt;
* nft_ct                                                                         &lt;br /&gt;
==== tcp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
==== tcpmss ====                                                                 &lt;br /&gt;
* nft_exthdr, since 4.14&lt;br /&gt;
==== udp ====                                                                 &lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
=== targets: xt ===                                                              &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== CLASSIFY ====                                                               &lt;br /&gt;
* nft_meta, since 3.14 (Tomasz Bursztyka).    &lt;br /&gt;
==== CONNMARK ====                                                                                                                    &lt;br /&gt;
==== MARK ====                                                                   &lt;br /&gt;
* nft_meta, since 3.14 (Tomasz Bursztyka).                                       &lt;br /&gt;
==== NFLOG ====                                                                  &lt;br /&gt;
* nft_log, since 3.17 (Pablo Neira).                                             &lt;br /&gt;
==== NFQUEUE ====                                                                &lt;br /&gt;
* nft_queue, since 3.14 (Eric Leblond). &#039;&#039;&#039;Bridge support still missing&#039;&#039;&#039;.&lt;br /&gt;
==== TEE ====&lt;br /&gt;
* nft_dup, since 4.3 (Pablo Neira)&lt;br /&gt;
==== TRACE ====                                                                  &lt;br /&gt;
* nft_meta, since 3.14 (Tomasz Bursztyka).&lt;br /&gt;
&lt;br /&gt;
==== TCPMSS ====                                                                 &lt;br /&gt;
* nft_exthdr, since 4.14&lt;br /&gt;
&lt;br /&gt;
=== matches: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== ah ====                                                                     &lt;br /&gt;
* nft_payload + nft_cmp&lt;br /&gt;
==== icmp ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
[Unsupported codes: network-unreachable, host-unreachable, protocol-unreachable, port-unreachable, fragmentation-needed, source-route-failed, network-unknown, host-unknown, network-prohibited, host-prohibited, TOS-network-unreachable, TOS-host-unreachable, communication-prohibited, host-precedence-violation, precedence-cutoff, network-redirect, host-redirect, TOS-network-redirect, TOS-host-redirect, ttl-zero-during-transit, ttl-zero-during-reassembly, ip-header-bad and required-option-missing ]&lt;br /&gt;
==== realm ====                                                                  &lt;br /&gt;
* nft_meta, through NFT_META_RTCLASSID. &lt;br /&gt;
==== rp_filter ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel&lt;br /&gt;
==== ttl ====&lt;br /&gt;
&lt;br /&gt;
=== matches: ipv6 ===                                                            &lt;br /&gt;
            &lt;br /&gt;
==== rp_filter ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel                                                                    &lt;br /&gt;
==== ah  ====                                                                    &lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
==== eui64 ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
==== frag ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
==== hbh ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
HBH options are not supported yet.&lt;br /&gt;
[Unsupported option: --hbh-opts]&lt;br /&gt;
==== hl ==== &lt;br /&gt;
* nft_payload.    &lt;br /&gt;
==== icmp6 ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
[Unsupported icmpv6 codes: no-route, communication-prohibited, beyond-scope, address-unreachable, port-unreachable, failed-policy, reject-route, ttl-zero-during-transit, ttl-zero-during-reassembly, bad-header, unknown-header-type and unknown-option]&lt;br /&gt;
==== ipv6header ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
==== mh ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
[Needs bug fixation for option mh-type with range]&lt;br /&gt;
==== rt ====&lt;br /&gt;
* nft_exthdr + nft_cmp&lt;br /&gt;
[Unsupported options: --rt-0-res, --rt-0-addrs, --rt-0-not-strict]&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===&lt;br /&gt;
==== ECN ====                                                                    &lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== DNAT ====    &lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).    &lt;br /&gt;
==== LOG ====                                                                    &lt;br /&gt;
* nft_log, since 3.17 (Pablo Neira).  &lt;br /&gt;
[Unsupported options : log-tcp-sequence, log-tcp-options, log-ip-options, log-uid, log-macdecode]&lt;br /&gt;
==== MASQUERADE ====&lt;br /&gt;
* nft_masq, since 3.18 (Arturo Borrero).&lt;br /&gt;
==== REDIRECT ====&lt;br /&gt;
* nft_redirect, since 3.19 (Arturo Borrero).&lt;br /&gt;
&lt;br /&gt;
==== REJECT ====                                                                 &lt;br /&gt;
* nft_reject_ipv4, since 3.13 (Patrick McHardy/Eric Leblond).                                         &lt;br /&gt;
* nft_reject_inet, since 3.14 (Patrick McHardy).&lt;br /&gt;
* nft_reject_bridge, since 3.18 (Pablo Neira)    &lt;br /&gt;
==== SNAT ====                                                            &lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv6 ===&lt;br /&gt;
==== DNAT ====&lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).    &lt;br /&gt;
==== LOG ====&lt;br /&gt;
* nft_log, since 3.17 (Pablo Neira).  &lt;br /&gt;
[Unsupported options : log-tcp-sequence, log-tcp-options, log-ip-options, log-uid, log-macdecode]&lt;br /&gt;
==== MASQUERADE ====                                                             &lt;br /&gt;
* nft_masq, since 3.18 (Arturo Borrero).&lt;br /&gt;
==== REDIRECT ====                                                               &lt;br /&gt;
* nft_redirect, since 3.19 (Arturo Borrero).&lt;br /&gt;
&lt;br /&gt;
==== REJECT ====                                                                                   &lt;br /&gt;
* nft_reject_ipv6, since 3.14 (Patrick McHardy/Eric Leblond)                     &lt;br /&gt;
* nft_reject_inet, since 3.14 (Patrick McHardy).&lt;br /&gt;
* nft_reject_bridge, since 3.18 (Pablo Neira)    &lt;br /&gt;
==== SNAT ====                                                                                                                          &lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).&lt;br /&gt;
&lt;br /&gt;
=== matches: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== 802.3 ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== among ====&lt;br /&gt;
* sets&lt;br /&gt;
&lt;br /&gt;
==== arp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== ip ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== ip6 ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== limit ====&lt;br /&gt;
* nft_limit&lt;br /&gt;
&lt;br /&gt;
==== mark ====&lt;br /&gt;
* nft_mark&lt;br /&gt;
&lt;br /&gt;
==== pkttype ====&lt;br /&gt;
* nft_meta&lt;br /&gt;
&lt;br /&gt;
==== stp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== vlan ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== targets: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== dnat ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== snat ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== redirect ====&lt;br /&gt;
* nft_payload + nft_meta (pkttype set unicast)&lt;br /&gt;
&lt;br /&gt;
==== mark ====&lt;br /&gt;
* nft_mark&lt;br /&gt;
&lt;br /&gt;
== Deprecated extensions ==                                                      &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches ===                                                                  &lt;br /&gt;
 &lt;br /&gt;
==== physdev ====                                                                &lt;br /&gt;
* br_netfilter aims to be deprecated by nftables.                                                                                &lt;br /&gt;
==== quota ====                                                                  &lt;br /&gt;
* nfacct already provides quota support.  &lt;br /&gt;
==== tos ====&lt;br /&gt;
* deprecated by dscp                                       &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== targets ===                                                                  &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== CLUSTERIP ====                                                              &lt;br /&gt;
* deprecated by cluster match.                                                   &lt;br /&gt;
==== TOS ====                                                                 &lt;br /&gt;
* deprecated by DSCP&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== ULOG ====                                                                   &lt;br /&gt;
* Removed from tree since 3.17.&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Supported_features_compared_to_xtables&amp;diff=336</id>
		<title>Supported features compared to xtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Supported_features_compared_to_xtables&amp;diff=336"/>
		<updated>2018-08-18T21:37:45Z</updated>

		<summary type="html">&lt;p&gt;Nevola: update some supported matches&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Last update: 2016/Jan/11                                                        &lt;br /&gt;
                                                                                 &lt;br /&gt;
This page tracks the list of supported and unsupported extensions with comments and suggestions.&lt;br /&gt;
                                                                                 &lt;br /&gt;
== Unsupported extensions ==                                                     &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches: xt ===                                                              &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== bpf ====                                                                    &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== cluster ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== rateest ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== string ====                                                                 &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== time ====&lt;br /&gt;
* consider native interface                                                    &lt;br /&gt;
==== u32 ====                                                                    &lt;br /&gt;
* raw expressions?                                                               &lt;br /&gt;
&lt;br /&gt;
=== targets: xt ===                                                              &lt;br /&gt;
&lt;br /&gt;
==== AUDIT ====                                                                  &lt;br /&gt;
* add nft_audit.                                                                 &lt;br /&gt;
==== CHECKSUM ====                                                               &lt;br /&gt;
* add nft_payload.&lt;br /&gt;
* To the day, the only use case for this was DHCP clients not working with partial checksums. That should be fixed nowadays.&lt;br /&gt;
* See https://lwn.net/Articles/396466/ and https://www.spinics.net/lists/kvm/msg37660.html&lt;br /&gt;
* See https://bugs.launchpad.net/ubuntu/+source/isc-dhcp/+bug/930962 and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=832090&lt;br /&gt;
&lt;br /&gt;
==== CONNSECMARK ====&lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== CT ====                                                                     &lt;br /&gt;
* nft_meta_target. Refer to [[Matching_connection_tracking_stateful_metainformation]].&lt;br /&gt;
==== DSCP ====&lt;br /&gt;
* add nft_mangle. Refer to [[Quick_reference-nftables_in_10_minutes#Ip]].&lt;br /&gt;
==== HL ====&lt;br /&gt;
* add nft_mangle. Refer to [[Quick_reference-nftables_in_10_minutes#Ip6]].&lt;br /&gt;
==== HMARK ====                                                                  &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== IDLETIMER ====                                                              &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== LED ====                                                                    &lt;br /&gt;
* consider native (need this?)                                                   &lt;br /&gt;
==== NETMAP ====                                                                 &lt;br /&gt;
* nft_nat.                                                                       &lt;br /&gt;
==== RATEEST ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== SECMARK ====                                                                &lt;br /&gt;
* nft_meta_target&lt;br /&gt;
==== SET ====                                                                 &lt;br /&gt;
* consider native interface &lt;br /&gt;
==== SYNPROXY ====                                                                 &lt;br /&gt;
* consider native interface                                                                 &lt;br /&gt;
==== TCPOPTSTRIP ====                                                            &lt;br /&gt;
* consider native interface                                                                                                   &lt;br /&gt;
==== TPROXY ====                                                                 &lt;br /&gt;
* consider native interface                                                              &lt;br /&gt;
                                                                       &lt;br /&gt;
=== targets: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== TTL ====&lt;br /&gt;
                                                                                 &lt;br /&gt;
=== targets: ipv6 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== NPT ====                                                                    &lt;br /&gt;
* consider native interface&lt;br /&gt;
&lt;br /&gt;
=== targets: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== arpreply ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
&lt;br /&gt;
=== watchers: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== log ====&lt;br /&gt;
* nft_log&lt;br /&gt;
&lt;br /&gt;
==== nflog ====&lt;br /&gt;
* nft_log&lt;br /&gt;
&lt;br /&gt;
=== targets: arp ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Supported extensions ==                                                       &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches: xt ===                                                              &lt;br /&gt;
&lt;br /&gt;
==== addrtype ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel&lt;br /&gt;
==== cgroup ====&lt;br /&gt;
* nft_meta.&lt;br /&gt;
[Awaits support for cgroup2]                                                                             &lt;br /&gt;
==== comment ====&lt;br /&gt;
* Built-in support via NFTA_RULE_USERDATA, since 3.15 (Pablo Neira).             &lt;br /&gt;
==== connbytes ====                                                              &lt;br /&gt;
* nft_ct, 4.5 kernel&lt;br /&gt;
==== connlabel ====                                                              &lt;br /&gt;
* nft_meta, since 3.16 (Florian Westphal).&lt;br /&gt;
==== connlimit ====&lt;br /&gt;
* consider native interface. Refer to [[Meters]].&lt;br /&gt;
==== connmark ====&lt;br /&gt;
* nft_meta.&lt;br /&gt;
==== conntrack ====&lt;br /&gt;
* nft_ct.&lt;br /&gt;
==== cpu ====&lt;br /&gt;
* nft_meta, since 3.18 (Valentina Giusti/Ana Rey).&lt;br /&gt;
==== dccp ====                                                                   &lt;br /&gt;
* nft_payload.    &lt;br /&gt;
[Unsupported option : dccp-option]&lt;br /&gt;
==== devgroup ====                                                               &lt;br /&gt;
* nft_meta, since 3.18 (Ana Rey).  &lt;br /&gt;
==== dscp ====                                              &lt;br /&gt;
* nft_payload.&lt;br /&gt;
==== ecn ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== esp ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== hashlimit ====                                                              &lt;br /&gt;
* meter statement. Refer to [[Meters]].&lt;br /&gt;
==== helper ====                                                                 &lt;br /&gt;
* nft_ct.&lt;br /&gt;
==== ipcomp ====&lt;br /&gt;
* nft_payload.&lt;br /&gt;
[Unsupported option : compres]&lt;br /&gt;
==== iprange ====                                                                &lt;br /&gt;
* nft_payload, through native range support. To emulate iptables --ports you need two rules.                                                   &lt;br /&gt;
==== ipvs ====&lt;br /&gt;
* consider native interface. Refer to [[Load balancing]].&lt;br /&gt;
==== length ====                                                                 &lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== limit ====                                                                  &lt;br /&gt;
* nft_limit. Refer to [[Stateful objects]].&lt;br /&gt;
==== mac ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== mark ====                                                                   &lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== multiport ====                                                              &lt;br /&gt;
* nft_payload. &lt;br /&gt;
[Unsupported option : ports]                                                                                         &lt;br /&gt;
==== nfacct ====&lt;br /&gt;
* consider native interface. Refer to [[Stateful objects]].&lt;br /&gt;
==== osf ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
==== owner ====                                                                  &lt;br /&gt;
* nft_meta. &lt;br /&gt;
[Unsupported option : socket-exists]                                                                     &lt;br /&gt;
==== pkttype ====                                                                &lt;br /&gt;
* nft_meta                                                                                                                 &lt;br /&gt;
==== sctp ====                                                                   &lt;br /&gt;
* nft_payload.&lt;br /&gt;
[Unsupported option: --chunk-types]&lt;br /&gt;
==== socket ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
==== statistic ====&lt;br /&gt;
* nft_numgen. Refer to [[Load balancing]].&lt;br /&gt;
==== policy ====&lt;br /&gt;
* consider native interface. Refer to [[Configuring_chains#Base_chain_policy]].&lt;br /&gt;
==== recent ====                                                                 &lt;br /&gt;
* consider native interface. Refer to [[Sets]].&lt;br /&gt;
==== set ====&lt;br /&gt;
* Use native nf_tables set infrastructure.                                       &lt;br /&gt;
==== state ====                                                                  &lt;br /&gt;
* nft_ct                                                                         &lt;br /&gt;
==== tcp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
==== tcpmss ====                                                                 &lt;br /&gt;
* nft_exthdr, since 4.14&lt;br /&gt;
==== udp ====                                                                 &lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
=== targets: xt ===                                                              &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== CLASSIFY ====                                                               &lt;br /&gt;
* nft_meta, since 3.14 (Tomasz Bursztyka).    &lt;br /&gt;
==== CONNMARK ====                                                                                                                    &lt;br /&gt;
==== MARK ====                                                                   &lt;br /&gt;
* nft_meta, since 3.14 (Tomasz Bursztyka).                                       &lt;br /&gt;
==== NFLOG ====                                                                  &lt;br /&gt;
* nft_log, since 3.17 (Pablo Neira).                                             &lt;br /&gt;
==== NFQUEUE ====                                                                &lt;br /&gt;
* nft_queue, since 3.14 (Eric Leblond). &#039;&#039;&#039;Bridge support still missing&#039;&#039;&#039;.&lt;br /&gt;
==== TEE ====&lt;br /&gt;
* nft_dup, since 4.3 (Pablo Neira)&lt;br /&gt;
==== TRACE ====                                                                  &lt;br /&gt;
* nft_meta, since 3.14 (Tomasz Bursztyka).&lt;br /&gt;
&lt;br /&gt;
==== TCPMSS ====                                                                 &lt;br /&gt;
* nft_exthdr, since 4.14&lt;br /&gt;
&lt;br /&gt;
=== matches: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== ah ====                                                                     &lt;br /&gt;
* nft_payload + nft_cmp&lt;br /&gt;
==== icmp ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
[Unsupported codes: network-unreachable, host-unreachable, protocol-unreachable, port-unreachable, fragmentation-needed, source-route-failed, network-unknown, host-unknown, network-prohibited, host-prohibited, TOS-network-unreachable, TOS-host-unreachable, communication-prohibited, host-precedence-violation, precedence-cutoff, network-redirect, host-redirect, TOS-network-redirect, TOS-host-redirect, ttl-zero-during-transit, ttl-zero-during-reassembly, ip-header-bad and required-option-missing ]&lt;br /&gt;
==== realm ====                                                                  &lt;br /&gt;
* nft_meta, through NFT_META_RTCLASSID. &lt;br /&gt;
==== rp_filter ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel&lt;br /&gt;
==== ttl ====&lt;br /&gt;
&lt;br /&gt;
=== matches: ipv6 ===                                                            &lt;br /&gt;
            &lt;br /&gt;
==== rp_filter ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel                                                                    &lt;br /&gt;
==== ah  ====                                                                    &lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
==== eui64 ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
==== frag ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
==== hbh ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
HBH options are not supported yet.&lt;br /&gt;
[Unsupported option: --hbh-opts]&lt;br /&gt;
==== hl ==== &lt;br /&gt;
* nft_payload.    &lt;br /&gt;
==== icmp6 ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
[Unsupported icmpv6 codes: no-route, communication-prohibited, beyond-scope, address-unreachable, port-unreachable, failed-policy, reject-route, ttl-zero-during-transit, ttl-zero-during-reassembly, bad-header, unknown-header-type and unknown-option]&lt;br /&gt;
==== ipv6header ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
==== mh ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
[Needs bug fixation for option mh-type with range]&lt;br /&gt;
==== rt ====&lt;br /&gt;
* nft_exthdr + nft_cmp&lt;br /&gt;
[Unsupported options: --rt-0-res, --rt-0-addrs, --rt-0-not-strict]&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===&lt;br /&gt;
==== ECN ====                                                                    &lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== DNAT ====    &lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).    &lt;br /&gt;
==== LOG ====                                                                    &lt;br /&gt;
* nft_log, since 3.17 (Pablo Neira).  &lt;br /&gt;
[Unsupported options : log-tcp-sequence, log-tcp-options, log-ip-options, log-uid, log-macdecode]&lt;br /&gt;
==== MASQUERADE ====&lt;br /&gt;
* nft_masq, since 3.18 (Arturo Borrero).&lt;br /&gt;
==== REDIRECT ====&lt;br /&gt;
* nft_redirect, since 3.19 (Arturo Borrero).&lt;br /&gt;
&lt;br /&gt;
==== REJECT ====                                                                 &lt;br /&gt;
* nft_reject_ipv4, since 3.13 (Patrick McHardy/Eric Leblond).                                         &lt;br /&gt;
* nft_reject_inet, since 3.14 (Patrick McHardy).&lt;br /&gt;
* nft_reject_bridge, since 3.18 (Pablo Neira)    &lt;br /&gt;
==== SNAT ====                                                            &lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv6 ===&lt;br /&gt;
==== DNAT ====&lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).    &lt;br /&gt;
==== LOG ====&lt;br /&gt;
* nft_log, since 3.17 (Pablo Neira).  &lt;br /&gt;
[Unsupported options : log-tcp-sequence, log-tcp-options, log-ip-options, log-uid, log-macdecode]&lt;br /&gt;
==== MASQUERADE ====                                                             &lt;br /&gt;
* nft_masq, since 3.18 (Arturo Borrero).&lt;br /&gt;
==== REDIRECT ====                                                               &lt;br /&gt;
* nft_redirect, since 3.19 (Arturo Borrero).&lt;br /&gt;
&lt;br /&gt;
==== REJECT ====                                                                                   &lt;br /&gt;
* nft_reject_ipv6, since 3.14 (Patrick McHardy/Eric Leblond)                     &lt;br /&gt;
* nft_reject_inet, since 3.14 (Patrick McHardy).&lt;br /&gt;
* nft_reject_bridge, since 3.18 (Pablo Neira)    &lt;br /&gt;
==== SNAT ====                                                                                                                          &lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).&lt;br /&gt;
&lt;br /&gt;
=== matches: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== 802.3 ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== among ====&lt;br /&gt;
* sets&lt;br /&gt;
&lt;br /&gt;
==== arp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== ip ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== ip6 ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== limit ====&lt;br /&gt;
* nft_limit&lt;br /&gt;
&lt;br /&gt;
==== mark ====&lt;br /&gt;
* nft_mark&lt;br /&gt;
&lt;br /&gt;
==== pkttype ====&lt;br /&gt;
* nft_meta&lt;br /&gt;
&lt;br /&gt;
==== stp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== vlan ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== targets: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== dnat ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== snat ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== redirect ====&lt;br /&gt;
* nft_payload + nft_meta (pkttype set unicast)&lt;br /&gt;
&lt;br /&gt;
==== mark ====&lt;br /&gt;
* nft_mark&lt;br /&gt;
&lt;br /&gt;
== Deprecated extensions ==                                                      &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches ===                                                                  &lt;br /&gt;
 &lt;br /&gt;
==== physdev ====                                                                &lt;br /&gt;
* br_netfilter aims to be deprecated by nftables.                                                                                &lt;br /&gt;
==== quota ====                                                                  &lt;br /&gt;
* nfacct already provides quota support.  &lt;br /&gt;
==== tos ====&lt;br /&gt;
* deprecated by dscp                                       &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== targets ===                                                                  &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== CLUSTERIP ====                                                              &lt;br /&gt;
* deprecated by cluster match.                                                   &lt;br /&gt;
==== TOS ====                                                                 &lt;br /&gt;
* deprecated by DSCP&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== ULOG ====                                                                   &lt;br /&gt;
* Removed from tree since 3.17.&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Supported_features_compared_to_xtables&amp;diff=335</id>
		<title>Supported features compared to xtables</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Supported_features_compared_to_xtables&amp;diff=335"/>
		<updated>2018-08-16T21:18:12Z</updated>

		<summary type="html">&lt;p&gt;Nevola: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Last update: 2016/Jan/11                                                        &lt;br /&gt;
                                                                                 &lt;br /&gt;
This page tracks the list of supported and unsupported extensions with comments and suggestions.&lt;br /&gt;
                                                                                 &lt;br /&gt;
== Unsupported extensions ==                                                     &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches: xt ===                                                              &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== bpf ====                                                                    &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== cluster ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== connlimit ====                                                              &lt;br /&gt;
* consider native interface. Refer to [[Meters]].&lt;br /&gt;
==== ipvs ====                                                                   &lt;br /&gt;
* consider native interface. Refer to [[Load balancing]].&lt;br /&gt;
==== nfacct ====                                                                 &lt;br /&gt;
* consider native interface. Refer to [[Stateful objects]].&lt;br /&gt;
==== osf ====                                                                    &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== policy ====                                                                 &lt;br /&gt;
* consider native interface. Refer to [[Configuring_chains#Base_chain_policy]].&lt;br /&gt;
==== rateest ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== recent ====                                                                 &lt;br /&gt;
* consider native interface. Refer to [[Sets]].&lt;br /&gt;
==== socket ====                                                                 &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== string ====                                                                 &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== time ====&lt;br /&gt;
* consider native interface                                                    &lt;br /&gt;
==== u32 ====                                                                    &lt;br /&gt;
* raw expressions?                                                               &lt;br /&gt;
&lt;br /&gt;
=== targets: xt ===                                                              &lt;br /&gt;
&lt;br /&gt;
==== AUDIT ====                                                                  &lt;br /&gt;
* add nft_audit.                                                                 &lt;br /&gt;
==== CHECKSUM ====                                                               &lt;br /&gt;
* add nft_payload.&lt;br /&gt;
* To the day, the only use case for this was DHCP clients not working with partial checksums. That should be fixed nowadays.&lt;br /&gt;
* See https://lwn.net/Articles/396466/ and https://www.spinics.net/lists/kvm/msg37660.html&lt;br /&gt;
* See https://bugs.launchpad.net/ubuntu/+source/isc-dhcp/+bug/930962 and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=832090&lt;br /&gt;
&lt;br /&gt;
==== CONNSECMARK ====&lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== CT ====                                                                     &lt;br /&gt;
* nft_meta_target. Refer to [[Matching_connection_tracking_stateful_metainformation]].&lt;br /&gt;
==== DSCP ====&lt;br /&gt;
* add nft_mangle. Refer to [[Quick_reference-nftables_in_10_minutes#Ip]].&lt;br /&gt;
==== HL ====&lt;br /&gt;
* add nft_mangle. Refer to [[Quick_reference-nftables_in_10_minutes#Ip6]].&lt;br /&gt;
==== HMARK ====                                                                  &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== IDLETIMER ====                                                              &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== LED ====                                                                    &lt;br /&gt;
* consider native (need this?)                                                   &lt;br /&gt;
==== NETMAP ====                                                                 &lt;br /&gt;
* nft_nat.                                                                       &lt;br /&gt;
==== RATEEST ====                                                                &lt;br /&gt;
* consider native interface                                                      &lt;br /&gt;
==== SECMARK ====                                                                &lt;br /&gt;
* nft_meta_target&lt;br /&gt;
==== SET ====                                                                 &lt;br /&gt;
* consider native interface &lt;br /&gt;
==== SYNPROXY ====                                                                 &lt;br /&gt;
* consider native interface                                                                 &lt;br /&gt;
==== TCPOPTSTRIP ====                                                            &lt;br /&gt;
* consider native interface                                                                                                   &lt;br /&gt;
==== TPROXY ====                                                                 &lt;br /&gt;
* consider native interface                                                              &lt;br /&gt;
                                                                       &lt;br /&gt;
=== targets: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== TTL ====&lt;br /&gt;
                                                                                 &lt;br /&gt;
=== targets: ipv6 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== NPT ====                                                                    &lt;br /&gt;
* consider native interface&lt;br /&gt;
&lt;br /&gt;
=== targets: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== arpreply ====&lt;br /&gt;
* consider native interface&lt;br /&gt;
&lt;br /&gt;
=== watchers: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== log ====&lt;br /&gt;
* nft_log&lt;br /&gt;
&lt;br /&gt;
==== nflog ====&lt;br /&gt;
* nft_log&lt;br /&gt;
&lt;br /&gt;
=== targets: arp ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
== Supported extensions ==                                                       &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches: xt ===                                                              &lt;br /&gt;
    &lt;br /&gt;
==== addrtype ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel&lt;br /&gt;
==== cgroup ====&lt;br /&gt;
* nft_meta.&lt;br /&gt;
[Awaits support for cgroup2]                                                                             &lt;br /&gt;
==== comment ====&lt;br /&gt;
* Built-in support via NFTA_RULE_USERDATA, since 3.15 (Pablo Neira).             &lt;br /&gt;
==== connbytes ====                                                              &lt;br /&gt;
* nft_ct, 4.5 kernel&lt;br /&gt;
==== connlabel ====                                                              &lt;br /&gt;
* nft_meta, since 3.16 (Florian Westphal).&lt;br /&gt;
==== connmark ====&lt;br /&gt;
* nft_meta.&lt;br /&gt;
==== conntrack ====&lt;br /&gt;
* nft_ct.&lt;br /&gt;
==== cpu ====&lt;br /&gt;
* nft_meta, since 3.18 (Valentina Giusti/Ana Rey).&lt;br /&gt;
==== dccp ====                                                                   &lt;br /&gt;
* nft_payload.    &lt;br /&gt;
[Unsupported option : dccp-option]&lt;br /&gt;
==== devgroup ====                                                               &lt;br /&gt;
* nft_meta, since 3.18 (Ana Rey).  &lt;br /&gt;
==== dscp ====                                              &lt;br /&gt;
* nft_payload.&lt;br /&gt;
==== ecn ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== esp ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== hashlimit ====                                                              &lt;br /&gt;
* meter statement. Refer to [[Meters]].&lt;br /&gt;
&lt;br /&gt;
==== helper ====                                                                 &lt;br /&gt;
* nft_ct.&lt;br /&gt;
&lt;br /&gt;
==== ipcomp ====&lt;br /&gt;
* nft_payload.&lt;br /&gt;
[Unsupported option : compres]&lt;br /&gt;
==== iprange ====                                                                &lt;br /&gt;
* nft_payload, through native range support. To emulate iptables --ports you need two rules.                                                   &lt;br /&gt;
==== length ====                                                                 &lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== limit ====                                                                  &lt;br /&gt;
* nft_limit. Refer to [[Stateful objects]].&lt;br /&gt;
==== mac ====                                                                    &lt;br /&gt;
* nft_payload.                                                                   &lt;br /&gt;
==== mark ====                                                                   &lt;br /&gt;
* nft_meta.                                                                      &lt;br /&gt;
==== multiport ====                                                              &lt;br /&gt;
* nft_payload. &lt;br /&gt;
[Unsupported option : ports]                                                                                         &lt;br /&gt;
==== owner ====                                                                  &lt;br /&gt;
* nft_meta. &lt;br /&gt;
[Unsupported option : socket-exists]                                                                     &lt;br /&gt;
==== pkttype ====                                                                &lt;br /&gt;
* nft_meta                                                                                                                 &lt;br /&gt;
==== statistic ====                                                              &lt;br /&gt;
* nft_numgen&lt;br /&gt;
==== sctp ====                                                                   &lt;br /&gt;
* nft_payload.&lt;br /&gt;
[Unsupported option: --chunk-types]&lt;br /&gt;
&lt;br /&gt;
==== set ====&lt;br /&gt;
* Use native nf_tables set infrastructure.                                       &lt;br /&gt;
==== state ====                                                                  &lt;br /&gt;
* nft_ct                                                                         &lt;br /&gt;
==== tcp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== tcpmss ====                                                                 &lt;br /&gt;
* nft_exthdr, since 4.14&lt;br /&gt;
&lt;br /&gt;
==== udp ====                                                                 &lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
=== targets: xt ===                                                              &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== CLASSIFY ====                                                               &lt;br /&gt;
* nft_meta, since 3.14 (Tomasz Bursztyka).    &lt;br /&gt;
==== CONNMARK ====                                                                                                                    &lt;br /&gt;
==== MARK ====                                                                   &lt;br /&gt;
* nft_meta, since 3.14 (Tomasz Bursztyka).                                       &lt;br /&gt;
==== NFLOG ====                                                                  &lt;br /&gt;
* nft_log, since 3.17 (Pablo Neira).                                             &lt;br /&gt;
==== NFQUEUE ====                                                                &lt;br /&gt;
* nft_queue, since 3.14 (Eric Leblond). &#039;&#039;&#039;Bridge support still missing&#039;&#039;&#039;.&lt;br /&gt;
==== TEE ====&lt;br /&gt;
* nft_dup, since 4.3 (Pablo Neira)&lt;br /&gt;
==== TRACE ====                                                                  &lt;br /&gt;
* nft_meta, since 3.14 (Tomasz Bursztyka).&lt;br /&gt;
&lt;br /&gt;
==== TCPMSS ====                                                                 &lt;br /&gt;
* nft_exthdr, since 4.14&lt;br /&gt;
&lt;br /&gt;
=== matches: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== ah ====                                                                     &lt;br /&gt;
* nft_payload + nft_cmp&lt;br /&gt;
==== icmp ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
[Unsupported codes: network-unreachable, host-unreachable, protocol-unreachable, port-unreachable, fragmentation-needed, source-route-failed, network-unknown, host-unknown, network-prohibited, host-prohibited, TOS-network-unreachable, TOS-host-unreachable, communication-prohibited, host-precedence-violation, precedence-cutoff, network-redirect, host-redirect, TOS-network-redirect, TOS-host-redirect, ttl-zero-during-transit, ttl-zero-during-reassembly, ip-header-bad and required-option-missing ]&lt;br /&gt;
==== realm ====                                                                  &lt;br /&gt;
* nft_meta, through NFT_META_RTCLASSID. &lt;br /&gt;
==== rp_filter ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel&lt;br /&gt;
==== ttl ====&lt;br /&gt;
&lt;br /&gt;
=== matches: ipv6 ===                                                            &lt;br /&gt;
            &lt;br /&gt;
==== rp_filter ====&lt;br /&gt;
* nft_fib, starting with 4.10 kernel                                                                    &lt;br /&gt;
==== ah  ====                                                                    &lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
==== eui64 ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
==== frag ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
==== hbh ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
HBH options are not supported yet.&lt;br /&gt;
[Unsupported option: --hbh-opts]&lt;br /&gt;
==== hl ==== &lt;br /&gt;
* nft_payload.    &lt;br /&gt;
==== icmp6 ====&lt;br /&gt;
* nft_payload + nft_cmp.&lt;br /&gt;
[Unsupported icmpv6 codes: no-route, communication-prohibited, beyond-scope, address-unreachable, port-unreachable, failed-policy, reject-route, ttl-zero-during-transit, ttl-zero-during-reassembly, bad-header, unknown-header-type and unknown-option]&lt;br /&gt;
==== ipv6header ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
==== mh ====&lt;br /&gt;
* nft_exthdr + nft_cmp.&lt;br /&gt;
[Needs bug fixation for option mh-type with range]&lt;br /&gt;
==== rt ====&lt;br /&gt;
* nft_exthdr + nft_cmp&lt;br /&gt;
[Unsupported options: --rt-0-res, --rt-0-addrs, --rt-0-not-strict]&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===&lt;br /&gt;
==== ECN ====                                                                    &lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== DNAT ====    &lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).    &lt;br /&gt;
==== LOG ====                                                                    &lt;br /&gt;
* nft_log, since 3.17 (Pablo Neira).  &lt;br /&gt;
[Unsupported options : log-tcp-sequence, log-tcp-options, log-ip-options, log-uid, log-macdecode]&lt;br /&gt;
==== MASQUERADE ====&lt;br /&gt;
* nft_masq, since 3.18 (Arturo Borrero).&lt;br /&gt;
==== REDIRECT ====&lt;br /&gt;
* nft_redirect, since 3.19 (Arturo Borrero).&lt;br /&gt;
&lt;br /&gt;
==== REJECT ====                                                                 &lt;br /&gt;
* nft_reject_ipv4, since 3.13 (Patrick McHardy/Eric Leblond).                                         &lt;br /&gt;
* nft_reject_inet, since 3.14 (Patrick McHardy).&lt;br /&gt;
* nft_reject_bridge, since 3.18 (Pablo Neira)    &lt;br /&gt;
==== SNAT ====                                                            &lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv6 ===&lt;br /&gt;
==== DNAT ====&lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).    &lt;br /&gt;
==== LOG ====&lt;br /&gt;
* nft_log, since 3.17 (Pablo Neira).  &lt;br /&gt;
[Unsupported options : log-tcp-sequence, log-tcp-options, log-ip-options, log-uid, log-macdecode]&lt;br /&gt;
==== MASQUERADE ====                                                             &lt;br /&gt;
* nft_masq, since 3.18 (Arturo Borrero).&lt;br /&gt;
==== REDIRECT ====                                                               &lt;br /&gt;
* nft_redirect, since 3.19 (Arturo Borrero).&lt;br /&gt;
&lt;br /&gt;
==== REJECT ====                                                                                   &lt;br /&gt;
* nft_reject_ipv6, since 3.14 (Patrick McHardy/Eric Leblond)                     &lt;br /&gt;
* nft_reject_inet, since 3.14 (Patrick McHardy).&lt;br /&gt;
* nft_reject_bridge, since 3.18 (Pablo Neira)    &lt;br /&gt;
==== SNAT ====                                                                                                                          &lt;br /&gt;
* nft_nat, since 3.13 (Tomasz Bursztyka).&lt;br /&gt;
&lt;br /&gt;
=== matches: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== 802.3 ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== among ====&lt;br /&gt;
* sets&lt;br /&gt;
&lt;br /&gt;
==== arp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== ip ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== ip6 ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== limit ====&lt;br /&gt;
* nft_limit&lt;br /&gt;
&lt;br /&gt;
==== mark ====&lt;br /&gt;
* nft_mark&lt;br /&gt;
&lt;br /&gt;
==== pkttype ====&lt;br /&gt;
* nft_meta&lt;br /&gt;
&lt;br /&gt;
==== stp ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== vlan ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== targets: bridge ===&lt;br /&gt;
&lt;br /&gt;
==== dnat ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== snat ====&lt;br /&gt;
* nft_payload&lt;br /&gt;
&lt;br /&gt;
==== redirect ====&lt;br /&gt;
* nft_payload + nft_meta (pkttype set unicast)&lt;br /&gt;
&lt;br /&gt;
==== mark ====&lt;br /&gt;
* nft_mark&lt;br /&gt;
&lt;br /&gt;
== Deprecated extensions ==                                                      &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== matches ===                                                                  &lt;br /&gt;
 &lt;br /&gt;
==== physdev ====                                                                &lt;br /&gt;
* br_netfilter aims to be deprecated by nftables.                                                                                &lt;br /&gt;
==== quota ====                                                                  &lt;br /&gt;
* nfacct already provides quota support.  &lt;br /&gt;
==== tos ====&lt;br /&gt;
* deprecated by dscp                                       &lt;br /&gt;
                                                                                 &lt;br /&gt;
=== targets ===                                                                  &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== CLUSTERIP ====                                                              &lt;br /&gt;
* deprecated by cluster match.                                                   &lt;br /&gt;
==== TOS ====                                                                 &lt;br /&gt;
* deprecated by DSCP&lt;br /&gt;
&lt;br /&gt;
=== targets: ipv4 ===                                                            &lt;br /&gt;
                                                                                 &lt;br /&gt;
==== ULOG ====                                                                   &lt;br /&gt;
* Removed from tree since 3.17.&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
	<entry>
		<id>http://wiki.nftables.org/wiki-nftables/index.php?title=Load_balancing&amp;diff=158</id>
		<title>Load balancing</title>
		<link rel="alternate" type="text/html" href="http://wiki.nftables.org/wiki-nftables/index.php?title=Load_balancing&amp;diff=158"/>
		<updated>2017-06-19T22:33:34Z</updated>

		<summary type="html">&lt;p&gt;Nevola: /* Using Direct Server Return (DSR) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since nftables v0.7, there is support in place to perform [[Performing Network Address Translation (NAT) | NAT]] load balancing.&lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget the special NAT chain semantics: Only the first packet evaluates the rule, follow up packets rely on conntrack to apply the NAT information.&lt;br /&gt;
&lt;br /&gt;
== Round Robin ==&lt;br /&gt;
&lt;br /&gt;
This method uses the nftables [[Math operations | number generator]].&lt;br /&gt;
&lt;br /&gt;
The example below is distributing new connections in a round-robin fashion between 192.168.10.100 and 192.168.20.200.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft add rule nat prerouting dnat to numgen inc mod 2 map { \&lt;br /&gt;
               0 : 192.168.10.100, \&lt;br /&gt;
               1 : 192.168.20.200 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also emulate flow distribution with different backend weights using intervals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft add rule nat prerouting dnat to numgen inc mod 10 map { \&lt;br /&gt;
               0-5 : 192.168.10.100, \&lt;br /&gt;
               6-9 : 192.168.20.200 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution can be based on ports as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft add rule nat prerouting ip protocol tcp dnat to 192.168.1.100 : numgen inc mod 2 map {\&lt;br /&gt;
               0 : 4040 ,\&lt;br /&gt;
               1 : 4050 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Consistent Hash-based Distribution ==&lt;br /&gt;
&lt;br /&gt;
Using the nftables internal [[Math operations | hashing mechanisms]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft add rule x y dnat to jhash ip saddr . tcp dport mod 2 map { \&lt;br /&gt;
                0 : 192.168.20.100, \&lt;br /&gt;
                1 : 192.168.30.100 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This relies on the Jenkins hash.&lt;br /&gt;
&lt;br /&gt;
== Using stateless NAT ==&lt;br /&gt;
&lt;br /&gt;
You can perform load balancing through stateless NAT approach as well. You can combine this either with the round robin and consistent hash-based distribution approaches.&lt;br /&gt;
&lt;br /&gt;
The example below uses Round Robin flow distribution:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft add rule t c tcp dport 80 ip daddr set numgen inc mod 2 map { 0 : 192.168.1.100, 1 : 192.168.1.101 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is more lightweight that stateful NAT given there is no flow tracking in place.&lt;br /&gt;
&lt;br /&gt;
== Using Direct Server Return (DSR) ==&lt;br /&gt;
&lt;br /&gt;
This example performs a DSR topology for non connection oriented flows from ingress:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft add rule t c udp dport 53 ether saddr set aa:bb:cc:dd:ff:ee ether daddr set numgen inc mod 2 map { 0 : xx:xx:xx:xx:xx:xx, 1: yy:yy:yy:yy:yy:yy } fwd to eth0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An approach for connection oriented flows can be performed as shown below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
% nft add rule t c tcp dport 80 ether saddr set aa:bb:cc:dd:ff:ee ether daddr set jhash ip saddr . tcp sport mod 2 map { 0 : xx:xx:xx:xx:xx:xx, 1: yy:yy:yy:yy:yy:yy } fwd to eth0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nevola</name></author>
	</entry>
</feed>