美文网首页
TCP - SYN Flood

TCP - SYN Flood

作者: killtl | 来源:发表于2020-07-20 21:46 被阅读0次

    什么是SYN泛洪攻击

    利用TCP三次握手协议,大量与服务器建立半连接,服务器默认需要重试5次,耗时63s才会断开连接,这样,攻击者就可以把服务器的syn连接队列耗尽,让正常的连接请求不能处理

    如何防御

    1. 参数调优
      • 增大tcp_max_syn_backlog(默认1024,建议2048)
      • 减小tcp_synack_retries(默认重试5次,减少到0、1或者2)
      • 启用tcp_syncookies
      • 首包丢弃
      • 地址状态监控
    SYN cookie技术

    SYN cookie技术针对标准TCP连接建立过程资源分配上的这一缺陷,改变了资源分配的策略。当服务器收到一个SYN报文后,不立即分配缓冲区,而是利用连接的信息生成一个cookie,并将这个cookie作为将要返回的SYN+ACK报文的初始序列号。当客户端返回一个ACK报文时,根据包头信息计算cookie,与返回的确认序列号(初始的序列号+1)的前24位进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接。

    该技术的巧妙之点在于避免了在连接信息未完全到达前进行资源分配,使SYN Flood攻击的资源消耗失效。实现的关键之处在于cookie的计算。cookie的计算应该做到包含本次连接的状态信息,使攻击者不能伪造cookie。cookie的计算过程如下:

    1. 服务器收到一个SYN包后,计算一个消息摘要mac:
    mac = MAC(A,K)
    MAC是密码学中的一个消息认证码函数,也就是满足某种安全性质的带密钥的hash函数,它能够提供cookie计算中需要的安全性。
    A为客户和服务器双方的IP地址和端口号以及参数t的串联组合:
    A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t
    K为服务器独有的密钥
    时间参数t为32比特长的时间计数器,每64秒加1(刚好是服务端重试5次的耗时)

    2. 生成cookie:
    cookie = mac(0:24),表示取mac值的第0到24比特位;

    3. 设置将要返回的SYN+ACK报文的初始序列号,设置过程如下:
    i. 高24位用cookie代替;
    ii. 接下来的3比特位用客户要求的最大报文长度MMS代替;
    iii. 最后5比特位为t mod 32。
      
    客户端收到来自服务器SYN+ACK报文后,返回一个ACK报文,这个ACK报文将带一个cookie(确认号为服务器发送过来的SYN ACK报文的初始序列号加1,所以不影响高24位),在服务器端重新计算cookie,与确认号的前24位比较,如果相同,则说明未被修改,连接合法,然后,服务器完成连接的建立过程。

    SYN-cookie技术由于在连接建立过程中不需要在服务器端保存任何信息,实现了无状态的三次握手,从而有效的防御了SYN Flood攻击。但是该方法也存在一些弱点。由于cookie的计算只涉及了包头的部分信心,在连接建立过程中不在服务器端保存任何信息,所以失去了协议的许多功能,比如,超时重传。此外,由于计算cookie有一定的运算量,增加了连接建立的延迟时间,因此,SYN-cookie技术不能作为高性能服务器的防御手段。通常采用动态资源分配机制,当分配了一定的资源后再采用cookie技术,Linux就是这样实现的。还有一个问题是,当我们避免了SYN Flood攻击的同时,同时也提供了另一种拒绝服务攻击方式,攻击者发送大量的ACK报文,使服务器忙于计算验证。尽管如此,在预防SYN Flood攻击方面,SYN-cookie技术仍然是一种有效的技术。

    首包丢弃

    通过丢弃客户端的第一个SYN报文来达到防御的目的,这就是“首包丢弃”了。但如果丢弃了SYN报文,客户端与服务器之间又如何进行连接呢?

    TCP是一种可靠的协议,为了确保所有的数据包都能到达服务器,设计了一个重传机制。真实的客户端访问,在一定的时间内如果没有收到服务器的回复,将会再次发送SYN报文,但攻击机制通常不会再重发。所以丢弃首次SYN报文后,就相当于过滤掉了虚假的客户端访问,进而防御了伪造源IP进行的SYN Flood攻击,保障了服务器的正常运行。

    地址状态监控
    1. 对于一个伪造源地址的SYN报文,若源地址第一次出现,则源地址的状态为NEW状态,当监听到服务器的SYN+ACK报文,表明服务器已经为该源地址的连接请求建立了半连接。此时,监控程序代源地址发送一个ACK报文完成连接。这样,半连接队列中的半连接数不是很多。计时器开始计时,由于源地址是伪造的,所以不会收到ACK报文,超时后,监控程序发送RST数据包,服务器释放该连接,该源地址的状态转为BAD状态。之后,对于每一个来自该源地址的SYN报文,监控程序都会主动发送一个RST报文。

    2. 对于一个合法的SYN报文,若源地址第一次出现,则源地址的状态为NEW状态,服务器响应请求,发送SYN+ACK报文,监控程序发送ACK报文,连接建立完毕。之后,来自客户端的ACK很快会到达,该源地址的状态转为GOOD状态。服务器可以很好的处理重复到达的ACK包。
      从以上分析可以看出,基于监控的方法可以很好的防御SYN Flood攻击,而不影响正常用户的连接。

    相关文章

      网友评论

          本文标题:TCP - SYN Flood

          本文链接:https://www.haomeiwen.com/subject/ajkukktx.html