SYN Cookie

mark

SYN泛洪攻击

SYN攻击其实就是Server收到Client的SYN,Server向Client发送SYN-ACK之后未收到Client的ACK确认报文, 这样服务器就需要维护海量的半开连接 ,等待客户端的 ACK, 最终导致服务器资源耗尽(sync queue 满)而丢弃新的连接。 Server会不断重发SYN-ACK,Linux服务器默认直到63秒才断开连接!

其中一种防护方式是SYN Cookie, SYN Cookies 的应用允许服务器当 SYN 队列被填满时避免丢弃连接。相反,服务器会表现得像 SYN 队列扩大了一样。服务器会返回适当的SYN+ACK响应,但会丢弃 SYN 队列条目。如果服务器接收到客户端随后的ACK响应,服务器能够使用编码在 TCP 序号内的信息重构 SYN 队列条目。

Linux内核实现

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

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

为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以一般MSS值1460

则初始序列号n为:

  • 5 位为t mod 32(mod是一种同余运算)
  • 接下来3位为m的编码值
  • 24 位为s

下面是具体过程,主要是低24位s得计算过程,服务器收到一个SYN包,计算一个消息摘要mac。

mac = MAC(A, k);

MAC是密码学中的一个消息认证码函数,也就是满足某种安全性质的带密钥的hash函数,它能够提供cookie计算中需要的安全性。在Linux实现中,MAC函数为SHA1

1A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND

k为服务器独有的密钥,实际上是一组随机数。t为系统启动时间,每60秒加1。MSSIND为MSS对应的索引。

其实就是根据源IP、源端口、目的IP、目的端口、系统启动时间,MSS索引通过哈希函数计算出的一个值

SYN Cookie在Linux内核中的实现

如果SYN Cookie功能有编译进内核(CONFIG_SYN_COOKIE),且选项tcp_syncookies不为0,那么可使用SYN Cookie。同时设置SYN Flood标志(listen_opt->synflood_warned)

mark

mark

SHA1 安全哈希算法(Secure HASH Algorithm)主要适用于数字签名。

对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来 验证数据的完整性。在传输的过程中,数据可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA1有如下特性:

  • 不可以从消息摘要中复原信息。

  • 两个不同的消息不会产生同样的消息摘要。

当客户端收到此SYN+ACK 报文后,根据TCP标准,它会回复ACK报文,且报文中ack = n + 1,那么在服务器收到它时,将ack - 1就可以拿回当初发送的SYN+ACK报文中的序号了!服务器巧妙地通过这种方式间接保存了一部分SYN报文的信息。 看到这里在回顾一个这个序列号的组成

  • 5 位为t mod 32(mod是一种同余运算)
  • 接下来3位为m的编码值
  • 24 位为s

接下来,服务器需要对ack - 1这个序号进行检查:

  • 将高 5 位表示的t与当前之间比较,看其到达地时间是否能接受。
  • 根据t和连接元组重新计算s,看是否和低 24 一致,若不一致,说明这个报文是被伪造的。
  • 解码序号中隐藏的mss信息

如果成功匹配, 服务器就会为新的连接创建和初始化一个传输控制块,然后把完成三次握手的req和新sock关联起来,下面看看验证这段逻辑的代码

mark

SYN Cookie技术可以让服务器在收到客户端的SYN报文时,不分配资源保存客户端信息,而是将这些信息保存在SYN+ACK的初始序号和时间戳中。对正常的连接,这些信息会随着ACK报文被带回来。

SYN Cookie总结

由于cookie的计算只涉及到包头部分信息,在建立连接的过程。中不在服务器端保存任何信息,所以失去了协议的许多功能,比如超时重传。此外,由于计算cookie有一定的运算量,增加了连接建立的延迟时间,因此,SYN Cookie技术不能作为高性能服务器的防御手段。一些SYN攻击的防火墙也是基于SYN Cookie,只是把这个功能移动到内核之外的代理服务器上。

参考资料:

https://lwn.net/Articles/277146/

https://zh.wikipedia.org/wiki/SYN_cookie