Linux Netfilter 的 NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED、NOTRACK 和 TCP 状态有什么区别?
配置 iptables 或 nftables 时,很多人把 Conntrack 状态直接等同于 TCP 状态机,于是看到 ESTABLISHED 就认为 TCP 一定完成握手,看到 NEW 就只放行 SYN。实际上,NEW、ESTABLISHED、RELATED、INVALID 和 UNTRACKED 是 Netfilter 对数据包与连接跟踪条目关系的分类;NOTRACK 是禁用跟踪的动作;TCP 的 SYN-SENT、ESTABLISHED、FIN-WAIT 等则是协议专属内部状态。 三者层级不同,混用会造成误放行、误丢包或 NAT 失效。
本文目录(41 节)
核心区别速查
| 概念 | 类型 | 主要含义 |
|---|---|---|
| NEW | Conntrack State | 尚未看到双向数据的跟踪连接 |
| ESTABLISHED | Conntrack State | 已看到两个方向的数据包 |
| RELATED | Conntrack State | 新连接与已有连接有关联 |
| INVALID | Conntrack State | 无法关联到已知有效连接 |
| UNTRACKED | Conntrack State | 数据包被明确排除在跟踪外 |
| NOTRACK | 规则动作 | 要求该数据包不进入 Conntrack |
| TCP State | 协议内部状态 | TCP 握手、传输和关闭阶段 |
防火墙规则匹配的是当前数据包的 Conntrack 元信息,不是应用会话,也不是远端主机的真实意图。
Conntrack 是什么
Conntrack 是 Linux Netfilter 的有状态数据包跟踪子系统。它根据网络层与传输层元组、方向、协议状态和超时,把多个数据包关联为一个逻辑 Flow。
状态防火墙、NAT、连接标记和部分 Helper 都依赖它。Conntrack 本身主要维护状态和关系,不等于最终 ACCEPT 或 DROP 策略。
Tuple 与方向
典型条目保存 Original 与 Reply 两个方向的元组,如源地址、目的地址、源端口、目的端口和协议。NAT 后的元组也会与同一条目关联。
因此“回包”不是简单检查源和目的互换,而是由跟踪表和 NAT 映射共同识别。
NEW 是什么
NEW 表示数据包开始一个新连接,或属于一个尚未看到双向数据包的连接。它不严格等于“TCP SYN 包”。
例如同一方向连续重传的 TCP SYN 仍可能匹配 NEW;UDP 第一个请求也会是 NEW;在宽松 TCP 跟踪模式下,某些非 SYN 包也可能建立跟踪条目。
NEW 为什么不等于只有 SYN
Conntrack 状态表达跟踪关系,而 --syn 或 TCP Flags 表达报文位。若入口策略只允许新建 TCP 握手,应同时匹配协议、目标端口、Conntrack NEW 和符合预期的 SYN 标志。
只写 ct state new accept 可能放行并非初始 SYN 的数据包,具体行为还受内核的 TCP Loose Tracking 设置影响。
ESTABLISHED 是什么
ESTABLISHED 表示该连接已经在两个方向看到数据包。它常用于允许合法返回流量和连接后续报文。
这个名字容易误导:它是 Conntrack 的双向可见状态,不保证应用登录成功,也不必与 TCP 状态机中的 ESTABLISHED 完全同步。
UDP 为什么也有 ESTABLISHED
UDP 本身无握手,但 Conntrack 可把请求与反向响应关联。第一个请求通常是 NEW,观察到反向响应后,同一 Flow 的后续数据可匹配 ESTABLISHED。
这是一种有状态分类,不会把 UDP 变成面向连接协议。条目仍依靠超时清理。
ICMP 如何被跟踪
Echo Request 与 Echo Reply 等成对消息可以作为一条跟踪关系处理。与已有 TCP/UDP Flow 对应的 ICMP 错误,则常被识别为 RELATED。
防火墙若一律丢弃 ICMP,会破坏错误反馈、路径 MTU 探测和诊断。规则应按 ICMP 类型和关联状态设计。
RELATED 是什么
RELATED 表示当前数据包开始一个新连接,但它与已有连接存在已识别关联。典型例子是某条连接触发的 ICMP 错误,或 Helper 建立的期望连接。
它不是“相同客户端的任何新连接”,也不是应用随意声明的业务相关性。
Expectation 是什么
某些 Conntrack Helper 会根据控制连接内容创建 Expectation,允许预期的数据连接被分类为 RELATED。传统 FTP 控制与数据通道是常见示例。
Helper 会解析应用协议,扩大受信任行为面。现代系统应只在确有需要时显式启用,并限制协议、端口和方向。
RELATED 与 ESTABLISHED 的区别
ESTABLISHED 属于已经跟踪且看到双向流量的同一连接;RELATED 是另一条新连接或错误消息与既有连接之间的关系。
规则常把 ESTABLISHED,RELATED 合并放行,但它们的安全含义并不相同,是否允许 RELATED 应结合 Helper 和业务需求评估。
INVALID 是什么
INVALID 表示数据包无法与已知连接关联,或不符合 Conntrack 对协议状态的预期。可能原因包括异常 Flags、过期条目、乱序、严重延迟、资源不足或非对称路径。
它不是“确定为恶意”。INVALID 是跟踪子系统无法建立可信关系的结果,需要结合计数器、抓包和内核日志诊断。
INVALID 为什么通常 DROP
对于无法可信关联的入口数据包,常见基线是记录受限日志后 DROP。iptables 扩展手册特别提醒,不要不加区分地对 INVALID 发送 REJECT。
迟到的合法报文可能被分类为 INVALID;若防火墙主动发 RST 或 ICMP Reject,反而可能终止一条仍健康的连接。
INVALID 突增的原因
常见原因有回程经过另一台未同步状态的防火墙、Conntrack 表满、超时过短、NAT 映射丢失、抓包位置不同、分片异常或 TCP 序列窗口检查失败。
先看 nf_ 与最大值、内核 Drop 统计、路由对称性和具体协议,再决定是否调松参数。
UNTRACKED 是什么
UNTRACKED 是赋给明确绕过 Conntrack 的数据包的虚拟状态。它不表示跟踪失败,而表示规则有意不建立跟踪条目。
它与 INVALID 必须区分:前者通常是管理员策略,后者是跟踪分析无法正常关联。
NOTRACK 是什么
NOTRACK 是 iptables 扩展,用于禁用匹配数据包的连接跟踪,等价于 raw 表中的 CT --notrack。nftables 提供 notrack Statement。
NOTRACK 必须在 Conntrack Hook 建立状态之前生效,所以规则位置与优先级至关重要;在普通 Filter 阶段再写已经太晚。
为什么使用 NOTRACK
高流量、完全无状态且不需要 NAT 的流量,有时可绕过 Conntrack 以减少表项和处理开销。SYNPROXY 等特殊设计也会明确使用未跟踪状态。
这属于架构优化,不是常规“表满了就绕过”的万能修复。必须确认所有依赖 Conntrack 的功能都不再需要。
NOTRACK 的代价
未跟踪流量不能依赖 ESTABLISHED/
请求与响应都要有对称且明确的无状态规则。只对一个方向设置 NOTRACK,容易产生难以理解的不一致。
Conntrack State 与 TCP State 的区别
Conntrack 通用状态用于防火墙匹配;TCP 专属状态描述握手和关闭阶段,如 SYN-SENT、SYN-RECV、ESTABLISHED、FIN-WAIT、CLOSE-WAIT、LAST-ACK 和 TIME-WAIT。
一个 Packet 的通用 ct state 可以是 ESTABLISHED,同时条目内部 TCP 状态已进入 FIN-WAIT。两个字段回答的问题不同。
与 Socket 状态的区别
ss 展示本机 Socket 及 TCP Stack 状态;conntrack -L 展示经过本机 Netfilter 跟踪的 Flow。转发路由器可以有 Conntrack 条目,却没有本地应用 Socket。
反过来,被 NOTRACK 的本地流量可有 Socket,但没有对应 Conntrack Entry。
state 与 conntrack 匹配模块
iptables 的旧 state 扩展是 conntrack 匹配功能的子集。新规则通常使用 -m conntrack --ctstate ...,它还能访问方向、地址、协议和状态位等信息。
迁移到 nftables 时,应使用 ct state 等原生表达式,不要机械翻译命令而忽略 Hook、Priority 和 Rule Order。
ctstate 与 ctstatus
--ctstate 包含 NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED 以及 SNAT/DNAT 等虚拟状态;--ctstatus 则匹配 EXPECTED、SEEN_REPLY、ASSURED、CONFIRMED 等条目标志。
State 与 Status 不是同义词。SEEN_REPLY 类似“已经看到回包”的标志,但规则意图仍应使用文档规定的字段。
SEEN_REPLY 是什么
SEEN_REPLY 表示 Conntrack 已看到 Reply Direction 的数据包。它是条目 Status Flag,不是单独的防火墙五态之一。
诊断单向流量时它很有价值:长时间没有该标志,通常说明回包未经过此机、被更早规则丢弃或根本未返回。
ASSURED 是什么
ASSURED 表示条目不应被提前回收,具体取得条件与协议跟踪实现有关。它不是“连接绝对可靠”或“已经通过认证”。
当 Conntrack 表承压时,未 Assured 条目更可能被 Early Drop;监控时可用它理解回收行为。
CONFIRMED 是什么
CONFIRMED 表示发起方向的数据包已经离开本机,条目完成确认。它同样属于 Status Flag,而非放行策略。
不要把它当作远端收到数据或应用成功响应的证明。
SNAT 与 DNAT 虚拟状态
Conntrack 匹配可根据 Original 与 Reply Tuple 的差异判断连接是否经过 SNAT 或 DNAT。这些是虚拟匹配状态,不是独立生命周期阶段。
排查 NAT 时应同时查看原始和应答方向元组,而不是只看抓包中某一侧地址。
Conntrack 与 NAT 的关系
NAT 通常在连接首包上确定映射,后续数据包通过 Conntrack Entry 复用转换决策。若状态条目丢失,已有流量可能突然失败。
这也是为什么 NAT 流量不能随意 NOTRACK,以及高可用防火墙切换时需要认真处理状态一致性。
非对称路由问题
如果请求经过防火墙 A、响应经过防火墙 B,而两者没有状态同步,每台设备只看到单向流量。返回包可能不匹配 ESTABLISHED,甚至成为 INVALID。
解决方向包括保持路径对称、同步 Conntrack State 或采用经审计的 Stateless Policy,而不是简单全放行 INVALID。
Conntrack 表满会怎样
达到容量上限时新条目可能无法插入,内核统计会出现 insert-failed、drop 或 early-drop。用户看到的症状可能是偶发新连接超时,而旧连接仍工作。
调大上限前应分析 Flow 数量、超时、内存预算和攻击流量;只增大表会把资源耗尽推迟而非解决根因。
超时的作用
Conntrack 为不同协议和状态维护超时。超时后条目被删除,晚到报文就可能被当作 NEW 或 INVALID。
过短会中断空闲长连接,过长会占用容量。调整应基于真实业务的空闲分布,并与应用 Keepalive 和负载均衡超时协调。
conntrack -L 怎么看
conntrack -L 列出当前条目,通常显示协议、剩余超时、协议状态、Original/Reply Tuple 和标志。生产环境全量输出可能很大,应使用过滤条件。
条目包含客户端地址等敏感网络数据,诊断报告需要脱敏,不能直接公开完整转储。
conntrack -E 怎么看
事件模式可观察 NEW、UPDATE、DESTROY 等变化,适合确认流量是否被跟踪、是否看到 Reply 和何时过期。
事件丢失不一定表示内核没有状态,也可能是监听器缓冲区溢出。高流量环境应配合内核计数器判断。
一个基础有状态规则思路
入口或转发链通常先处理 INVALID,再允许明确需要的 ESTABLISHED/
这只是结构,不是可直接复制的完整规则;管理面、Loopback、ICMPv6、DHCP、路由协议和容器网络都可能需要额外例外。
规则顺序为什么重要
Netfilter 按 Chain 顺序求值。一个过早的广泛 ACCEPT 会绕过后续限制,一个过早的 DROP 会让合法 RELATED ICMP 无法通过。
NOTRACK 更依赖 Hook Priority;应同时查看实际加载的完整 Ruleset,而不是只检查配置文件片段。
容器与网络命名空间
Conntrack 与 Network Namespace、Bridge 和 Host Hook 的可见范围会影响你在哪里看到条目。容器内抓包、宿主机抓包与上游防火墙可能呈现不同地址和阶段。
排障要记录 Namespace、Interface、Hook 位置和 NAT 前后,不要把某一处看不到条目解释成全链路没有跟踪。
常见误区
常见错误包括把 NEW 等同于 SYN、把 ESTABLISHED 当作应用认证、认为 INVALID 都是攻击、对单向流量使用 NOTRACK、默认信任所有 RELATED,以及把 Socket TIME_WAIT 与 Conntrack 超时混为一谈。
另一个错误是只清空 Conntrack 表来“修复网络”,这会破坏正在使用 NAT 和状态规则的现有 Flow。
测试方法
分别测试 TCP 握手、SYN 重传、UDP 请求响应、ICMP 错误、连接关闭、超时后迟到包、非对称返回、NOTRACK 双向规则与表满压力。
同时对比 nft/iptables Counter、conntrack -E、conntrack -L、ss 和两侧抓包,确认每个观测点回答的不是同一个问题。
监控指标
至少监控当前条目数、最大容量、insert-failed、drop、early-drop、INVALID 规则计数、各协议超时分布和状态事件丢失。
告警应结合连接新建速率和业务错误率。单看条目数高并不能判断异常,短连接峰值和攻击流量的处置不同。
结论
NEW、ESTABLISHED、RELATED、INVALID 与 UNTRACKED 是 Conntrack 对数据包关系的状态;NOTRACK 是让流量绕过跟踪的动作;TCP State 与 Socket State 则描述协议或本机端点生命周期。
可靠规则应明确协议、方向、服务端口和状态,谨慎使用 RELATED 与 NOTRACK,并用状态表、计数器和双向抓包共同验证。
常见问题
ct state ESTABLISHED 是否代表 TCP 三次握手已完成?
不应这样等同。它表示 Conntrack 已看到双向数据;TCP 专属状态需要查看条目协议状态或本机 Socket。
UDP 没有连接,为什么会显示 ESTABLISHED?
Conntrack 把双向 UDP Flow 作为逻辑连接跟踪,看到响应后可分类为 ESTABLISHED。
INVALID 数据包应该 REJECT 还是 DROP?
通常优先 DROP,并做限速日志。无差别 REJECT 可能让迟到但属于健康连接的报文触发错误终止。
NOTRACK 与 UNTRACKED 是一回事吗?
不是同一类型。NOTRACK 是规则动作,UNTRACKED 是被排除跟踪后数据包所呈现的状态。
使用 NOTRACK 后还能做 NAT 吗?
通常不能依赖基于 Conntrack 的常规 NAT。设计前必须确认 NAT、状态防火墙、Helper 和连接标记均不需要。
conntrack -L 与 ss 为什么结果不同?
前者看 Netfilter Flow,后者看本机 Socket。转发流量、未跟踪流量和不同命名空间都会造成差异。
官方与一手参考资料
- Linux Kernel:Conntrack Netlink Specification — https:
/ / www. kernel. org/ doc/ html/ next/ networking/ netlink_ spec/ conntrack. html - Netfilter:nftables Manual — https:
/ / netfilter. org/ projects/ nftables/ manpage. html - Netfilter:conntrack-tools Manual — https:
/ / conntrack- tools. netfilter. org/ manual. html - Netfilter:conntrack Manual Page — https:
/ / netfilter. org/ projects/ conntrack- tools/ conntrack- manpage. html - Linux Man Pages:iptables-
extensions(8) — https: / / www. man7. org/ linux/ man- pages/ man8/ iptables- extensions. 8. html - Linux Kernel:Netfilter Conntrack Sysctl — https:
/ / www. kernel. org/ doc/ html/ latest/ networking/ nf_ conntrack- sysctl. html