SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应 报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。
原本tcp协议是在收到syn包时,服务器返回syn+ack包并分配一个专门的数据区来储存tcp连接需要的数据。这就使攻击者有机可乘,可以利用伪造的syn包来消耗服务器的内存空间和半开连接数,这就可以使服务器的内存或者半开连接数耗尽而拒绝服务(Denial of Service)。
syn cookie详解
syn cookie技术是在1996年由Daniel J. Bernstein和Eric Schenk创造的,最早是1997年在linux上实现的,至今linux依然支持syn cookie技术。
syn cookie技术是服务器在收到syn包时并不马上分配储存连接的数据区,而是根据这个syn包计算出一个cookie,把这个cookie填入tcp的Sequence Number字段发送syn+ack包,等对方回应ack包时检查回复的Acknowledgment Number字段的合法性,如果合法再分配专门的数据区。
syn cookie对tcp的三次握手进行了一定的修改,修改仅在于服务器端,对任何客户端的使用都没有影响
开启syn cookie
在linux内核中提供了很多SYN相关的配置,用命令:sysctl -a | grep syn就能看得到。
sysctl -w net.ipv4.tcp_syncookies=1即可,关闭则输入sysctl -w net.ipv4.tcp_syncookies=0
//增大队列SYN最大半连接数
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_syn_retries=3
//开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
sysctl -w net.ipv4.tcp_tw_recycle = 1
//修改系統默认的 TIMEOUT 时间
sysctl -w net.ipv4.tcp_fin_timeout = 30
syn cookie的缺点
syn cookie虽然与任何的上层和下层协议都不冲突,但是还是有他的不足之处
- 服务器只能编码八种 MSS 数值,因为只有 3 位二进制空间可用。
- 这个服务器必须拒绝所有的TCP 选用项,例如大型窗口和时间戳,因为服务器会在信息被用其他方式存储时丢弃 SYN 队列条目.
- 还有最致命的缺点就是开启syn cookie后会使服务器对与ack攻击的抵抗力大大降低,他虽然保护了内存空间的过度分配但是也使得cpu的计算资源被消耗(需要计算哈希值)。
所以说syn cookie虽然能抵御syn攻击但是却容易受到ack攻击。想要防御住所有类型的DOS攻击是很苦难的,需要对各种攻击的原理与防御方法非常了解,并且针对不同攻击选择合适的防御方法才行。