CentOS下nftables配置如何实现自动化?

代码编程 2025-06-19 1150
本文聚焦CentOS系统下nftables的配置方法,且着重强调了自动化配置这一关键要点,通过自动化手段,能更高效、精准地完成nftables配置,提升网络管理效率与安全性,为CentOS系统网络防护提供有力支持 。

CentOS系统下nftables防火墙配置全攻略

最近在折腾CentOS服务器的时候,发现很多朋友还在用老旧的iptables防火墙,其实从CentOS 8开始官方就推荐使用nftables了,作为iptables的升级版,nftables不仅语法更简洁,性能也提升不少,今天就跟大家分享下我在实际部署中总结的nftables配置经验。

CentOS 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

基础规则配置

先来看个最简单的配置示例:

CentOS nftables配置方法-自动化-自动化
#!/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;
    }
}

这个配置做了几件重要的事:

  1. 清空所有现有规则(flush ruleset
  2. 创建inet协议族的filter表
  3. 配置input链只允许必要的流量
  4. 默认丢弃所有不符合规则的流量

进阶配置技巧

限制连接速率

要防止某个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

性能优化建议

  1. 合并规则:把相似的规则合并成集合匹配,

    ip saddr @trusted_ips accept

    比逐条写ip saddr 192.168.1.1 accept效率高得多。

  2. 使用超时:对于临时规则设置超时时间:

    add element ip mytable temp_ips { 1.2.3.4 timeout 1h }
  3. 硬件加速:如果服务器支持,可以启用硬件卸载:

    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 firewalld使用中如何解决兼容问题?
« 上一篇 2025-06-19

文章评论

用脚本搞定CentOS下nftables配置,自动化超省心又高效!