Missmiaom
1/10/2020 - 3:10 AM

security

SYN FLOOD

安全缺陷

在3次握手进行的过程中,服务器需要保持所有未完成的握手信息(称为半开连接,即收到了TCP-SYN并发送了SYN-ACK,但第三次握手信息(ACK)未收到的状态)直到握手完成或超时(不同的系统超时长度的设置不同,一般情况下在75秒左右)以后丢弃该信息。

而且,半开连接的数量是有限的,比如很多OS设置为1024个,当服务器的半开连接栈用完,服务器将不再接受其他的连接请求。

诊断方法

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 

查看处于 SYN_RECV 的连接数量是否异常

攻击原理

SYN Flood 攻击就是攻击者向攻击目标发送大量伪造的TCP 连接请求报文,即 SYN 包;

而当攻击目标收到连接请求时,就会在目标的 TCP 协议栈分配资源, 并记录其信息到半开连接队列中,同时回应 ACK + SYN;

此时, 攻击者却不再发送ACK 确认报文以完成第三次握手, 而是将继续发送大量的 SYN 连接请求包。

这样不仅会导致被攻击者在短时间内需要为大量半开连接分配内存资源,还会使得系统对后续到来的SYN 包在自身的半开连接队列中查找是否有此包的握手信息,从而消耗大量 CPU 资源, 最终造成被攻击者无法向正常用户提供所需服务。

防御策略

基于退让的防御策略
  1. 缩短半开连接队列的保持时间。

设置 net.ipv4.tcp_synack_retries = 0 ,表示不进行 SYN+ACK 包的重发。

默认 net.ipv4.tcp_synack_retries 为 5,表示重发5次,每次等待30~40秒,即“半开连接”默认hold住大约180秒。

  1. 增大半开连接队列的大小。

设置 net.ipv4.tcp_max_syn_backlog = 200000,表示最大半连接队列容量。

  1. 负载均衡策略。
基于 TCP 协议栈缺陷的防御策略

SYN Cookie 技术

原理:

Cookie 机制是服务器收到客户端的连接请求后, 系统并不会为其分配资源,而简单记录该连接信息,形式即如源 IP、 源端口、 时间戳的三元组,根据这个 SYN 包的相关信息计算生成某一 Cookie 值, 并将其作为 ACK + SYN 包的序列号返回给客户端。

在接到 ACK 报文时, 根据 ack_seq - 1 计算出 Cookie,并进行验证,验证通过则分配资源,建立连接, 否则回复 RST 包。

启用:

设置 net.ipv4.tcp_syncookies = 1 开启 SYN Cookie。

cookie 计算:

服务器收到一个SYN包,计算一个消息摘要 mac = MAC(A, k);

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

在Linux实现中,MAC函数为SHA1。

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

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

总结:

  • SYN Cookie技术由于在建立连接的过程中不需要在服务器端保存任何信息,实现了无状态的三次握手,从而有效的防御了SYN Flood攻击。
  • 由于cookie的计算只涉及到包头部分信息,在建立连接的过程中不在服务器端保存任何信息,所以失去了协议的许多功能,比如超时重传。此外,由于计算cookie有一定的运算量,增加了连接建立的延迟时间,因此,SYN Cookie技术不能作为高性能服务器的防御手段。
  • 攻击者发送大量的ACK报文,服务器忙于计算验证,还是会使服务不可用。

参考: https://www.cnblogs.com/zlhff/p/5481266.html

SYN Cache 技术

该方法通过一个专用的 HASH 表 (Cache) 来保存半开连接信息,直至收到 ACK 信息才为连接分配系统资源 (TCB) .

SYN Proxy 技术

只有在 SYN 代理确认连接的有效性后,才向内部服务器发起连接请求。所以当攻击发生时,攻击造成的危害就将转移到至该代理上,借此以保护服务器端。

是基于 SYN Cookie 和 SYN Cache 的,这也是对 SYN Cookie 的另一种改进。

只是需要注意,一旦代理被攻击破坏, 其保护的服务器也都将无法向外界提供服务,这也成为 SYN Proxy 方法的瓶颈所在。

模拟方法

hping3 --flood -S --rand-source -p 9999 x.x.x.x  
  • --flood: 不间断发包
  • -S: SYN包
  • --rand-source: 随机源地址

在内网测试,随机地址的SYN包可能会被路由器丢弃。