nftables is a modern packet filtering framework for Linux and is set to replace iptables in the long term. In this post, I present the most useful commands that have proven effective in my daily admin work.
The creation of new tables and chains is rarely needed in my practice, so I won’t cover that here.
In Part 1, I explain the basic concepts. In Part 2, I go over the most important commands.
Definition of Terms
table
A table is the top-level organizational unit. It contains chains, sets, maps, flowtables, and objects. In the following, I’ll focus only on chains and sets.
Common families for tables:
ip(IPv4 only)ip6(IPv6 only)inet(combines IPv4 + IPv6)arp,bridge,netdev(for special scenarios)
Example of a simple inet table:
table inet mytable {
set blacklist {
type ipv4_addr
elements = { 1.2.3.4, 5.6.7.8 }
}
map portmap {
type inet_service : verdict
elements = { 22 : drop, 80 : accept }
}
chain input {
type filter hook input priority 0; policy accept;
ip saddr @blacklist drop
}
counter mycounter {
packets 0 bytes 0
}
}chain
A chain is a container for rules and processes incoming, forwarded, or outgoing packets—depending on which hook it is bound to.
Typical examples:
chain inputchain outputchain forward- custom chains like
chain f2b-chain(for fail2ban)
Each chain can also define a policy — this is the default behavior if no rule matches:
drop→ the packet is droppedaccept→ the packet is accepted
Example of a simple input chain:
chain input {
type filter hook input priority 0;
policy accept;
ip saddr @blacklist drop
tcp dport 22 accept
}In this example:
- The chain is bound to the input hook (i.e., incoming packets),
- with the policy
acceptas the default behavior, - and evaluates two rules: blocking IPs from a set (
@blacklist) and allowing SSH (port 22).
rule
A rule defines what should happen to a network packet when certain conditions are met. It consists of:
- Actions (e.g.,
accept,drop,reject,log,counter) - Match conditions (e.g., source IP, destination port, protocol)
Example:
tcp dport 22 ip saddr @addr-set-sshd rejectThis rule:
- applies to TCP connections targeting port 22 (SSH),
- checks whether the source address is included in a set called
addr-set-sshd, - and rejects the packet with a
rejectresponse.
set
A set is a dynamically populated list of values that can be referenced in rules. Typical contents include IP addresses, ports, or even combinations (e.g., IP + port).
Sets are commonly used for:
- IP blocklists (e.g., in combination with Fail2Ban)
- Port allowances
- Optimizing multiple rules into a single one
Example:
set blacklist {
type ipv4_addr;
elements = { 1.2.3.4, 5.6.7.8 }
}- type defines the data type (e.g.,
ipv4_addr,inet_service,verdict, …) - elements contains the entries
Sets are especially useful because they can be modified at runtime—without having to reload the entire ruleset.
hook
A hook binds a chain to a specific point in the network stack, i.e., to a phase of packet processing in the Linux kernel. Without a hook, a chain is only usable internally (e.g., as a target for jump statements). Common hooks include: input, output, forward, prerouting, and postrouting.
Example of a chain with a hook:
chain input {
type filter hook input priority 0;
policy accept;
ip saddr @blacklist drop
}This definition:
- binds the chain to the input hook (incoming packets to the system),
- with priority 0 (execution order within the hook),
- and sets the policy to
acceptif no rule matches.
Priority (priority) determines the order of execution if multiple chains use the same hook.
Lower values → earlier execution.
ruleset
The ruleset is the complete nftables rule configuration on a system.
It includes all tables, chains, rules, sets, maps, objects, and flowtables—that is, the entire firewall state.
Leave a Reply
You must be logged in to post a comment.