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 则能扩大密码学运算的范围,增强了安全性。