很多CentOS运维人员还在用iptables,但CentOS 8开始默认就用nftables了,连CentOS 7后期版本也支持。iptables其实已经过时,它的规则复杂难管理,性能也不如nftables。直接点说,你得尽快把iptables换成nftables,因为它是Linux防火墙的未来,统一了包过滤框架,配置更简单、性能更高,还能直接兼容部分旧规则。

为什么必须从iptables迁移到nftables?

iptables用了很多年,但它的架构老旧:每个功能(如filter、nat)都是独立模块,规则一多就难管理,而且性能有瓶颈。nftables是全新的,它用一个叫nft的命令行工具统一管理,语法更简洁,比如能用单个规则处理多个协议。性能上,nftables用基于寄存器的虚拟机执行规则,比iptables的线性匹配快,尤其在大流量场景下。另外,Red Hat从CentOS 8/RHEL 8开始默认启用nftables,再坚持用iptables反而会增加维护成本。

迁移前准备:检查系统环境和备份旧规则

首先确认你的CentOS版本:运行

cat /etc/redhat-release

,如果是CentOS 7,需确保内核版本≥3.13,并安装nftables;CentOS 8则默认已安装。然后备份现有iptables规则:

iptables-save > /root/iptables-backup.txt

ip6tables-save > /root/ip6tables-backup.txt

。接着停止iptables服务:

systemctl stop iptables

systemctl disable iptables

(CentOS 7用

service iptables stop

)。安装nftables:

yum install -y nftables

(CentOS 8用dnf)。完成后启动nftables并设置开机自启:

systemctl start nftables && systemctl enable nftables

nftables基础配置:语法和核心概念

nftables的配置集中在

/etc/nftables.conf

,它用“表-链-规则”的层级。表(table)是顶级容器,链(chain)是规则集合,规则(rule)包含具体匹配和动作。语法比iptables直观,例如定义一个表:

nft add table inet my_table

,这里inet同时处理IPv4/IPv6。创建链:

nft add chain inet my_table input_chain { type filter hook input priority 0 \; }

,其中type定义链类型,hook指定网络钩子点,priority是优先级。添加规则:

nft add rule inet my_table input_chain tcp dport 22 accept

,表示允许SSH连接。查看配置:

nft list ruleset

将iptables规则转换为nftables的实用方法

手动转换太耗时,推荐用工具。先安装iptables-translate:

yum install iptables-translate -y

(CentOS 8在iptables-nft包中)。转换旧规则:

iptables-translate -A INPUT -p tcp --dport 80 -j ACCEPT

会输出

nft add rule ip filter INPUT tcp dport 80 counter accept

。批量转换:

iptables-save | iptables-translate

,但注意复杂规则(如扩展模块)可能需要手动调整。另一种方法是直接用nftables的兼容接口:加载iptables规则到nftables,运行

nft add table ip filter

后,用

nft -i

交互模式导入,但建议先在新环境测试。

常用运维场景的nftables配置示例

1. 基础防火墙:允许SSH、HTTP/HTTPS,拒绝其他输入。编辑

/etc/nftables.conf

,添加:

table inet filter {
    chain input {
        type filter hook input priority 0;
        ct state established,related accept
        tcp dport {22, 80, 443} accept
        icmp type echo-request accept
        counter drop
    }
    chain forward { type filter hook forward priority 0; drop }
    chain output { type filter hook output priority 0; accept }
}

然后加载:

nft -f /etc/nftables.conf

2. NAT配置:做局域网共享上网。添加表:

nft add table nat

,创建链:

nft add chain nat postrouting { type nat hook postrouting priority 100 \; }

,设置MASQUERADE:

nft add rule nat postrouting ip saddr 192.168.1.0/24 oif eth0 masquerade

3. 限速和防攻击:限制SSH连接频率。创建链:

nft add chain inet filter ssh_limit

,添加规则:

nft add rule inet filter input tcp dport 22 ct state new limit rate 3/minute accept

,超出的丢弃:

nft add rule inet filter input tcp dport 22 drop

迁移后的验证和故障排除

加载配置后,先用

nft list ruleset

检查规则是否生效。测试网络连通性:

ping -c 4 example.com

curl -I http://localhost

。监控日志:nftables日志通过

meta nflog

log

关键字记录,例如

nft add rule inet filter input tcp dport 22 log prefix "SSH attempt: " accept

,然后用

journalctl -xe

查看。常见问题:如果规则不生效,检查链的hook和priority是否正确;服务冲突时,确保iptables完全禁用:

systemctl mask iptables

。性能优化可调整链类型,如用

type filter hook input priority -10

提高优先级。

长期维护建议和最佳实践

定期备份nftables规则:

nft list ruleset > /etc/nftables-backup.nft

,恢复时用

nft -f /etc/nftables-backup.nft

。版本控制:将配置存到Git,便于团队协作。脚本化部署:用Ansible或Shell脚本批量更新规则,例如用

nft -f /path/to/config.nft

。安全方面,遵循最小权限原则,只开放必要端口;结合fail2ban增强防护。最后,关注社区更新,nftables仍在活跃开发,新功能如集合(set)和映射(map)能简化动态规则管理。

总之,从iptables切换到nftables不是可选项,而是CentOS运维的必然步骤。它提升性能、简化管理,早点迁移就能避免未来兼容性问题。花点时间熟悉nft语法,用工具辅助转换,你的防火墙配置会变得更高效可靠。