返回博客

如何快速检查您的网站是否能抵御DoS攻击?

2022-02-195 分钟阅读

本次快速指南的目的是解释如何对您的网站进行压力测试,并观察其在高负载下的表现。本次测试使用的开源工具是HTTP基准测试工具wrk

什么是(DoS)拒绝服务攻击:

拒绝服务(DoS)是一种攻击类型,攻击者阻止授权用户访问服务。最常见的DoS方法是向服务发送大量流量或数据请求,导致服务无法响应合法用户,直到恶意流量停止。我们将使用HTTP基准测试工具wrk来模拟这种类型的攻击。

在计算中,什么是基准测试:

根据维基百科基准测试是:

在计算中,基准测试是通过运行一个计算机程序、一组程序或其他操作来评估对象相对性能的行为,通常通过运行一系列标准测试和试用来实现。术语基准测试也常用于精心设计的基准测试程序本身。

基准测试的两个关键特征是:

  1. 必须是可重复的。
  2. 必须是可量化的。

什么是wrk:

为了对我们的网站运行负载测试,我们使用wrk,根据其官方文档:

wrk是一个现代化的HTTP基准测试工具,在单核多核CPU上运行时能够产生显著的负载。它结合了多线程设计和可扩展的事件通知系统,如epoll和kqueue。

wrk是开源的,但在使用它之前,请查看https://github.com/wg/wrk#cryptography-notice上的加密通知

如何安装wrk

好了,我们终于要开始测试了。请确保您熟悉在终端中运行命令,因为目前还没有图形界面来运行wrk。

  • 如何在Mac上安装wrk

    • 安装homebrew, 在终端中运行以下命令:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    • 要安装wrk,请在终端中运行以下命令:
brew install wrk

  • 如何在Linux发行版Ubuntu上安装wrk

sudo apt-get update
sudo apt-get install wrk

  • 如何在Windows上安装wrk

Windows用户需要先按照此链接安装Ubuntu,然后运行上述两个命令。

如何对您的网站进行压力测试

wrk的基本用法如下所示:

wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html

有效的命令行选项有:

-c, --connections: 要保持打开的HTTP连接总数,每个线程处理N = connections/threads

-d, --duration:    测试持续时间,例如2s、2m、2h

-t, --threads:     要使用的线程总数

-s, --script:      LuaJIT脚本,请参阅SCRIPTING

-H, --header:      添加到请求的HTTP头,例如“User-Agent: wrk”

    --latency:     打印详细的延迟统计信息

    --timeout:     如果在该时间内未收到响应,则记录超时。

我将运行一个为期90秒的基准测试,使用10个线程,并保持100000个HTTP连接打开。

wrk -t10 -c100000 -d90s https://davidloor.com --timeout 3s --latency -H 'Client: wrk terminal'

对我所使用的选项进行简要说明:

-t10:使用十个独立的线程
-c100000:打开100000个连接
-d90s:运行测试九十秒
https://davidloor.com 目标网站
--timeout 3s:定义三秒超时
--latency:打印详细的延迟统计信息
-H 'Client: wrk terminal':传递一个Client头

因此,我们可以说压力测试试图模拟100000个用户在90秒内多次打开网站主页。

重要提示:在运行压力测试时,同时打开网站并尝试登录(如果网站有此功能),如果网站像往常一样快速加载,您可以认为它已能抵御简单的DoS攻击,并且服务器能够处理大量负载。如果网站加载缓慢或显示错误,则您的网站存在问题,应联系您的托管服务提供商。在某些情况下,网站可能无法自行恢复,可能需要重新启动某些服务。

分析输出

运行命令后,我得到以下结果:

Running 2m test @ https://davidloor.com
  10 threads and 100000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   528.12ms  527.33ms   2.99s    87.92%
    Req/Sec    20.30     16.93   116.00     74.75%
  Latency Distribution
     50%  356.27ms
     75%  638.27ms
     90%    1.20s 
     99%    2.62s 
  11662 requests in 1.50m, 735.63MB read
  Socket errors: connect 97681, read 117, write 0, timeout 1581
Requests/sec:    129.43
Transfer/sec:      8.16MB

它简要总结了测试运行时间以及被测试的网站(https://davidloor.com)。它还显示了延迟和每秒请求数的正常分布参数。数据显示,在1.5分钟内,wrk发出了11662个请求,传输了735.63 MB的数据。

延迟和每秒请求数的平均值是否良好?这取决于具体情况。我们应该始终尝试保持低延迟和高每秒请求数,并且您应该记住,连接数越高,这两个值就会越低。

结论

  1. 您可以使用wrk快速对您的网站进行压力测试。https://github.com/wg/wrk
  2. 安装wrk后,运行压力测试的命令是:`wrk -t10 -c100000 -d90s https://davidloor.com –timeout 3s –latency -H ‘Client: wrk terminal’`
  3. 运行wrk命令,同时尝试在浏览器中加载网站,看看是否会遇到任何卡顿。
  4. 有一些免费资源可以提高您的网站性能,而无需增加服务器资源,例如使用免费CDN,如cloudflare
  5. 如果您有CDN,请确保充分利用其优势。

免责声明: 本博文提供的信息仅用于教育目的。我对您如何使用此处的信息概不负责。