TCP半连接和syn攻击(转)
TCP半连接和syn攻击
摘自:http://blog.sina.com.cn/s/blog_54b5ea250100g2r8.html
SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。TCP协议建立连接的时候需要双方相互确认信息,来防止连接被伪造和精确控制整个数据传输过程数据完整有效。所以TCP协议采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包到服务器,并进入SYN_SEND状态,等待服务器确认第二次握手:服务器收到syn包,必须确认客户的SYN 同时自己也发送一个SYN包即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
SYN攻击利用TCP协议三次握手的原理,大量发送伪造源IP的SYN包也就是伪造第一次握手数据包,服务器每接收到一个SYN包就会为这个连接信息分配核心内存并放入半连接队列,如果短时间内接收到的SYN太多,半连接队列就会溢出,操作系统会把这个连接信息丢弃造成不能连接,当攻击的SYN包超过半连接队列的最大值时,正常的客户发送SYN数据包请求连接就会被服务器丢弃,每种操作系统半连接队列大小不一样所以抵御SYN攻击的能力也不一样。
每种操作系统都有方法来调整TCP模块的半连接队列最大数,例如Win2000操作系统在注册表
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters里 TcpMaxHalfOpen,TcpMaxHalfOpenRetried ,Linux操作系统用变量tcp_max_syn_backlog来定义半连接队列的最大数。
但是每建立一个半连接资源就会耗费系统的核心内存,操作系统的核心内存是专门提供给系统内核使用的内存不能进行虚拟内存转换是非常紧缺的资源windows2000 系统当物理内存是4g的时候核心内存只有不到300M,系统所有核心模块都要使用核心内存所以能给半连接队列用的核心内存非常少。Windows 2003 默认安装情况下,WEB SERVER的80端口每秒钟接收5000个SYN数据包一分钟后网站就打不开了。标准SYN数据包64字节 5000个等于 5000*64 *8(换算成bit)/1024=2500K也就是 2.5M带宽,如此小的带宽就可以让服务器的端口瘫痪,由于攻击包的源IP是伪造的很难追查到攻击源,,所以这种攻击非常多。
为了便于理解,我们把一次完整的tcp连接比作汽车通过一座大桥,在通过大桥之前的行程都称之为tcp半开连接。tcp半开连接数就是大桥的车道,由于这个这个半连接数量如果设置过大,不仅耗费大量系统资源,而且还可能会遭受很多ddos攻击。因此,出于安全考虑,默认xp sp2(包括sp3)只允许同时存在10个tcp半开连接,也就是说这个大桥只有10个车道,破解就是通过修改tcpip.sys,拓宽这个大桥,使之拥有更多的车道,也就是增加tcp半开连接数