NOTRACK通过跳过netfilter连接跟踪降低CPU/内存开销,仅适用于无状态UDP流量、LVS直连模式或可信内网通信,需在raw表PREROUTING/OUTPUT链配置,并配合filter表显式放行,禁用于TCP。

核心前提:确认内核支持且conntrack已启用
NOTRACK只在raw表中生效,且要求内核编译时启用了CONFIG_NF_CONNTRACK。运行以下命令验证:
-
lsmod | grep nf_conntrack—— 应有输出,说明模块已加载 -
cat /proc/sys/net/netfilter/nf_conntrack_max—— 非零值表示可用
确定哪些流量适合NOTRACK
并非所有流量都适用。绕过连接跟踪意味着无法使用-m conntrack或-m state等状态匹配模块,因此仅适用于:
- 单向、无状态协议(如DNS查询响应、NTP应答、某些UDP流媒体)
- 已由上层应用/负载均衡器完成会话管理的流量(如LVS Direct Routing模式下的Real Server)
- 明确无需连接状态检查的可信内网通信(如监控探针心跳包)
配置NOTRACK规则的正确步骤
注意:raw表只在PREROUTING和OUTPUT链中存在,且规则必须放在其他表(如filter、nat)之前生效。
- 清空raw表现有规则(如需重置):
iptables -t raw -F - 添加NOTRACK规则,例如跳过某UDP服务的连接跟踪:
iptables -t raw -A PREROUTING -p udp --dport 53 -j NOTRACK - 若该流量还需放行,必须在filter表INPUT链中显式允许(因NOTRACK后不再有ESTABLISHED状态):
iptables -A INPUT -p udp --dport 53 -j ACCEPT - 查看效果:
iptables -t raw -L -n -v
关键注意事项
误用NOTRACK可能导致防火墙策略失效或连接异常:
- 不要对TCP流量随意使用NOTRACK——TCP依赖连接状态做序列号校验、窗口控制等,跳过conntrack易引发丢包或重传
- NOTRACK规则不会自动影响FORWARD或OUTPUT链中的对应连接;如需双向跳过,需分别在PREROUTING和OUTPUT链设置
- 启用NOTRACK后,
/proc/net/nf_conntrack中将不再出现匹配的数据包记录,调试时需切换思路 - 某些云平台(如AWS ENA、GCP eBPF加速)可能与NOTRACK存在兼容性问题,上线前务必压测验证











