环境准备
预先安装 docker、sar 、hping3、tcpdump、curl 等工具,比如 apt-get install docker.io hping3 tcpdump curl。
操作和分析
案例用到三台虚拟机
其中一台虚拟机运行 Nginx ,用来模拟待分析的 Web 服务器;而另外两台作为 Web 服务器的客户端,其中一台用作 DoS 攻击,而另一台则是正常的客户端。
在终端一中,执行下面的命令运行案例,也就是启动一个最基本的 Nginx 应用:
# 运行Nginx服务并对外开放80端口
# --network=host表示使用主机网络(这是为了方便后面排查问题)
docker run -itd --name=nginx --network=host nginx
在终端二和终端三中,使用 curl 访问 Nginx 监听的端口,运行 curl 命令后,你应该会看到下面这个输出界面:
curl -s -w 'Http code: %{http_code}\nTotal time:%{time_total}s\n' -o /dev/null http://xxx.xxx.xxx.xxx/
Http code: 200
Total time:0.094636s
访问 Nginx 只需要 9ms(0.009s)。
在终端二中,运行 hping3 命令,来模拟 DoS 攻击:
hping3 -S --flood -p xxx.xxx.xxx.xxx
到终端三中,执行下面的命令,模拟正常客户端的连接
# --connect-timeout表示连接超时时间
$ curl -w 'Http code: %{http_code}\nTotal time:%{time_total}s\n' -o /dev/null --connect-timeout 10 http://xxx.xxx.xxx.xxx
...
Http code: 000
Total time:10.001s
curl: (28) Connection timed out after 10000 milliseconds
回到终端一中,执行下面的命令:
sar -n DEV 1
网络接收的 PPS 已经达到了 1200多,但是 BPS 却只有 73kB,这样每个包的大小就只有 62B(73*1024/1200=62)
这明显就是个小包了,不过具体是个什么样的包呢?那我们就用 tcpdump 抓包看看吧。
在终端一中,执行下面的 tcpdump 命令:
tcpdump -i eth0 -n tcp port 80
Flags [S] 表示这是一个 SYN 包。大量的 SYN 包表明,这是一个 SYN Flood 攻击。应用程序考虑识别,并尽早拒绝掉这些恶意流量,比如合理利用缓存、增加 WAF(Web Application Firewall)、使用 CDN 等等。