最近在看 Docker 和建站相关的技术讨论时,经常有朋友问到同一个问题:Caddy 这款现代化的 Web 服务器,到底该怎么“套”一层 WAF(Web 应用防火墙)?

WAF反向代理架构示意图

用户请求通过 WAF 节点清洗后转发至 Caddy 业务节点的架构示意

确实,Caddy 凭借默认的 HTTPS 和极简的 Caddyfile 配置圈粉无数,但在安全防护这块,大家还是习惯加上一道防线。今天就借着这个话题,聊聊几种常见的实现思路,从简单到复杂,总有一款适合你。

Cloudflare WAF 云安全模式

利用 Cloudflare CDN 实现云端 WAF 防护,减轻源站压力

方案一:利用反向代理“缝合” WAF

这是最通用、最稳妥的方案。不管你是用 Nginx、OpenResty 还是专门的 WAF 软件(如 ModSecurity、CrowdSec),本质上都可以把它们放在 Caddy 前面或者后面。

架构思路: 用户请求 -> WAF 节点(Nginx/Caddy+插件)-> Caddy 业务节点。

如果 WAF 是基于 Nginx 的(比如非常流行的 ModSecurity + OWASP CRS),你可以这样做:

  1. 部署一个 Nginx 实例,安装配置好 ModSecurity。
  2. 将域名解析指向 Nginx 服务器的 IP。
  3. 在 Nginx 中配置 proxy_pass,把清洗过的流量转发给你的后端 Caddy 服务器(可以是同机不同端口,也可以是内网其他机器)。

优点: 解耦,WAF 挂了不影响 Caddy 运行,且方案成熟,资料多。 缺点: 多了一层跳转,延迟稍微增加一点点,但也就在毫秒级,基本无感。

方案二:使用 Caddy 的安全类插件

Caddy 的生态其实很强,有一些社区插件能直接在 Caddy 内部实现类似 WAF 的功能。如果你的需求主要是防 SQL 注入、XSS 或者简单的 CC 攻击,尝试这些插件会更轻量。

推荐尝试:

  • Caddy-CrowdSec-Plugin:这是一个非常给力的方案。CrowdSec 本身是一个 collaborative IPS(入侵防御系统),配合 Caddy 的这个插件,可以直接在 Caddy 层面拦截恶意 IP,并且享受全球社区的威胁情报。
  • 基本限流与访问控制:其实不需要复杂的 WAF,合理利用 Caddy 自身的 basicauthip 过滤和高性能的 rate_limit 插件,就能挡住 90% 的脚本小子。

配置示例(伪代码):

example.com {
    route {
        crowdsec bouncer_key "YOUR_API_KEY"
        ...
    }
}

注意: 使用插件意味着你需要启用 XCaddy 重新编译 Caddy,或者使用已经集成了插件的 Docker 镜像,这点对于新手来说稍微需要花点时间折腾。

方案三:基于 Cloudflare 的“云 WAF”模式

如果你的站点本身就是公网访问,不妨换个角度:为什么非要在服务器上“套” WAF?

直接把 Cloudflare(CF)套在域名前面,利用 CF 的 WAF 规则引擎、防火墙规则和 PageShield,这往往是个人站主性价比最高的方案。

操作流程:

  1. 域名 DNS 托管到 Cloudflare。
  2. 开启 "Proxied"(小黄云)模式。
  3. 在 CF 后台配置 WAF 规则(比如拦截特定 User-Agent、国家代码或者恶意路径)。
  4. 源站服务器(Caddy)只允许 Cloudflare 的 IP 段访问(配合 Caddy 的 ip 过滤),避免源头被打。

这才是真正的“套”法,省去了服务器 CPU 跑规则的压力,让专业的云厂商抗流量,Caddy 安心代理后端服务即可。

总结

如果你只是想防防简单的恶意扫描,方案二(插件) 或者 Caddy 自带的 ACL/Rate Limit 就够了;如果你是业务敏感,需要企业级防护,方案一(反向 proxy 到 Nginx+ModSecurity) 是标准操作;而如果你追求省事和高防 DDoS 能力,方案三(Cloudflare CDN) 绝对是首选。

大家平时都用什么姿势给 Caddy 加防?欢迎在评论区分享你的实战配置!

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭