Posts
在 2025 年如何有效阻止恶意爬虫与扫描器
引言:给网站加把“智能锁”,挡住不速之客
2025 年了,如果你也感觉服务器日志里的爬虫和扫描越来越猖狂,那我们面临的是同一个问题。AI 大发展需要海量数据,导致内容抓取猛增;同时,自动化的安全扫描也从没停过。这对我们站长来说,意味着服务器压力增大、用户访问变慢,安全风险也实实在在摆在眼前。光靠传统的防火墙或者单一 WAF,感觉越来越力不从心了。
因此,我折腾出了一套多层防御的办法。思路很简单:层层过滤,各有侧重。这篇文章,我就想跟你聊聊我是怎么把 Caddy、Anubis 和雷池 WAF 这三个工具组合起来,给我的网站加上多道防线的。希望能给你一些实用的启发。
核心策略:纵深防御 (Defense in Depth)
面对复杂多变的自动化威胁,单一的防御点很容易被绕过。所以,核心思路是纵深防御——像建城堡一样,设置多道防线,每一层负责不同的拦截任务,增加攻击者的难度。
我的防御架构概览:
下面是我目前采用的架构流程:
[互联网流量] -> [Caddy (HTTPS 终止)] -> [WAF 层 1: Anubis (工作量证明)] -> [WAF 层 2: 雷池 WAF (语义分析)] -> [业务 Caddy (应用代理)] -> [后端应用]
接下来,我们一层层看它们都干了什么:
第一层:HTTPS 终结点与流量入口 - Caddy
-
角色: 作为整个服务架构的最前端,负责接收所有外部流量并处理 HTTPS。
-
工具: Caddy Web 服务器。
-
选择 Caddy 的理由: Caddy 最突出的优势在于其全自动化的 HTTPS 功能。它能够自动申请和续订 SSL/TLS 证书,尤其是通过 DNS 验证方式可以便捷地实现通配符证书的自动化管理,这极大地简化了以往相对繁琐的证书维护工作。作为入口,Caddy 确保了所有面向公网的通信都经过 TLS 加密。完成 TLS 握手和解密后,它将 HTTP 流量反向代理给下一层服务(这里是 Anubis WAF)。在内部服务间使用 HTTP 通信可以简化后续服务的配置,因为它们无需再处理 TLS。
-
资源: 关于 Caddy 的更多细节请参阅:Caddy 官网文档。
-
配置示例 (Caddyfile):
下面是一个 Caddyfile 配置示例,展示了如何为
inetech.fun及其所有子域名(通配符)自动申请 ZeroSSL 的通配符证书(使用腾讯云 DNSPod 进行 DNS 验证),并反向代理到运行在10.0.8.11:8923的 Anubis 服务:# 全局选项: 关闭管理 API { admin off } # 站点配置: 监听 inetech.fun 和 *.inetech.fun inetech.fun, *.inetech.fun { # TLS 配置 tls { # 使用 DNS 挑战,提供商为 tencentcloud (DNSPod) # API 密钥从环境变量读取,增强安全性 dns tencentcloud { secret_id {$TENCENT_SECRET_ID} secret_key {$TENCENT_SECRET_KEY} } # 强制使用 TLS 1.3 协议 protocols tls1.3 # 指定 ACME CA 为 ZeroSSL ca https://acme.zerossl.com/v2/DV90 # ZeroSSL 可能需要的 EAB 凭据,也从环境变量读取 eab {$ACME_EAB_ID} {$ACME_EAB_KEY} } # 启用响应压缩,优化传输效率 encode zstd gzip # 自定义响应头,增强安全性 header { # 移除默认的 Server 和 X-Powered-By 头,减少信息泄露 -Server -X-Powered-By # 可选:添加 HSTS 头,强制浏览器后续使用 HTTPS 访问,有效期一年 Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" } # 处理请求: 将所有请求反向代理到内部 Anubis 服务 # 注意:这里是 http://,表示 Caddy 将 HTTPS 流量解密后,以 HTTP 协议转发给 Anubis handle { reverse_proxy http://10.0.8.11:8923 } }说明:
- 请记得将示例中的
inetech.fun和reverse_proxy的目标地址替换为你自己的配置。 - 该配置通过环境变量(如
{$TENCENT_SECRET_ID})读取敏感凭证,请务必在运行 Caddy 前设置好相应的环境变量。 - 使用了
dns tencentcloud进行 DNS 挑战,确保你的 Caddy 已安装对应的 DNS 插件 (github.com/caddy-dns/tencentcloud)。若使用其他 DNS 服务商,需安装和配置相应插件。
- 请记得将示例中的
第二层:WAF 1 - “体力活”筛选器 - Anubis (工作量证明)
- 角色: 重点拦截那些“傻快猛”的自动化爬虫和低级扫描。
- 工具: Anubis WAF。
- 怎么工作: Anubis 的绝活是工作量证明 (Proof-of-Work, PoW)。它会给来访的客户端(浏览器或脚本)布置一点小小的计算任务。普通用户通过浏览器访问,这点计算几乎感觉不到。但对于那些想疯狂抓取或扫描的程序来说,每次请求都要计算,累积起来成本就高得吓人,能有效逼退它们。
- 注意事项: 不能一刀切。我们需要给搜索引擎(如 Googlebot, Bingbot)或者一些必要的 API 接口开白名单(通过 User-Agent 或特定 URL 路径),让它们可以跳过 PoW 检查,直接去下一关。Anubis 的配置通常涉及环境变量或配置文件,用于设定 PoW 难度、白名单规则以及上游服务地址(即雷池 WAF 的地址)。
- 资源: 如果你想尝试部署 Anubis,可以参考它的官方安装文档:Anubis 安装指南。
第三层:WAF 2 - “脑力活”检测器 - 雷池 WAF
- 角色: 捕获更“聪明”、更具针对性的攻击,识别恶意行为。
- 工具: 雷池 WAF (长亭科技出品,这里指社区版)。
- 怎么工作: 经过 Anubis 初步过滤后,到达这里的流量少了很多“噪音”。雷池 WAF 就能更专注地进行智能分析:
- 语义分析: 它不只是看关键词,而是能理解请求的意图,识别像 SQL 注入、XSS 跨站脚本这类藏得更深的攻击。
- 风险 IP 拦截: 内置了风险 IP 数据库,可以直接拒绝来自已知肉鸡、恶意代理 IP 的访问。
- 灵活规则: 通常也支持自定义规则,可以根据你的业务逻辑,设置更精细的防护策略。
- 配置要点: 雷池 WAF 通常有自己的 Web 管理界面,你需要在其管理界面中配置上游服务地址(指向 Anubis 或直接暴露的端口),并配置下游服务(指向你的业务 Caddy 或直接的应用)。同时,可以在界面中调整防护策略、查看日志、管理 IP 黑白名单等。
- 资源: 详细的安装部署步骤可以参考官方文档:雷池 WAF (社区版) 安装指南。
第四层:业务代理 - 业务 Caddy
- 角色: 把经过层层安检的“干净”流量,稳妥地送到最终的应用程序那里。
- 工具: 可以是另一个 Caddy 实例,或者 Nginx 等其他反向代理。
- 为什么需要: 这一层主要负责应用层面的路由、负载均衡等。把它和前面的安全层分开,可以让配置更清晰,方便管理。
- 配置示例 (概念): 这个 Caddy 的配置相对简单,主要就是监听一个内部端口(例如
localhost:8080),然后reverse_proxy到你的后端应用(如localhost:3000的 Node.js 应用,或php-fpm:9000的 PHP 应用等)。具体配置取决于你的后端技术栈。
为什么要这样“叠 WAF”?
- 1 + 1 > 2: Anubis 的 PoW 擅长挡“量”,雷池 WAF 擅长挡“质”,两者结合,防护面更广。
- 减轻负担: Anubis 在前面挡住了大量无效流量,大大减轻了雷池 WAF 的运算压力,让它可以更高效、更准确地工作。
- 增加攻击成本: 就算攻击者愿意花算力通过 PoW,后面还有雷池等着,层层设卡,提高了攻击的门槛和成本。
结语:组合防御,效果加倍
简单回顾一下我的这套“组合拳”:
- Caddy (入口): 负责搞定 HTTPS 加密,并将流量转给 Anubis。
- Anubis (第一道防线): 用“工作量证明”把大部分自动化脚本和低级爬虫拦在外面,将筛选后的流量转给雷池。
- 雷池 WAF (第二道防线): 精准识别复杂的攻击手法,比如 SQL 注入、XSS,还能挡掉已知的恶意 IP,将安全流量转给业务代理。
- Caddy (业务代理): 把经过筛选的“干净”流量交给后台应用处理。
这么做最大的好处是各司其职,效率更高。Anubis 用计算成本挡掉了绝大多数“噪音”流量,让后面的雷池 WAF 可以集中精力处理真正有威胁的请求。从我的实践来看,这套组合在拦截恶意流量和节省服务器资源方面,确实比单用一个 WAF 效果好不少。
当然,这只是我根据自己网站情况摸索出来的方案。你可能需要根据你的流量类型、业务特点和安全预算来调整工具或配置。但**“纵深防御”**这个核心思路是通用的——通过多层、不同机制的防护叠加,让攻击者更难得手。
希望我分享的这些踩坑和实践经验,能帮助你更好地武装自己的网站,从容应对日益复杂的网络环境。
Comments