nftables 不仅替代了iptables的功能,而且替代了ip6tables、arptables、etables,并且nftables拥有使用额外脚本的能力。nftables的管理程序叫做nft,防火墙构建于此命令基础之上。nftables并不包含任何的内置表,这些由管理员决定需要哪些表并添加这些表的处理规则。
特性#
具有高级的类似编程语言的能力,如定义变量、外部文件;并且用于多种地址族的过滤和处理:
- ip:IPv4
- ip6:IPv6
- inet:IPv4和IPv6
- arp:ARP
- bridge:Linux内核的桥接
没有指定地址族时,默认使用ip;能够处理不同的地址族意味着nftables能够替代其他过滤机制arptables、etables、iptables和ip6tables。
处理逻辑: 用于决定规则将应用于哪个地址族。然后使用一个或多个表,其中包含了一个或多个规则链,规则链包含了处理规则。
钩子#
对于ip、ipv6、inet地址族:
- prerouting:刚到达且未被nftables处理的数据包。
- input:已经接收并且已经经过prerouting钩子的传入数据包。
- forward:如果数据包需要被发送到其他设备,将会通过forward钩子。
- output:从本地系统传输的数据包。
- postrouting:数据包离开系统之前,postrouting可以对数据包进行进一步修改。
arp地址族只能使用 input 和 output 钩子。
基本语法#
| 语法 | 描述 |
|---|---|
nft <command> <subcommand> <chain> <rule definition> | command:add、list、insert、delete、flushsubcommand:table、chain、rule |
表语法#
- add:添加表
- delete:删除表
- list:显示一个表中的所有规则链、规则
- flush:清除一个表中的所有规则链、规则
命令示例:
- -a: 查看句柄号
- -n: nftables执行地址和端口解析
# 列出所有表
nft list tables
# 添加一个表
nft add table filter
# 显示一个表
nft list table filter
规则链语法#
- add:将一条规则链添到一个表中
- create:在一个表中创建一条规则链
- delete:删除一条规则链
- flush:清除一条规则链中的所有规则
- list:显示一条规则链中的所有规则
- rename:重命名一条规则链
规则链类型:
- filter:过滤数据包
- route:数据包路由
- nat:网络地址转换
添加一条规则链时,必须制定规则链将要添加到的表,例如添加input规则链到filter表中:
# 声明一条叫做input的规则链添加到filter表中。规则链类型为filter,钩子为input,优先级为0
nft add chain filter input { type filter hook input priority 0 \; }
# 显示规则链
root@debian:~# nft -a -n list table filter
table ip filter { # handle 1
chain input { # handle 1
type filter hook input priority 0; policy accept;
}
}
并且添加output规则链到filter表中命令类似:
nft add chain filter output { type filter hook output priority 0 \; }
规则语法#
规则是过滤操作发生的地方!
- add:添加一条规则
- insert:在规则链中插入一个规则,可以在指定的位置插入
- delete:删除一条规则
在规则中需要指定匹配的准则,以及对匹配此规则的数据包应该采取的动作。nftables 使用各式各样的声明、表达式进行定义。
| 名称 | 描述 |
|---|---|
accept | 接受数据包并且停止处理。 |
continue | 继续处理此数据包。 |
drop | 停止处理并静默丢弃数据包。 |
goto | 发送到指定的规则链进行处理;但是不返回到调用的规则链 |
jump | 发送到指定的规则链进行处理并且当完成时或执行了返回的声明时返回到调用的规则链。 |
limit | 数据包匹配限制时,根据规则处理数据包 |
log | 记录该数据包并继续处理。 |
queue | 停止处理并且发送数据包到用户空间的程序。 |
reject | 停止处理并拒绝数据包。 |
return | 发送到调用的规则链进行处理。 |
示例:
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \;}
nft add rule inet filter input tcp dport 22 ct state established,related accept
# 查看规则
nft list table inet filter
连接跟踪 表达式使用数据包的元数据为接下来的规则处理提供信息。
IPV4
| 表达式 | 描述 |
|---|---|
checksum | IP报文头部的校验和。 |
daddr | 目标IP地址。 |
frag-off | 分片偏移。 |
hdrlenght | 包括选项在内的IP报文头部长度。 |
id | IP标识符 |
lenght | 数据包的总长度 |
protocol | 三层以上的层所使用的协议。 |
saddr | 源IP地址。 |
tos | 服务类型值。 |
ttl | 生存时间。 |
version | IP报文版本 |

