只是寻找有关如何处理导致 DDOS 式流量激增的抓取机器人的想法。
这是一个拥有超过 100k 页面的 Drupal 站点。大约有 1000 个术语页面,这些页面会经常更新,因为节点更新会触发这些页面上的 Varnish 清除。
在正常的网站操作下这会很好,但我们会受到想要尽快抓取这些页面的抓取机器人的攻击。有时,在一两分钟内,40-50 个 IP 每个会访问 20-30 个 URL。这些 IP 和服务器经常变化,不可能持续阻止它们。
目前,我们的路径 TTL 为 1 天,页面每天更新 4-5 次,这意味着我们经常被这些机器人攻击 600-700 个未缓存页面并导致后端停止而措手不及。
我们尝试过的事情:
此特定路径的宽限期较长,这会使事情变得更糟,因为这些机器人非常快地获得过期页面,它们请求的速度甚至更快,这使后端的情况变得更糟。 Varnish 有没有办法在宽限期内限制后端获取?
请求限制不起作用,因为它们通过将请求分布在多个 IP 上来分隔请求。
还可以采取哪些其他措施来保护后端免受突然激增的影响?我们被建议不要在每次更新时清除缓存,但如果我们由于担心机器人而无法更新内容,那就失去了运行网站的全部意义。
您可以从源代码编译 vmod_vsthrottle 并根据客户端 IP 或某些标头限制客户端。
这是基于该 VMOD 的示例 VCL 片段:
vcl 4.1;
import vsthrottle;
backend default {
.host = "192.0.2.11";
.port = "8080";
}
sub vcl_recv {
if (vsthrottle.is_denied(client.identity, 15, 10s, 30s)) {
# Client has exceeded 15 reqs per 10s.
# When this happens, block altogether for the next 30s.
return (synth(429, "Too Many Requests"));
}
}
Varnish Enterprise 有一个 Veribot 功能,可以检查
User-Agent
标头并对客户端 IP 执行反向 DNS 解析以验证是否接受。
这允许您创建允许和拒绝的机器人列表,其验证超出了基本的
User-Agent
检查(很容易伪造)。
此 Veribot 功能的输出可用于允许经过验证的机器人进行访问并阻止其他机器人。
虽然 Veribot 能够识别受信任的机器人(例如 Google 爬虫),但当发生缓存未命中时,即使是非恶意机器人也会对应用程序的性能产生不利影响。
使用 Veribot 阻止对不需要的机器人的访问,然后仍然对来自机器人和普通用户的请求进行速率限制。
vmod_vsthrottle
是开源的。您可以从https://github.com/varnish/varnish-modules下载它并编译源代码。
Veribot 是 Varnish Enterprise 的一部分,Varnish Enterprise 是一款商业产品。我们还将
vmod_vsthrottle
打包到我们的商业软件中。
如果您想了解更多信息,请联系我们:https://www.varnish-software.com/contact-us/。其中还有其他功能将有利于您的 Drupal 设置。