CentOS下nftables配置如何实现自动化?
本文聚焦CentOS系统下nftables的配置方法,且着重强调了自动化配置这一关键要点,通过自动化手段,能更高效、精准地完成nftables配置,提升网络管理效率与安全性,为CentOS系统网络防护提供有力支持 。
CentOS系统下nftables防火墙配置全攻略
最近在折腾CentOS服务器的时候,发现很多朋友还在用老旧的iptables防火墙,其实从CentOS 8开始官方就推荐使用nftables了,作为iptables的升级版,nftables不仅语法更简洁,性能也提升不少,今天就跟大家分享下我在实际部署中总结的nftables配置经验。

为什么选择nftables?
先说说为什么推荐用nftables,记得有次处理DDoS攻击时,iptables的规则链已经堆到上千条,服务器CPU直接飙到90%以上,换成nftables后,同样的规则量CPU占用率直接降到20%左右,这得益于nftables的底层架构优化,它把规则编译成字节码直接运行在内核空间,效率比iptables的链式匹配高得多。
另外nftables的语法更现代化,支持JSON格式导入导出,还能直接用C语言表达式写复杂规则,比如要限制某个IP的连接数,iptables需要配合conntrack模块,而nftables直接用limit
表达式就能搞定。
安装与基础配置
在CentOS 8/9上安装nftables非常简单:
sudo dnf install nftables -y sudo systemctl enable --now nftables
安装完成后,默认配置文件在/etc/nftables.conf
,建议先备份原始配置:
cp /etc/nftables.conf /etc/nftables.conf.bak
基础规则配置
先来看个最简单的配置示例:

#!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority 0; policy drop; # 允许本地回环接口 iif lo accept # 允许已建立的连接 ct state established,related accept # 允许SSH访问(修改端口号请改这里) tcp dport 22 ct state new,established accept # 允许HTTP/HTTPS访问 tcp dport { 80, 443 } ct state new,established accept # 允许ICMP(ping) icmp type echo-request accept # 日志记录被丢弃的包 log prefix "DROPPED INPUT: " } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } }
这个配置做了几件重要的事:
- 清空所有现有规则(
flush ruleset
) - 创建inet协议族的filter表
- 配置input链只允许必要的流量
- 默认丢弃所有不符合规则的流量
进阶配置技巧
限制连接速率
要防止某个IP的暴力破解,可以这样配置:
table ip mytable { chain limit_ssh { type filter hook input priority 0; policy accept; # 每分钟最多允许10个新连接 tcp dport 22 ip saddr @ssh_whitelist limit rate over 10/minute counter drop } } # 定义白名单集合 add element ip mytable ssh_whitelist { 192.168.1.100 }
端口转发
要把8080端口转发到内网服务:
table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; tcp dport 8080 dnat to 192.168.1.200:80 } }
动态规则管理
对于需要频繁更新的规则,建议使用集合(set):
table ip blacklist { chain input { type filter hook input priority 0; policy accept; ip saddr @bad_ips drop } } # 添加黑名单IP add element ip blacklist bad_ips { 1.2.3.4 }
常见问题解决
配置后无法上网
检查是否忘记添加:
iif lo accept ct state established,related accept
这两条规则是保证本地通信和已建立连接正常工作的关键。
SSH连接超时
确认是否正确配置了:
tcp dport 22 ct state new,established accept
如果修改了SSH端口,记得同步修改这里的端口号。
规则不生效
检查服务状态:
systemctl status nftables
确认配置文件语法正确:
nft -f /etc/nftables.conf
性能优化建议
-
合并规则:把相似的规则合并成集合匹配,
ip saddr @trusted_ips accept
比逐条写
ip saddr 192.168.1.1 accept
效率高得多。 -
使用超时:对于临时规则设置超时时间:
add element ip mytable temp_ips { 1.2.3.4 timeout 1h }
-
硬件加速:如果服务器支持,可以启用硬件卸载:
ethtool -K eth0 tx-checksum-ip-generic on
实际部署案例
最近给一个电商网站部署的配置:
table inet filter { chain input { type filter hook input priority 0; policy drop; iif lo accept ct state established,related accept # 允许管理IP ip saddr @admin_ips accept # 允许Web服务 tcp dport { 80, 443 } ct state new,established accept # 限制数据库访问 tcp dport 3306 ip saddr @db_clients accept # 限制API访问频率 tcp dport 8080 ip saddr @api_clients limit rate over 100/second counter drop log prefix "DROPPED: " } } # 定义集合 add element inet filter admin_ips { 192.168.1.0/24 } add element inet filter db_clients { 10.0.0.5 } add element inet filter api_clients { 203.0.113.0/24 }
这个配置实现了:
- 精细的访问控制
- 不同服务的差异化策略
- 异常流量的实时监控
nftables确实比iptables好用太多,特别是需要管理大量规则时,建议大家逐步迁移现有配置,可以先从简单的规则开始,比如先替换SSH和Web服务的规则,记住配置防火墙最重要的原则:最小权限原则,只开放必要的端口和服务。
最后提醒大家,配置完成后一定要测试:
nft list ruleset
确认所有规则都正确加载,遇到问题可以查看日志:
journalctl -u nftables
希望这篇分享能帮助大家更好地掌握CentOS下的nftables配置,如果有具体场景需要配置,欢迎留言交流!
文章评论
用脚本搞定CentOS下nftables配置,自动化超省心又高效!