linux防火墙性能下降的核心是规则总量多、匹配路径长、conntrack压力大、数据结构低效;优化需前置established/related等高频规则、合并端口、用ipset/nft set替代线性匹配、绕过非必要conntrack、迁至nftables并调优参数。

Linux 防火墙在大流量场景下性能下降,核心问题不是单条规则慢,而是规则总量多、匹配路径长、连接跟踪(conntrack)压力大、数据结构低效。优化目标很明确:让每个数据包走得更短、查得更快、状态开销更低。
高频流量规则必须前置
iptables 和 nftables 都按顺序逐条匹配,命中即停。80% 以上的入向流量其实是已建立连接(ESTABLISHED/RELATED)或 HTTP/HTTPS/SSH 等服务请求——这些规则必须放在 INPUT 链最顶端。
- 第一行加状态放行:
nft add rule ip filter input ct state established,related accept或iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - 把常用端口合并写:用
nft add rule ip filter input tcp dport {22,80,443} accept替代三条独立规则;iptables 可用-m multiport --dports 22,80,443 - 避免无接口限定的宽泛规则(比如不带
-i eth0),防止全网卡扫描拖慢匹配
用集合替代海量线性规则
当 IP 或端口数量超过几百条,线性匹配就成瓶颈。ipset(iptables)或 nftables 原生 set(nft)能将查找从 O(n) 降到接近 O(1)。
- 封单个 IPv4 地址,建
hash:ip集合:ipset create blackv4 hash:ip maxelem 1200000 hashsize 16384 - 封网段必须用
hash:net:ipset create blacknet hash:net maxelem 50000 - 批量导入别用循环,用
restore:生成blacklist.ipset文件后执行ipset restore -f blacklist.ipset - iptables 引用时必须用
-m set --match-set blackv4 src -j DROP,且规则要插在链首(iptables -I INPUT)
绕过不必要的连接跟踪
conntrack 是状态防火墙最大性能热点,尤其对 DNS、健康检查、UDP 流量或跨网段转发。能绕则绕,能关则关。
- 对纯转发或监控流量,加
-m conntrack ! --ctstate INVALID,UNTRACKED -j ACCEPT后直接跳过 conntrack - 对明确无需状态的协议(如部分 UDP 服务),用
nft add rule ip filter input ip protocol udp ct state invalid,untracked accept - 调小 conntrack 表大小和超时值:
sysctl -w net.netfilter.nf_conntrack_max=131072,sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=1800
优先迁移到 nftables 并启用原子更新
nftables 在万级规则下优势明显:统一内核子系统、原生支持集合与映射、规则变更原子提交、语法更紧凑。
- 用
nft list ruleset -a查看规则句柄,便于精准删改 - 黑名单动态更新时,用
nft add set ip filter blackips { type ipv4_addr\; }+nft add element ip filter blackips { 1.1.1.1, 2.2.2.2 },支持 timeout 自动清理 - 已有 iptables 用户可先用
iptables-nft兼容层过渡,底层已走 nf_tables,性能提升立竿见影











