本文共 753 字,大约阅读时间需要 2 分钟。
1979年,那是一个春天,有一位老人在中国的南海边画了一个圈,神话般地崛起座座城,奇迹般地聚起座座金山。
1996年, 又是一个春天, 有一位hacker写了一个程序, 可以高速发出tcp syn包, 并且这个syn包的源ip地址被强制随机造假, 于是乎, 服务端接收到syn后, 迅速为每个syn包分配一个incomplete队列, 其中的socket都是暂时没有完成连接的syn_rcvd状态socket, 这个队列迅速满了, 消耗了服务器的资源, 但又无法正确建立tcp三次握手连接(服务端的syn/ack根据之前的syn包找到的是错误的客户端IP地址, 所以也就无法收到客户端的第三次握手ack包), 资源耗尽, 从而导致服务器无法响应正常的syn包。 典型的DOS攻击啊。
从syn flood攻击可以看出我们之前的讨论------tcp两次握手是万万不行的。 轻易相信syn包就建立连接的两次握手, 很容易让服务端因资源耗尽而无法提供服务。
那怎么预防syn flood攻击呢? 在RFC4987中给出了答案。 在syn到来的时候, 服务端并不会为这个syn包分配资源, 免得受骗上当。只有当服务端自己的syn/ack收到客户端的ack后, 才会真正分配资源, 此时才完成正常的连接。 由此可见, 此时syn flood失效。
如上是syn cookie的思路, 具体的方案和实现则要复杂很多, 有兴趣的朋友, 可以看RFC4987.
最后, 我们来看看linux想的syn cookie开关: cat /proc/sys/net/ipv4/tcp_syncookies
如果为1, 表示开启, 如果为0, 表示关闭。 我试了一下, 在我的机器上, 是开启的, 所以, 不怕你syn flood
转载地址:http://ojwti.baihongyu.com/