在 CentOS(尤其是 CentOS 6/7,使用 iptables 而非 nftables)中优化 iptables 性能,核心目标是:减少规则匹配次数、降低 CPU 开销、避免锁竞争、利用内核特性。下面从 架构、规则、内核参数、工具替代 四个层面系统说明。
iptables + ipset(强烈推荐)问题:大量 IP 规则(如封禁 IP、白名单)会导致 iptables 线性匹配,性能急剧下降。
优化方案:
用 ipset 存储 IP 集合,iptables 只做一次匹配。
# 创建 ipset
ipset create blacklist hash:ip
# 添加 IP
ipset add blacklist 1.2.3.4
# iptables 使用
iptables -A INPUT -m set --match-set blacklist src -j DROP
✅ 优点:
原则:
✅ 推荐结构:
raw → mangle → nat → filter
iptables 是 从上到下匹配,一旦命中就执行。
✅ 优化原则:
-j LOGmultiport 替代多个 dport❌ 差:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
✅ 好:
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
避免滥用:
-m state-m conntrack-m string-m limit尤其是:
-m string --string "xxx" --algo bm
❌ 性能杀手(逐包扫描)
conntrack 是性能瓶颈之一。
iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
sysctl -w net.netfilter.nf_conntrack_max=262144
sysctl -w net.core.somaxconn=65535
查看当前:
cat /proc/sys/net/netfilter/nf_conntrack_count
编辑 /etc/sysctl.conf:
net.ipv4.ip_forward = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 65535
net.netfilter.nf_conntrack_max = 524288
生效:
sysctl -p
如果不用 NAT:
iptables -t nat -F
如果不用复杂路由:
iptables -t mangle -F
iptables-legacy vs iptables-nftCentOS 8+ 默认使用 nftables 后端。
查看:
iptables -V
如果你在 CentOS 7:
iptablesfirewalld| 场景 | 建议 |
|---|---|
| DDoS 防护 | ipset + 限速 |
| 高并发 Web | NOTRACK + 少规则 |
| 网关 / NAT | 升级内存 + conntrack 调优 |
| 百万 QPS | 考虑 nftables / XDP / DPDK |
iptables -nvL
cat /proc/sys/net/netfilter/nf_conntrack_count
mpstat -P ALL 1
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -m set --match-set blacklist src -j DROP
COMMIT
✅ 最有效的优化手段:
如果你愿意,可以告诉我:
我可以帮你 针对性优化规则表。