iptables -t raw -j notrack 可让特定流量跳过连接跟踪,降低内核开销,适用于web、cdn等高并发场景;因linux默认对每个连接做五元组状态跟踪,超限易触发“table full”导致丢包;raw表prerouting和output链在conntrack前介入,匹配后跳过状态跟踪但filter规则仍生效。

直接用 iptables -t raw 配合 -j NOTRACK,就能让特定流量跳过连接跟踪(conntrack),大幅降低内核开销,特别适合 Web、CDN、API 网关等高并发场景。
为什么需要绕过连接跟踪?
Linux 默认对每个 TCP/UDP 连接做五元组(协议+源/目的IP+端口)状态跟踪,记录在 nf_conntrack 表中。当并发连接超 65536 或长连接堆积(如 MySQL),容易触发 ip_conntrack: table full,导致新连接被丢弃、延迟飙升甚至服务不可用。而像 Nginx 的短连接(keepalive_timeout 默认 65s)影响小,但高 QPS 的静态资源请求仍会快速填满 conntrack 表。
raw 表的两个关键链和时机
raw 表优先级最高,在数据包进入 conntrack 和 nat 处理之前就介入:
- PREROUTING 链:处理所有入站包(无论目标是否本机),适合对外服务入口(如 80/443 端口)禁用跟踪
- OUTPUT 链:处理本机主动发出的包,适合本地反向代理或健康检查流量优化
一旦匹配 -j NOTRACK,该包后续完全不进 conntrack 模块,也不走 nat 表的 DNAT/SNAT,但 filter 表的 INPUT/OUTPUT 规则依然生效。
典型高性能清洗配置示例
以 Web 服务器为例,只对 HTTP/HTTPS 流量关闭连接跟踪,保留其他协议(如 SSH、ICMP)正常跟踪便于运维:
# 先清空 raw 表(谨慎操作,建议先保存旧规则) iptables -t raw -F <h1>对所有进入的 80 和 443 端口 TCP 包跳过连接跟踪</h1><p>iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK iptables -t raw -A PREROUTING -p tcp --dport 443 -j NOTRACK</p><h1>可选:对已知 CDN 回源 IP 的 UDP 流量也跳过(如 DNS 查询、QUIC)</h1><p>iptables -t raw -A PREROUTING -p udp --dport 53 -s 203.208.136.0/21 -j NOTRACK iptables -t raw -A PREROUTING -p udp --dport 443 -s 192.0.2.0/24 -j NOTRACK</p>
注意:NOTRACK 不影响你后续在 filter 表中用 -A INPUT -p tcp --dport 80 -j ACCEPT 放行,只是省去了状态维护成本。
必须同步做的几件事
- 确认
nf_conntrack_max值合理(sysctl net.netfilter.nf_conntrack_max),但绕过比调大更治本 - 禁用后,
conntrack -L将不再显示对应连接,排查问题时需切换思路(如改用tcpdump或应用层日志) - 若用了 SNAT/DNAT(如负载均衡器),不要对需 NAT 的流量设 NOTRACK,否则地址转换失效
- 务必搭配 filter 表规则做基础过滤,因为 NOTRACK 后包仍会走到 INPUT/OUTPUT 链
绕过连接跟踪不是“关防火墙”,而是把状态管理交给上层应用或专用清洗设备,让内核专注转发——这才是超高性能流量清洗的底层逻辑。











