Flow tables

From nftables wiki
Jump to: navigation, search

Flow tables

Since Linux Kernel 4.3 and nft v0.6 nftables supports flow tables.

Flow tables provides a native replacement for the hashlimit match in iptables, however, you can use any selector, one or many through concatenations.

Using flow tables

The following commands create a table named filter, a chain named input which hooks incoming traffic and a rule that uses a flow table:

% nft add table filter
% nft add chain filter input {type filter hook input priority 0\;}
% nft add rule filter input tcp dport 22 ct state new flow table ssh-ftable { ip saddr limit rate 10/second } accept

In this example we create a rule to match new ssh (port 22) connections, which uses a flow table named ssh-ftable to limit the traffic rate to 10 packets per second for each source IP address. The available time units on limits are: second, minute, hour, day and week.

You can also use concatenations to build selectors:

% nft add rule filter input flow table cnt-ftable { iif . ip saddr . tcp dport timeout 60s counter }

This rule counts incoming packets based on the tuple (input interface index, IP source address, TCP destination port), the counters are dropped after 60 seconds without update.

Listing flow tables

To list the content matched by the flow table use:

% nft list flow table filter cnt-ftable
table ip filter {
	flow table cnt-ftable {
		type iface_index . ipv4_addr . inet_service
		flags timeout
		elements = { "wlan1" . . 55000 expires 38s : counter packets 2 bytes 220, "wlan1" . . 35460 expires 39s : counter packets 10 bytes 5988, "wlan1" . . 43254 expires 46s : counter packets 1 bytes 98}

Doing iptables hashlimit with nft

Flow tables replace iptables hashlimit in nft. You can use the tool iptables-translate to see how to translate hashlimit rules, currently available in the iptables git tree and expected in the next official release, current release is v1.6.1.

Almost all hashlimit options are available in nft, starting with --hashlimit-mode, it is replaced by the selector in a flow table. All modes are available except no mode, a flow table demands a selector, an iptables rule without hashlimit-mode isn't supported in nft. A simple rule translation is:

$ iptables -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-above 200/sec --hashlimit-mode srcip,dstport --hashlimit-name http1 -j DROP

$ nft add rule ip filter input tcp dport 80 flow table http1 { tcp dport . ip saddr limit rate over 200/second} counter drop

Notice that a flow table is named, like hashlimit, and using multiple hashlimit-modes is similar to using a concatenation of selectors. Also, --hashlimit-above is translated to limit rate over, to simulate --hashlimit-upto just omit or replace over with until in the rule.

The options --hashlimit-burst and --hashlimit-htable-expire are translated to burst and timeout in a flow table:

$ iptables -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

$ nft add rule ip filter input tcp dport 80 flow table http2 { tcp dport . ip saddr timeout 3s limit rate over 200 kbytes/second burst 1 mbytes} counter drop

This rule shows how timeout and burst are used in a flow table, also notice that flow tables, similarly to hashlimit, accepts limiting rates by bytes frequency instead of packets.

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 flow table selector, attach to ip saddr for source address and to ip daddr for destination adress:

$ iptables -A INPUT -m tcp -p tcp --dport 80 -m hashlimit --hashlimit-upto 200 --hashlimit-mode srcip --hashlimit-name http3 --hashlimit-srcmask 24 -j DROP

$ nft add rule ip filter input tcp dport 80 flow table http3 { ip saddr and limit rate 200/second} counter drop

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.

The remaining options, --hashlimit-htable-max, --hashlimit-htable-size and --hashlimit-htable-gcinterval don't apply to flow tables.