raw表能绕过连接跟踪,因其在conntrack模块介入前的PREROUTING/OUTPUT链处理数据包,通过--notrack标记使匹配包跳过状态跟踪,避免conntrack表项开销,适用于高并发清洗场景。

直接用 iptables -t raw 绕过连接跟踪(conntrack),核心目的是减少内核对特定流量的状态维护开销,尤其适合高并发、低延迟场景下的流量清洗——比如 DDoS 初筛、端口扫描识别、或转发链路中已知可信的后端通信。
为什么 raw 表能绕过连接跟踪
Linux 内核在数据包进入网络栈时,最早触发的是 raw 表的 PREROUTING 链(对入向)和 OUTPUT 链(对出向)。它位于 conntrack 模块介入之前,因此可在连接状态被记录前就干预处理逻辑。关键动作是使用 --notrack 目标,让匹配的数据包跳过整个 conntrack 流程。
- 一旦打上
UNTRACKED标记,后续 filter/mangle/nat 表中基于-m conntrack --ctstate的规则将完全不匹配该包 - 避免 conntrack 表项创建、查找、超时回收等 CPU 和内存消耗
- 特别适合清洗固定协议+端口的异常流量(如伪造源 IP 的 SYN Flood、UDP 反射包)
典型流量清洗场景:快速屏蔽扫描类连接请求
例如,你想在入口处丢弃大量针对 SSH(22 端口)的无效新建连接请求,又不想让它们挤占 conntrack 表:
iptables -t raw -I PREROUTING -p tcp --dport 22 -m state --state NEW -m limit --limit 3/minute -j LOG --log-prefix "RAW-SSH-SCAN: " iptables -t raw -I PREROUTING -p tcp --dport 22 -m state --state NEW -j DROP
- 注意:这里用的是
-m state(依赖旧式 ip_conntrack),但 raw 表中它仍可工作;更推荐用-m conntrack --ctstate INVALID,NEW配合--notrack前置规则 - 实际部署时,先加
--notrack规则标记可信流(如内部服务间通信),再对其他流做清洗,避免误伤
配合 conntrack 表调优提升整体吞吐
即使部分流量绕过了 conntrack,全局 conntrack 表大小仍会影响系统稳定性。尤其在清洗后仍有大量合法 ESTABLISHED 连接时:
- 查看当前最大容量:
cat /proc/sys/net/nf_conntrack_max - 临时调大(例如设为 65536):
echo 65536 > /proc/sys/net/nf_conntrack_max - 永久生效:在
/etc/sysctl.conf中添加net.nf_conntrack_max = 65536并运行sysctl -p - 监控溢出情况:
grep conntrack /proc/slabinfo或检查dmesg | grep -i "nf_conntrack: table full"
必须避开的坑
raw 表虽快,但滥用会导致功能失效或策略混乱:
-
不能和 NAT 混用:DNAT/SNAT 必须依赖 conntrack,若对某流用了
--notrack,后续 nat 表规则将对其失效 -
filter 表中无法再用状态判断:比如
-m conntrack --ctstate ESTABLISHED对 UNTRACKED 包永远不匹配,需改用其他特征(如 TCP 标志位、IP 范围、速率限制) -
日志与调试变难:conntrack 工具(如
conntrack -L)看不到这些包,建议搭配-j LOG在 raw 链提前打标 - 不要对所有流量 --notrack:仅对明确无需状态跟踪的子集(如健康检查探针、UDP 日志上报、内部 RPC)启用











