摘要

  • SYN 洪泛利用的是一个时间差:服务器在发起方完成握手之前就占用有限的半开连接状态,于是廉价请求可以塞满队列。
  • RFC 4987 给出的两种主要端点防线,一种是在有界 SYN 缓存中只记较小状态,另一种把可恢复信息编码进 SYN Cookie,等有效 ACK 返回后再建立完整连接。

一个 SYN 到达监听端时,服务器会做出一个看似微小的决定:记住这次尝试,发出 SYN-ACK,然后等待。对正常客户端,这是 TCP 的日常礼节;对攻击者,这却像一笔提前授信。服务器先花掉内存与定时器,而所谓客户端还没有证明自己能听见回复。

RFC 4987 分析的正是这份先付款的义务。传统实现会在三次握手尚未完成时保存 SYN-RECEIVED 状态。半开连接队列容量有限,只要新请求进入的速度长期高于旧状态被回收的速度,合法连接就会无位可用。RFC 的边界很明确:它讨论主机 TCP 状态和监听应用被拖垮,不声称解决流量先把网络链路打满的另一类问题。

伪造源地址可以让 SYN-ACK 找不到真正答复者,却不是攻击成立的唯一条件。受控主机完全可以使用有效、可路由的地址持续施压。真正必要的只有三点:每个 SYN 会触发状态分配,半开状态总量有限,请求速度足以超过回收速度。在 RFC 描述的机制中,直接受影响的是目标端口上的新入站连接,而不是已经建立的连接或主动发起的出站连接。

几种直觉式修补只是移动门槛。扩大 backlog 让服务器多买一些内存,也把攻击者要填的数字变大;它没有改变双方成本的不对称。缩短 SYN-RECEIVED 超时能更快腾位置,却会淘汰被正常网络时延拖慢的客户端,攻击者也可以相应提高发送速率。回收最旧的半开控制块,是用年龄决定牺牲谁,却并不知道谁是攻击者。入口过滤能削弱依赖源地址欺骗的流量,但无法假定全球都已部署,也挡不住从真实地址发包的僵尸网络。

少记一些,但把边界记清楚

SYN 缓存改变了第一条消息的价格。监听端不立即创建完整的 TCP 控制块,只保存足以继续握手的小型记录。缓存有明确上限。RFC 还讨论了以秘密哈希把记录分散到多个桶中:如果分桶函数公开可预测,攻击者即使不填满整个缓存,也能集中打满某一个桶;加入秘密后,这种定向拥塞更难实施,同时容量上限仍能约束内存与查找工作。

缓存并不是无状态。它仍要处理过期,也应保留重传 SYN-ACK 的能力。若服务器只发一次回复便忘记后续责任,一次普通丢包就会变成连接失败。SYN 缓存的价值不是删掉 TCP 行为,而是暂缓昂贵对象,同时保留走到最终 ACK 所需的最小协议记忆。

把收据放进回复里

SYN Cookie 把同一原则推进到无状态路径。服务器不为这次请求保留 SYN-RECEIVED 记录,而是构造自己的初始序列号,使最终 ACK 能带回验证交换并重建连接所需的信息。只有确认 ACK 有效后,服务器才分配完整控制块。

RFC 4987 附录 A 给出一种示例构造:它使用发起方的初始序列号、最大报文段长度编码、时间计数器、双方地址与端口,以及秘密函数。ACK 返回时,服务器用秘密和近期计数值检查结果。这个数值是某一次握手的紧凑收据,不是对人、应用或长期主机身份的认证。它证明 ACK 发送者拥有来自 SYN-ACK 的信息——前提是构造本身足以抵抗猜测——却不建立持久身份。

不保存状态也会丢失语义。SYN 与 ACK 之间本来可以记录协商出的 TCP 选项,而 Cookie 可编码的空间有限。常见方案因此可能限制窗口缩放、选择确认或未来选项状态。RFC 还提醒数据随 SYN 到达的情形。若最终 ACK 丢失,而服务器应用又要等客户端数据后才开口,它可能没有可用于正常重传 SYN-ACK 的状态。资源承诺被推迟了,一部分协议记忆也随之推迟。

两条道路不必互斥。监听端可以在正常压力下使用 SYN 缓存,缓存满时才切换 Cookie。混合方案在有容量时保留更丰富的协商,把无状态收据留给过载时刻。防火墙或代理也能代办握手,但那只是转移状态负担,并可能改变端到端语义。资源决定没有消失,只是换了付款人。

RFC 4987 发布于 2007 年 8 月,属于 Informational 文档,并非 Standards Track 强制要求。它在当时把 SYN 缓存和 SYN Cookie 视作可行的端点修改,同时更倾向于在可行时把缓存作为常态方案。这个历史判断不能拿来证明任何当前操作系统的默认设置。

真正耐久的是一条控制原则:若廉价、可逆的表示足以让交换继续,就不要在第一条未经验证的消息到达时,立刻投入昂贵、稀缺且可由攻击者定向消耗的资源。等待发起方带回回复中的信息,可以增加“回程可达”的证据,却不等于身份认证;延迟状态也可能丢掉有价值的上下文。好的防线必须同时说明它省下了什么,以及它牺牲了什么。

本文唯一资料是 RFC 4987《TCP SYN Flooding Attacks and Common Mitigations》。所有结论都限定在 RFC 分析的端点状态、缓解机制与明确代价之内,不推断当前部署比例、默认配置或攻击频率。