SYN Cookie

SYN Cookie算法

SYN Cookie是对TCP服务器端的三次握手做一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器接收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值,这个cookie作为将要返回的SYN ACK包的初始序列号。当客户端返回一个ACK包时,根据包头信息计算cookie,与返回的确认序列(初始序列号+1)进行对比,如果相同,则是一个正常链接,然后分配资源,建立连接。实现的关键在于cookie的计算,cookie的计算应该包含本次链接的状态信息,使攻击者不能伪造。
实现
发起一个TCP连接时,客户端将一个TCP SYN包发送给服务器。作为响应,服务器将TCP SYN+ACK包返回给客户端。此数据包有一个序号,它被TCP用来重新组装数据流。根据TCP规范,由端点发送的第一个序号可以是由该端点决定的任何值。SYN Cookies是根据以下规则的初始序号

  • 令t为一个缓慢递增的时间戳(通常time()>>6,提供64秒的分辨率);

  • 令m为服务器会在SYN队列条目中储存的最大分段大小(Maximum segment size);

  • 令s为一个加密散列函数对服务器和客户端各自的IP地址和端口号以及t进行运算的 结果。返回得到的数值s必须是一个24位值。

初始TCP序号,也就是所谓的SYN cookie,按照如下算法得到:

  • 头五位:t mod 32;
  • 中三位:m编码后的数值;
  • 末24位:s本身;

根据TCP规范,当客户端发回TCP ACK包给服务器以响应服务器的SYN+ACK包时,客户端必须使用由服务器发送的初始序号加1作为数据包中的确认号。服务器接着从确认号中减去1以便还原向客户端发送的原始SYN Cookie
接下来服务器进行一下检查:

  • 配合现在时间t来检查连接是否过期

  • 重新计算s来确认这是不是一个有效的SYN Cookie

  • 从3位编码中解码m,以便之后用来重建SYN队列条目。在此之后,连接照常进行

发布了165 篇原创文章 · 获赞 11 · 访问量 4885

猜你喜欢

转载自blog.csdn.net/weixin_43784305/article/details/105091552