SYN cookies
应对SYN Flood攻击
Syn-Flood
攻击成立的关键在于服务器资源是有限的,而服务器收到请求会分配资源。通常来说,服务器用这些资源保存此次请求的关键信息,包括请求的来源和目(五元组),以及TCP
选项,如最大报文段长度MSS
、时间戳timestamp
、选择应答使能Sack
、窗口缩放因子Wscale
等等。当后续的ACK
报文到达,三次握手完成,新的连接创建,这些信息可以会被复制到连接结构中,用来指导后续的报文收发。
那么现在的问题就是服务器如何在不分配资源的情况下
- 验证之后可能到达的
ACK
的有效性,保证这是一次完整的握手 - 获得
SYN
报文中携带的TCP
选项信息
SYN cookies 算法
SYN Cookies
算法wiki可以解决上面的第1
个问题以及第2
个问题的一部分
我们知道,TCP
连接建立时,双方的起始报文序号是可以任意的。SYN cookies
利用这一点,按照以下规则构造初始序列号:
- 设
t
为一个缓慢增长的时间戳(典型实现是每64s递增一次) - 设
m
为客户端发送的SYN
报文中的MSS
选项值 - 设
s
是连接的元组信息(源IP,目的IP,源端口,目的端口)和t
经过密码学运算后的Hash
值,即s = hash(sip,dip,sport,dport,t)
,s
的结果取低 24 位
则初始序列号n
为:
- 高 5 位为
t mod 32
- 接下来3位为
m
的编码值 - 低 24 位为
s
当客户端收到此SYN+ACK
报文后,根据TCP
标准,它会回复ACK
报文,且报文中ack = n + 1
,那么在服务器收到它时,将ack - 1
就可以拿回当初发送的SYN+ACK
报文中的序号了!服务器巧妙地通过这种方式间接保存了一部分SYN
报文的信息。
接下来,服务器需要对ack - 1
这个序号进行检查:
- 将高 5 位表示的
t
与当前之间比较,看其到达地时间是否能接受。 - 根据
t
和连接元组重新计算s
,看是否和低 24 一致,若不一致,说明这个报文是被伪造的。 - 解码序号中隐藏的
mss
信息
到此,连接就可以顺利建立了。
SYN Cookies 缺点
既然SYN Cookies
可以减小资源分配环节,那为什么没有被纳入TCP
标准呢?原因是SYN Cookies
也是有代价的:
MSS
的编码只有3位,因此最多只能使用 8 种MSS
值- 服务器必须拒绝客户端
SYN
报文中的其他只在SYN
和SYN+ACK
中协商的选项,原因是服务器没有地方可以保存这些选项,比如Wscale
和SACK
- 增加了密码学运算