在 CentOS 上,iptables 变慢通常不是 iptables 本身“计算慢”,而是规则数量、结构、模块或系统状态导致的。下面按常见原因 → 排查方法 → 解决建议来说明。
表现
排查
iptables-save | wc -l
iptables -L -n -v
解决
-j LOG-m string、-m recentipset 本身很快,但:
nomatch 不当ipset list
✅ 建议:
ipset create blacklist hash:ip hashsize 65536
以下模块会显著拖慢速度:
| 模块 | 影响 |
|---|---|
-m string |
深度包检测,非常慢 |
-m recent |
高并发下锁竞争 |
-m connlimit |
连接多时慢 |
-m limit |
轻微影响 |
-j LOG |
写日志极慢 |
建议
string这是 CentOS 最隐蔽的慢点
现象
dmesg 中有:nf_conntrack: table full, dropping packet
查看
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
解决
sysctl -w net.netfilter.nf_conntrack_max=655360
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600
iptables 是顺序匹配
❌ 错误示例:
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -s 0.0.0.0/0 -j DROP
✅ 正确:
CentOS 7+ 默认 firewalld:
检查
systemctl status firewalld
建议
systemctl stop firewalld
systemctl disable firewalld
检查
ethtool -l eth0
mpstat 1
# 1. 规则数量
iptables-save | wc -l
# 2. 连接跟踪
dmesg | grep conntrack
# 3. CPU
top
mpstat 1
# 4. 是否有 LOG
iptables -L -n | grep LOG
# 5. firewalld
systemctl status firewalld
如果你是:
✅ 强烈建议 nftables
nft list ruleset
如果你愿意,可以贴出:
iptables -L -n -v 输出我可以帮你精确定位是哪一类导致变慢。