服务器等待从未到达的最终ACK数据包时,攻击者继续发送更多的SYN数据包。每个新的SYN数据包的到达导致服务器暂时维持新的开放端口连接一段时间,一旦所有可用端口被使用,服务器就无法正常工作。
当服务器断开连接但连接另一端的机器没有连接时,连接被认为是半开的。在这种类型的DDoS攻击中,目标服务器不断离开打开的连接,等待每个连接超时,然后端口再次可用。结果是这种攻击可以被认为是“半开攻击”。
UDP Flood攻击
UDP Flood 是日渐猖厥的流量型DDoS攻击,原理也很简单。常见的情况是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。由于UDP协议是一种无连接的服务,在UDP Flood攻击中,攻击者可发送大量伪造源IP地址的小UDP包。
ICMP Flood攻击
ICMP Flood攻击属于流量型的攻击方式,是利用大的流量给服务器带来较大的负载,影响服务器的正常服务。由于目前很多防火墙直接过滤ICMP报文。因此ICMP Flood出现的频度较低。
Connection Flood攻击
Connection Flood是典型的利用小流量冲击大带宽网络服务的攻击方式,这种攻击的原理是利用真实的IP地址向服务器发起大量的连接。并且建立连接之后很长时间不释放,占用服务器的资源,造成服务器上残余连接(WAIT状态)过多,效率降低,甚至资源耗尽,无法响应其他客户所发起的链接。
HTTP Get攻击
这种攻击主要是针对存在ASP、JSP、PHP、CGI等脚本程序,特征是和服务器建立正常的TCP连接,并不断的向脚本程序提交查询、列表等大量耗费数据库资源的调用。这种攻击的特点是可以绕过普通的防火墙防护,可通过Proxy代理实施攻击,缺点是攻击静态页面的网站效果不佳,会暴露攻击者的lP地址。
UDP DNS Query Flood攻击
UDP DNS Query Flood攻击采用的方法是向被攻击的服务器发送大量的域名解析请求,通常请求解析的域名是随机生成或者是网络世界上根本不存在的域名。域名解析的过程给服务器带来了很大的负载,每秒钟域名解析请求超过一定的数星就会造成DNS服务器解析域名超时。
DDOS 的防范
通过 Linux 自带防火墙防范攻击
以 DDOS SYN Flood 攻击为例,我们可以通过系统自带的iptables 防火墙来进行防护。
第一种方式是禁止攻击来源IP,但是通常攻击源都不只一个IP,这种方式防护比较弱。
$ iptables -I INPUT -s 192.168.0.2 -p tcp -j REJECT
第二钟方式是 限制syn并发的次数以及同一个IP 新建连接数的数量。
#限制 syn 并发数为每秒 1 次$iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT#限制单个 IP 在 60 秒新建立的连接数为 10$iptables -I INPUT -p tcp --dport 80 --syn -m recent --name SYN_FLOOD --update --seconds 60 --hitcount 10 -j REJECT
但是如果攻击源特别多,其实还是很难阻挡。SYN Flood 会导致 SYN_RECV 状态的连接急剧增大,可以通过调整半连接容量大小,例如调整为 1024
$ sysctl -w net.ipv4.tcp_max_syn_backlog=1024net.ipv4.tcp_max_syn_backlog = 1024
另外,每个SYN_RECV 如果失败,内核还会自动重试,默认是 5次,可以修改为1次。
$ sysctl -w net.ipv4.tcp_synack_retries=1net.ipv4.tcp_synack_retries = 1
此外,TCP SYN Cookies 是一种专门防御 SYN Flood 攻击的方法,其原理是基于连接信息(包括源地址、源端口、目的地址、目的端口等)以及一个加密种子(如系统启动时间),计算出一个哈希值(SHA1),这个哈希值称为 cookie。
这个 cookie 就被用作序列号,来应答 SYN+ACK 包,并释放连接状态。当客户端发送完三次握手的最后一次 ACK 后,服务器就会再次计算这个哈希值,确认是上次返回的 SYN+ACK 的返回包,才会进入 TCP 的连接状态。因而,开启 SYN Cookies 后,就不需要维护半开连接状态了,进而也就没有了半连接数的限制。