需绕过conntrack以避免“table full”丢包及性能下降,raw表通过PREROUTING/OUTPUT链的NOTRACK规则使指定流量(如8080端口TCP、53端口UDP)跳过连接跟踪,但须配合filter表显式放行,并调优nf_conntrack_max等内核参数。

要在 Linux 中用 iptables -t raw 表绕过连接跟踪(conntrack),核心是让特定流量不进入 Netfilter 的连接状态跟踪系统,从而降低内核开销、提升吞吐能力。这在 CDN 节点、高并发反向代理或 UDP 流媒体网关等场景特别有效。
为什么需要绕过 conntrack?
默认情况下,所有经过 Netfilter 的 IP 数据包(除被显式排除外)都会被 nf_conntrack 模块记录连接状态,占用内存和 CPU。当每秒新建连接超万级时,容易触发:
-
nf_conntrack: table full, dropping packet报错 - 连接建立延迟升高、SYN 包丢弃
- 大量 TIME_WAIT 连接挤占哈希表空间
raw 表的两个关键链与典型用法
raw 表仅含 PREROUTING(入站路由前)和 OUTPUT(本机发出)两条链,且优先级最高——它在任何其他表(mangle/nat/filter)之前执行。常用操作是打 NOTRACK 标记:
-
iptables -t raw -A PREROUTING -p tcp --dport 8080 -j NOTRACK
→ 让所有发往本机 8080 端口的 TCP 包跳过连接跟踪 -
iptables -t raw -A OUTPUT -p udp --dport 53 -j NOTRACK
→ 让本机发出的 DNS 查询 UDP 包不被跟踪
注意:NOTRACK 不等于“放行”,它只关闭状态跟踪;后续仍需在 filter 表中明确 -j ACCEPT 或 -j DROP,否则默认策略会起作用。
配合 conntrack 状态管理更安全
绕过跟踪后,无法再用 -m conntrack --ctstate ESTABLISHED 做状态放行。此时建议:
- 对已知稳定协议(如 UDP DNS、ICMP、固定端口的健康检查)单独放行
- 用
-m state --state NEW,ESTABLISHED(旧模块,兼容性好)或-m conntrack --ctstate INVALID配合 raw 使用,过滤明显异常包 - 监控
/proc/sys/net/nf_conntrack_count,确认 bypass 后数值显著下降
必须同步调整的内核参数
启用 raw 规则后,还需调优 conntrack 相关参数防止残留影响:
-
echo 65536 > /proc/sys/net/nf_conntrack_max(按实际并发调整) -
echo 1 > /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal(缓解 TCP 状态误判) - 持久化写入
/etc/sysctl.conf,避免重启失效
不复杂但容易忽略



















