http://blog.csdn.net/hengyunabc/article/details/24934529
简介
TCP协议要经过三次握手才能建立连接:(from wiki)
20140512034300078.png
于是出现了对于握手过程进行的攻击。攻击者发送大量的SYN包,服务器回应(SYN+ACK)包,但是攻击者不回应ACK包,这样的话,服务器不知道(SYN+ACK)是否发送成功,默认情况下会重试5次(tcp_syn_retries)。这样的话,对于服务器的内存,带宽都有很大的消耗。攻击者如果处于公网,可以伪造IP的话,对于服务器就很难根据IP来判断攻击者,给防护带来很大的困难。
攻与防
攻击者角度
从攻击者的角度来看,有两个地方可以提高服务器防御的难度的:
- 变换端口
- 伪造IP
变换端口很容易做到,攻击者可以使用任意端口。
攻击者如果是只有内网IP,是没办法伪造IP的,因为伪造的SYN包会被路由抛弃。攻击者如果是有公网IP,则有可能伪造IP,发出SYN包。(TODO,待更多验证)
更强大的攻击者
SYN cookie虽然十分巧妙,但是也给攻击者带了新的攻击思路。
因为SYN cookie机制不是正常的TCP三次握手。因此攻击者可以构造一个第三次握手的ACK包,从而劫持会话。
攻击者的思路很简单,通过暴力发送大量的伪造的第三次握手的ACK包,因为ISN只有32位,攻击者只要发送全部的ISN数据ACK包,总会有一个可以通过服务器端的校验。
有的人就会问了,即使攻击者成功通过了服务器的检验,它还是没有办法和服务器正常通讯啊,因为服务器回应的包都不会发给攻击者。
刚开始时,我也有这个疑问,但是TCP允许在第三次握手的ACK包里带上后面请求的数据,这样可以加快数据的传输。所以,比如一个http服务器,攻击者可以通过在第三次握手的ACK包里带上http get/post请求,从而完成攻击。
所以对于服务器而言,不能只是依靠IP来校验合法的请求,还要通过其它的一些方法来加强校验。比如CSRF等。
值得提醒的是即使是正常的TCP三次握手过程,攻击者还是可以进行会话劫持的,只是概率比SYN cookie的情况下要小很多。
详细的攻击说明:http://www.91ri.org/7075.html
一个用raw socket SYN flood攻击的代码
总结:
对于SYN flood攻击,调整下面三个参数就可以防范绝大部分的攻击了。
- 增大tcp_max_syn_backlog
- 减小tcp_synack_retries
- 启用tcp_syncookies
貌似现在的内核默认都是开启tcp_syncookies的。
参考:
http://www.redhat.com/archives/rhl-devel-list/2005-January/msg00447.html
http://nixcraft.com/showthread.php/16864-Linux-Howto-test-and-stop-syn-flood-attacks
http://en.wikipedia.org/wiki/SYN_cookies
https://github.com/torvalds/linux/blob/master/net/ipv4/syncookies.c
网友评论