nftables是目前主流新版本的Linux默认集成或支持防火墙管理工具。nftables 的语法设计追求清晰和强大,旨在提供比传统工具更灵活和高效的规则管理方式。下面阿祥会通过一个表格帮你快速了解其核心语法结构,然后详细解释各个部分,并提供一些实用示例。
组件 | 描述 |
---|---|
表 (Table) | 规则的逻辑容器,指定地址簇(协议家族) |
链 (Chain) | 表内的规则集合,定义挂钩点、类型和优先级 |
规则 (Rule) | 具体的匹配条件和动作 |
集合 (Set) | 存储IP、端口等值的集合,用于高效匹配 |
语法组件详解
1. 表 (Table)
表是 nftables 规则的最高层级组织单位,每个表都属于一个特定的地址簇(address family),这决定了该表可以处理哪些类型的网络流量。
地址簇类型:
例,创建一个名为 my_filter的表来处理 IPv4 和 IPv6 流量:
nft add table inet my_filter
2. 链 (Chain)
链存在于表中,是规则的容器。链分为基链(base chain) 和常规链(regular chain)。
基链:是网络数据包的入口点,需要指定关键参数:
例,在 inet my_filter表中创建一个名为 input的过滤链,处理进入本机的数据包,优先级为0,默认丢弃:
nft add chain inet my_filter input { type filter hook input priority 0 \; policy drop \; }
3. 规则 (Rule)
规则结构:nft add rule <family> <table_name> <chain_name> <matches> <action>
匹配条件 (Matches):
动作 (Action/Verdict):
# 允许已建立的和相关的连接
nft add rule inet my_filter input ct state established,related accept
# 允许来自lo接口的所有流量(本地回环)
nft add rule inet my_filter input iifname "lo" accept
# 允许SSH连接(端口22)
nft add rule inet my_filter input tcp dport 22 ct state new accept
# 记录并丢弃所有其他输入流量
nft add rule inet my_filter input log prefix "Dropped: " drop
集合用于存储一组值(如IP地址、端口号、网络接口等),可以在规则中被引用,使规则更简洁高效,尤其适合管理动态或大量的对象。
# 创建一个名为bad_ips的IPv4地址集合
nft add set inet my_filter bad_ips { type ipv4_addr \; }
# 向集合中添加IP地址
nft add element inet my_filter bad_ips { 10.0.0.5, 192.168.1.100 }
# 在规则中引用集合(丢弃来自bad_ips集合中IP的流量)
nft add rule inet my_filter input ip saddr @bad_ips drop
映射是键值对的集合,允许根据匹配的键动态选择动作,实现更复杂的策略路由或策略决策。
# 创建一个映射,将目标端口映射到允许的源IP网段
nft add map inet my_filter port_to_src { type inet_service : ipv4_addr \; }
nft add element inet my_filter port_to_src { 80 : 192.168.1.0/24, 22 : 10.0.0.0/8 }
# 规则:检查目标端口,并验证源IP是否在映射定义的对应网段内
nft add rule inet my_filter input tcp dport vmap @port_to_src
常用命令与管理
nft list ruleset
列出所有当前生效的规则、表、链和集合。
nft -a list ruleset
查看规则的 handle
(句柄,唯一标识),然后 nft delete rule [family] [table] [chain] handle [handle_num]
。
nft flush chain [family] [table_name] [chain_name] # 清空链
nft flush table [family] [table_name] # 清空表
nft flush ruleset # 清空所有规则
nft list ruleset > /etc/nftables.conf # 导出当前规则
systemctl enable nftables --now # 启用并立即启动nftables服务(重启后自动加载规则)
也可在 /etc/nftables.conf
中直接编写规则,语法与命令行一致。
高级功能示例
# 限制SSH连接尝试速率(每分钟5次,突发5个)
nft add rule inet my_filter input tcp dport 22 ct state new limit rate 5/minute burst 5 drop
基于时间的规则:使用 hour
和 day
字段限制流量在特定时间段。
# 只在工作日9点到17点允许SSH
nft add rule inet my_filter input tcp dport 22 time hour 09:00-17:00 day mon,tue,wed,thu,fri accept
NAT(网络地址转换):
# 创建nat表
nft add table ip nat
# 创建postrouting链做SNAT(Masquerade)
nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule ip nat postrouting oifname "eth0" masquerade
# 创建prerouting链做DNAT(端口转发)
nft add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
nft add rule ip nat prerouting iifname "eth0" tcp dport 8080 dnat to 192.168.1.10:80
nftables 的核心思想是“表 -> 链 -> 规则”的层级结构,配合丰富的匹配条件和动作,以及高效的集合和映射。建议从简单的规则开始,逐步尝试更复杂的功能。多使用 nft list ruleset
查看当前配置,并善用持久化保存。