我们看一下,如何理解DDOS攻击

DDOS的前身是DOS攻击,即利用大量的合理请求,空耗目标资源

从攻击的原理来说,DDOS分为了以下几个类型

第一种,耗尽带宽,无论是服务器还是路由器,交换机等网络设备,都有固定的带宽上限,带宽耗尽之后,就会发生网络拥堵

第二种,耗尽操作系统的资源,网络服务的正常运行,都需要一定的系统资源,像是CPU 内存等物理资源,以及连接表等软件资源,一旦资源耗尽,就不会正常处理了

第三种,就是消耗应用程序的运行资源,应用程序的资源池往往有上限

常见的,就是构造出不同的域名进行攻击DNS服务器,导致DNS不停的迭代更新,消耗DNS服务器的资源,使DNS的响应变慢

无论是哪一种类型的DDoS,其危害都是巨大的,如何查看这些案例呢?

我们利用三台虚拟机,表示其对应关系

其中一台作为Nginx,模拟Web服务器

一台作为Dos攻击机

一台作为正常的客户端

我们首先进行了启动任务,然后尝试正常访问,Nginx只需要2ms

然后我们利用hping3,进行模拟Dos攻击

基本命令如下

hping3 -S -p 80 -i u10 192.168.0.30

接下来,无论执行什么命令,都会慢很多

然后在进行模拟正常客户端的连接的时候,会发现正常客户端的连接超时了,没有收到Nginx的响应

在本身终端中,检查网络状况,使用sar命令,可以观察PPS

$ sar -n DEV 1

08:55:49        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil

08:55:50      docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

08:55:50         eth0  22274.00    629.00   1174.64     37.78      0.00      0.00      0.00      0.02

08:55:50           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

在sar中,显示的rxpck已经达到了20000多,BPS只有1174kb,每个包只有54B

这就是小包的问题,具体是什么包,可以用tcpdump进行转包看

终端一中,执行如下的tcpdump命令

tcdump -i eth0 -n tcp port 80

09:15:48.287047 IP 192.168.0.2.27095 > 192.168.0.30: Flags [S], seq 1288268370, win 512, length 0

09:15:48.287050 IP 192.168.0.2.27131 > 192.168.0.30: Flags [S], seq 2084255254, win 512, length 0

09:15:48.287052 IP 192.168.0.2.27116 > 192.168.0.30: Flags [S], seq 677393791, win 512, length 0

09:15:48.287055 IP 192.168.0.2.27141 > 192.168.0.30: Flags [S], seq 1276451587, win 512, length 0

09:15:48.287068 IP 192.168.0.2.27154 > 192.168.0.30: Flags [S], seq 1851495339, win 512, length 0

Flag[S]说明,这是一个SYN的包,大量的SYN包说明,是SYN Flood攻击,我们利用Wireshark观察

图片

SYN Flood是经典的DDoS攻击方式,我们查看的原理是客户端构建大量的SYN包,建立TCP包

服务器收到包之后,会向源IP发送SYN+ACK报文,等待三次握手和最后一次ACK,直到超时

这种等待状态的TCP,称为半开连接,由于连接表的大小有限,导致占满了连接表,无法建立新的TCP连接

参考如下的TCP状态图,可以看到服务器的TCP连接,处于SYN_RECEIVED状态:

图片

利用netstat,查看所有连接的状态,利用netstat命令,获取如下

# -n表示不解析名字,-p表示显示连接所属进程

$ netstat -n -p | grep SYN_REC

tcp        0      0 192.168.0.30:80          192.168.0.2:12503      SYN_RECV    –

tcp        0      0 192.168.0.30:80          192.168.0.2:13502      SYN_RECV    –

tcp        0      0 192.168.0.30:80          192.168.0.2:15256      SYN_RECV    –

tcp        0      0 192.168.0.30:80          192.168.0.2:18117      SYN_RECV    –

发现了源IP,解决SYN攻击,就需要丢掉相关的包,这时候,可以利用iptables了

直接执行如下的命令

iptables -I INPUT -s 192.168.0.2 -p tcp -j REJECT

发表评论

邮箱地址不会被公开。 必填项已用*标注