由于最近在看《linux企业案例精解第二版》的书,里面的很多作者亲身经历的事故总结给了我很多学习的一手资料,我认为很受用,特此来分享一下笔记
首先介绍一下DDOS
DDOS分类:1.容量耗尽攻击,这种攻击企图耗尽转发或链接容量 2.状态表耗尽攻击,这种攻击企图耗尽基础设施和服务器里面的状态表 3.应用层攻击,这种方法企图耗尽应用成层资源
DDOS原理:DDOS是DOS攻击的加强版,基本的DOS是通过操纵单台攻击机连接服务器,利用TCP三次握手原理,发出大量合理但非正常的请求来占用过多的服务器资源,从而导致服务器无法为其他用户提供正常服务。而DDOS攻击之前在网络上收集足够多的"肉鸡"作为攻击机,能力强的甚至可以在已经控制的一级"肉鸡"中扩大更多有漏洞的机器,具有多级主从关系的攻击链,一旦发起攻击,所有可利用的攻击机器会同时对目标服务展开进攻,攻击规模大,破坏力强
TCP三次握手过程:
第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN-SEND状态,等待服务器确认
第二次握手:服务器收到SYN包后,必须确认客户的SYN(ACK=x+1),同时发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN-RECV状态
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包,ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态
在上述过程中有一些重要概念
未连接队列:在三次握手协议中,服务器维护着一个未连接队列。该队列为每个客户端的SYN包(seq=y)开设一个条目,条目表名服务器已经收到SYN包,并向客户发布确认,等待客户的确认包,这些条目所表示的链接是在服务器处于SYN-RECV状态时,当服务器收到客户的确认包时删除这些条目,服务器进入ESTABLISHED状态
Backlog参数,表示未连接队列的最大容纳数据
SYN+ACK 重传次数。服务器发送完SYN+ACK包后,如果未收到客户确认包,则服务器进行首次重传,再过一段时间后仍未收到客户确认包,则进行第二次重传。如果重传次数超过系统规定的最大重传次数时,则系统将该连接信息从半连接队列中删除。注意每次重传等待的时间不一定相同
半连接存活时间。指定半连接队列条目存活的最长时间,即服务从收到SYN包到确认这个报文无效的最长时间,该时间值时所有重传请求包的最长等待时间总和,有时也成为半连接存活时间为Timeout时间或者SYN-RECV存活时间
TCP-SYN Flood又称为半开式连接攻击。攻击者会利用一些特殊工具制造大量的非法数据包,把原地址伪装成为一个实际不存在的地址,因此当服务方收到请求方的SYN包并回送SYN+ACK确认消息后,请求放由于原地址欺骗等手段,致使服务方根本得不到ACK回应
事实上请求方除了立即响应SYN+ACK消息外,也可能因为正在处理数据而暂时无法响应服务端消息,这是正常的,所以在设计中考虑让服务器持续一段时间保留SYN+ACK信息片断,等待接收方ACK消息是很有必要的。但是一台服务器的TCP连接是有线的,如果恶意攻击利用此快速、连续发送此类连接请求,则服务器可用的TCP链接很快会被阻塞,系统可用资源、网络可用宽带急剧下降,这就是TCP-SYN Flood攻击原理
防范DDOS攻击
1.通过合理配置系统 2加固TCP/IP协议栈 3通过防火墙
SYN Cookies技术:用于限制同时打开的半连接数。 echo 1>/proc/sys/net/ipv4/tcp_syncookies
增加最大半连接数:默认为256,sysctl -W net.ipv4.tcp_max_syn_backlog=‘2048‘
缩短SYN半连接的Timeout时间:sysctl -W net.ipv4.tcp_syncack_retries=‘0‘
下面是用shell脚本实现防止恶意连接: