温馨提示×

centos iptables为何速度变慢

小樊
38
2026-10-11 14:00:07
栏目: 智能运维

在 CentOS 上,iptables 变慢通常不是 iptables 本身“计算慢”,而是规则数量、结构、模块或系统状态导致的。下面按常见原因 → 排查方法 → 解决建议来说明。


一、最常见原因

1. iptables 规则过多(尤其是 FORWARD / INPUT)

  • 每一条数据包都要逐条匹配规则
  • 规则从几百到几千条时,延迟明显

表现

  • ping 延迟变大
  • 新连接建立慢
  • CPU 占用升高

排查

iptables-save | wc -l
iptables -L -n -v

解决

  • 合并规则(同目的 IP 用 ipset)
  • 将常用规则放前面
  • 减少 -j LOG
  • 避免大量 -m string、-m recent

2. 使用了 ipset 但配置不合理

ipset 本身很快,但:

  • hashsize 太小
  • 元素过多
  • 使用 nomatch 不当
ipset list

✅ 建议:

ipset create blacklist hash:ip hashsize 65536

3. 使用了耗性能的内核模块

以下模块会显著拖慢速度:

模块 影响
-m string 深度包检测,非常慢
-m recent 高并发下锁竞争
-m connlimit 连接多时慢
-m limit 轻微影响
-j LOG 写日志极慢

建议

  • 避免在大流量链中使用 string
  • LOG 只用于调试,不要常开

4. conntrack(连接跟踪)表满

这是 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

5. 规则顺序不合理

iptables 是顺序匹配

❌ 错误示例:

-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -s 0.0.0.0/0 -j DROP

✅ 正确:

  • 高频流量放最前
  • 默认策略放最后

6. 使用了 firewalld + iptables 混用

CentOS 7+ 默认 firewalld:

  • firewalld 会动态生成大量 iptables 规则
  • 容易重复、冲突

检查

systemctl status firewalld

建议

  • 服务器环境:关闭 firewalld,直接用 iptables
systemctl stop firewalld
systemctl disable firewalld

7. 网卡 / 内核问题(非 iptables 本身)

  • 网卡多队列未开
  • irq 不均衡
  • 老内核 bug

检查

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?

如果你是:

  • CentOS 8+
  • 规则 > 1000 条
  • 高并发场景

✅ 强烈建议 nftables

nft list ruleset

如果你愿意,可以贴出:

  • CentOS 版本
  • iptables -L -n -v 输出
  • 是否高并发 / 是否有 NAT

我可以帮你精确定位是哪一类导致变慢。

0 踩