我们看一下,如何理解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