nftables与iptables的核心差异
nftables是Linux内核3.13引入的下一代包过滤框架,从内核5.0开始成为默认防火墙后端,逐步替代iptables。nftables统一了iptables、ip6tables、arptables和ebtables的功能,通过单一配置文件管理IPv4/IPv6网络过滤规则,在规则匹配效率、配置可读性和原子更新方面都有显著提升。本文详解nftables的表/链/树结构,以及服务器安全加固中常见的规则配置。
nftables的架构设计相比iptables有三点关键变化。第一,nftables引入了通用规则表达式和虚拟机(nft VM)机制,协议族(IPv4、IPv6、ARP、Bridge、Netdev)通过同一套语法配置,不再需要多个独立工具。第二,规则以链式有序存储,支持集合(Set)和字典(Map)数据结构,同一类规则可用一条语句表达,减少规则数量。第三,规则更新通过netlink接口原子提交,不会出现iptables逐条追加时的中间状态不一致问题。
CentOS 8及以上版本默认使用nftables作为firewalld后端,Ubuntu 20.04+同样预装nftables。通过nft命令行工具或/etc/nftables.conf配置文件管理规则。
表与链的基础配置
nftables的配置层次为:表(Table)→ 链(Chain)→ 规则(Rule)。表按协议族划分,最常用的是inet族,同时覆盖IPv4和IPv6流量。
# 创建inet族表
nft add table inet filter
# 创建input链,默认策略丢弃
nft 'add chain inet filter input { type filter hook input priority 0; policy drop; }'
# 创建output链,默认策略接受
nft 'add chain inet filter output { type filter hook output priority 0; policy accept; }'
# 创建forward链
nft 'add chain inet filter forward { type filter hook forward priority 0; policy drop; }'
priority参数定义钩子执行顺序,数值越小越先执行。filter类型的链通常使用priority 0。policy定义链末尾的默认动作,input链设为drop遵循最小权限原则,只放行明确允许的流量。
基础放行规则与回环接口配置
设置默认drop策略后,第一条规则必须放行回环接口和已建立连接,否则服务器自身通信中断。
# 放行回环接口
nft add rule inet filter input iifname "lo" accept
# 放行已建立连接和相关连接
nft add rule inet filter input ct state established,related accept
# 放行ICMP(ping)请求,限制速率
nft add rule inet filter input ip protocol icmp icmp type echo-request limit rate 5/second accept
# 放行SSH,限制并发连接数
nft add rule inet filter input tcp dport 22 ct state new limit rate 3/minute accept
# 放行HTTP/HTTPS
nft add rule inet filter input tcp dport { 80, 443 } accept
ct state established,related是安全防护的关键规则,利用连接跟踪机制只允许响应流量进入服务器。SSH服务的限速规则防止暴力破解,每分钟最多3个新连接。ICMP限速规则防止Ping洪水攻击。
集合与字典的高级用法
nftables的集合(Set)功能是相比iptables的重要改进,可以用一条规则匹配多个IP地址、端口或网络段。
# 定义IP地址集合
nft add set inet filter blocked_ips { type ipv4_addr \; flags interval \; }
nft add element inet filter blocked_ips { 192.168.1.100, 10.0.0.0/8, 172.16.0.0/12 }
# 禁止集合内IP访问服务器
nft add rule inet filter input ip saddr @blocked_ips drop
# 定义端口集合
nft add set inet filter service_ports { type inet_service \; }
nft add element inet filter service_ports { 80, 443, 8080, 8443 }
nft add rule inet filter input tcp dport @service_ports accept
# 使用字典映射端口到动作
nft add map inet filter port_action { type inet_service : verdict \; }
nft add element inet filter port_action { 22 : accept, 3306 : drop, 6379 : drop }
nft add rule inet filter input tcp dport vmap @port_action
vmap(verdict map)实现端口到动作的直接映射,一条规则即可完成多个端口的差异化处理。集合的flags interval属性支持CIDR网段写法,适合批量封禁IP段。
NAT地址转换与端口转发配置
nftables的NAT配置通过nat表实现,支持SNAT(源地址转换)和DNAT(目的地址转换)。
# 创建nat表
nft add table inet nat
# 创建postrouting链(SNAT)
nft 'add chain inet nat postrouting { type nat hook postrouting priority 100; }'
# 出口IP地址伪装
nft add rule inet nat postrouting oifname "eth0" masquerade
# 创建prerouting链(DNAT)
nft 'add chain inet nat prerouting { type nat hook prerouting priority -100; }'
# 端口转发:外部8080端口转发到内网192.168.1.10:80
nft add rule inet nat prerouting iifname "eth0" tcp dport 8080 dnat to 192.168.1.10:80
# 对应的forward规则
nft add rule inet filter forward iifname "eth0" oifname "eth1" ip daddr 192.168.1.10 tcp dport 80 accept
masquerade自动将源IP替换为出口接口IP,适用于动态IP环境。DNAT配合forward链规则完成完整的端口转发链路,缺一不可。
规则持久化与配置文件管理
nftables规则默认存储在内存中,重启后失效。持久化方案有两种:通过配置文件加载或通过systemd服务管理。
# 方式一:导出配置文件
nft list ruleset > /etc/nftables.conf
# 启用nftables服务(CentOS/Ubuntu通用)
systemctl enable nftables
systemctl start nftables
# 方式二:手动加载配置文件
nft -f /etc/nftables.conf
# 验证当前生效规则
nft list ruleset
/etc/nftables.conf采用nft原生语法,支持完整的表/链/规则定义。配置文件以flush ruleset开头,每次加载时清空已有规则再重新载入,保证状态一致性。生产环境中建议将配置文件纳入版本控制,规则变更通过PR审核后执行。
日志记录与流量统计
nftables支持对匹配数据包记录日志和计数,用于安全审计和流量分析。
# 记录被丢弃的流量到内核日志
nft add rule inet filter input limit rate 10/minute log prefix "NFT-DROP: " level warn drop
# 端口流量统计
nft add rule inet filter input tcp dport 443 counter accept
# 查看计数器
nft list chain inet filter input
log规则加入limit rate限制日志输出频率,防止日志洪水。counter关键字自动统计匹配数据包数和字节数,通过nft list chain查看统计结果。对于高流量服务器,计数器可定位异常流量来源,结合ELK或Grafana实现可视化监控。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-nftables-fang-huo-qiang-gui-ze-pei-zhi-yu/