nftables
nftables 是 Linux 内核提供的下一代网络过滤器(netfilter)框架,用于替代传统的 iptables
。它提供了更简洁的语法、更高的性能和更灵活的规则管理功能。
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
+
|
v
+-------------+ +------------------+
|table: filter| <---+ | table: nat |
|chain: INPUT | | | chain: PREROUTING|
+-----+-------+ | +--------+---------+
| | |
v | v
[local process] | **************** +--------------+
| +---------+ Routing decision +------> |table: filter |
v **************** |chain: FORWARD|
**************** +------+-------+
Routing decision |
**************** |
| |
v **************** |
+-------------+ +------> Routing decision <---------------+
|table: nat | | ****************
|chain: OUTPUT| | +
+-----+-------+ | |
| | v
v | +-------------------+
+--------------+ | | table: nat |
|table: filter | +----+ | chain: POSTROUTING|
|chain: OUTPUT | +--------+----------+
+--------------+ |
v
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
一、nftables 的核心概念
nftables 的架构基于以下核心组件:
1. 表(Table)
作用:表是规则的容器,用于分类不同的规则集合。
类型:常见的表类型包括:
filter
:用于过滤数据包(默认表)。nat
:用于网络地址转换(NAT)。mangle
:用于修改数据包的特定字段(如 TTL)。raw
:用于跳过连接跟踪(conntrack)。security
:用于 SELinux 等安全策略。
2. 链(Chain)
作用:链是规则的集合,定义数据包的处理流程。
钩子(Hook):链与内核的网络栈钩子点相关联,决定数据包的处理时机:
prerouting
:数据包进入网络栈前(用于 NAT)。input
:数据包进入本机(如 SSH 请求)。output
:数据包从本机发出。postrouting
:数据包离开本机之前(如 NAT)。forward
:数据包经过本机转发(如路由器)。
优先级(Priority):定义链的执行顺序(数值越小越先执行):
-32767
(最高优先级)到32767
(最低优先级)。
3. 规则(Rule)
作用:规则定义匹配条件和动作(Action)。
语法结构:
nft add rule <表名> <链名> <匹配条件> <动作>
示例:
nft add rule ip filter input tcp dport 22 accept
4. 数据包处理流程
数据包进入内核后,根据钩子点(如
prerouting
)触发对应的链。按链的优先级顺序执行规则。
如果匹配到规则,执行对应动作(如
accept
、drop
)。
二、nftables 的核心特性
1. 语法简洁
对比 iptables 的复杂语法,nftables 使用更直观的表达方式。
示例:
iptables:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
nftables:
nft add rule ip filter input tcp dport 22 accept
2. 性能优化
减少内核态/用户态切换:nftables 的规则存储方式更高效。
支持硬件加速:某些硬件(如网络卡)可直接加速 nftables 的规则匹配。
3. 丰富的匹配条件
支持更复杂的匹配(如 IP 地址、端口、协议、时间、用户、连接跟踪状态等)。
示例:
nft add rule ip filter input ip saddr 192.168.1.0/24 ct state established accept
4. 支持分类(Set)
分类(Set):用于存储大量 IP 地址、端口等,提升规则匹配效率。
示例:
nft add set ip filter blocked_ips { type ipv4_address; elements = { 192.168.1.100, 192.168.1.101 }; } nft add rule ip filter input ip saddr @blocked_ips drop
5. 支持元数据操作
修改数据包元数据(如 TTL、DSCP、ECN 等)。
示例:
nft add rule ip filter output meta mark set 0x1
6. 支持跳转(Jump)
跳转到其他链(类似 iptables 的
GOTO
)。示例:
nft add rule ip filter input jump custom_chain
三、nftables 的基本操作
1. 查看当前规则
nft list ruleset
2. 添加规则
nft add rule <表名> <链名> <匹配条件> <动作>
示例:
nft add rule ip filter input tcp dport 80 ct state new accept
3. 删除规则
nft delete rule <表名> <链名> handle <规则句柄>
获取句柄:
nft list ruleset
规则句柄在输出中显示(如
handle 1
)。
4. 修改规则
nft replace rule <表名> <链名> handle <句柄> <新规则>
5. 清空规则
nft flush table <表名>
四、nftables 的高级功能
1. NAT 配置
源地址转换(SNAT):
nft add rule ip nat postrouting meta oif "eth0" ip saddr 192.168.1.0/24 ip daddr 10.0.0.0/24 snat 203.0.113.1
目的地址转换(DNAT):
nft add rule ip nat prerouting ip daddr 203.0.113.1 tcp dport 80 dnat ip address 192.168.1.100
2. 连接跟踪(conntrack)
匹配连接状态(如
established
、related
、new
)。示例:
nft add rule ip filter input ct state established,related accept
3. 时间匹配
基于时间的规则(如只在白天允许访问)。
示例:
nft add rule ip filter input time weekdays(mon,tue,wed) time 08:00-18:00 accept
4. 用户匹配
基于用户或组的规则(需启用
CONFIG_NETFILTER_NETLINK_USERS
内核选项)。示例:
nft add rule ip filter input user id 1000 accept
5. 日志记录
记录匹配的数据包(需启用
CONFIG_NETFILTER_XT_LOG
)。示例:
nft add rule ip filter input log prefix "Blocked packet: " drop
五、nftables 与 iptables 的对比
六、nftables 的配置持久化
1. 保存规则
nft list ruleset > /etc/nftables.conf
2. 加载规则
nft -f /etc/nftables.conf
3. 开机自动加载
系统服务(如 systemd):
systemctl enable nftables systemctl start nftables
七、常见问题与调试
1. 规则未生效
检查规则是否正确添加(
nft list ruleset
)。检查链的钩子点和优先级是否正确。
确保未被其他规则(如默认策略)覆盖。
2. 性能问题
避免使用过多的
set
或复杂的匹配条件。使用
nft monitor
监控规则匹配情况:nft monitor
3. 日志记录
使用
log
动作记录匹配的数据包,并查看系统日志(journalctl
或/var/log/messages
)。
八、实际应用场景
1. 服务器防火墙
仅允许 SSH 和 HTTP 访问:
nft add rule ip filter input tcp dport 22 accept nft add rule ip filter input tcp dport 80 accept nft add rule ip filter input drop
2. 端口转发(NAT)
将外部端口 80 转发到本地 8080:
nft add rule ip nat prerouting tcp dport 80 dnat tcp to 192.168.1.100:8080
3. 限制流量
限制某个 IP 的流量速度(需启用
CONFIG_NETFILTER_NETLINK
):nft add rule ip filter input ip saddr 192.168.1.100 limit rate 100 packets/second
九、nftables 的资源
命令行工具:
nft
(通过apt install nftables
安装)。内核支持:需 Linux 3.13 及以上版本。
十、总结
nftables 是 Linux 防火墙的未来方向,其简洁的语法、高效的性能和灵活的功能使其成为 iptables
的强有力替代者。掌握 nftables 能显著提升网络管理效率,但需注意规则的优先级和钩子点的正确配置。
Comment