很多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语法,用工具辅助转换,你的防火墙配置会变得更高效可靠。
