跳转至

> Back

SYN-Cookies

Created: November 18, 2021 Sort: Security

SYN cookie 是一种用于阻止 SYN flood 攻击的技术

SYN flood

SYN flood 攻击的本质一种典型的 DDos 攻击

  • TCP 连接建立时,客户端通过发送 SYN 报文,向处于监听状态的服务器发起连接;
  • 接受到 SYN 的服务器为该连接分配一定的资源,并发送 SYN+ACK 报文;
    • 对服务器来说,此时该连接的状态称为半连接(Half-Open),服务器能保存的半连接的数量是有限的;
    • 只有当其之后收到客户端回复的 ACK 报文后,连接才算建立完成。

SYN flood 则故意大量不断发送伪造的 SYN 报文,使服务器就会分配大量注定无用的资源,使其不能再接收正常的连接。

SYN cookies 算法

发起一个 TCP 连接时,客户端将一个 TCP SYN 包发送给服务器。作为响应,服务器将 TCP SYN + ACK 包返回给客户端:

  • 此数据包中有一个序号(sequence number,TCP头中的第二个32 bit),它被 TCP 用来重新组装数据流。

根据 TCP 规范,由端点发送的第一个序号可以是由该端点决定的任何值,SYN Cookies 是根据以下规则构造的初始序号:

  • 令 t 为一个缓慢递增的时间戳(通常为 time() >> 6 ,提供 64 秒的分辨率);
  • 令 m 为服务器会在 SYN 队列条目中存储的最大分段大小(maximum segment size,MSS);
  • 令 s 为一个加密散列函数对服务器和客户端各自的 IP 地址和端口号以及 t 进行运算的结果。
    • 返回得到的数值 s 必须是一个24位值。

初始 TCP 序号,也就是所谓的 SYN cookie,按照如下算法得到:

  • 头五位:t mod 32;
  • 中三位:m 编码后的数值;
  • 末24位:s 本身;

注:由于 m 必须用 3 位进行编码,服务器在启用了 SYN Cookie 时只能为 m 发送八种不同的数值。

根据 TCP 规范,当客户端发回 TCP ACK 包给服务器以响应服务器的 SYN + ACK 包时,客户端必须使用由服务器发送的初始序号加1作为数据包中的确认号。

服务器接着从确认号中减去 1 以便还原向客户端发送的原始 SYN Cookie,接下来服务器进行以下检查:

  • 根据当前的时间以及 t 来检查连接是否过期。
  • 重新计算 s 来确认这是不是一个有效的 SYN Cookie。
  • 从 3 位编码中解码 m,以便之后用来重建 SYN 队列条目。

如果以上步骤准确无误,则在此之后,连接照常进行。

安全性分析

  • s 包含了客户端和服务器的 IP 信息,能对 SYN 报文中携带的 TCP 选项信息进行验证;
  • t 能够保证半连接状态不会持续过久,从而最低程度地预防 SYN flood;
  • m 则能扩大密码学运算的范围,增强了安全性。