Caddy 模块

拦截机器人、VPN 与 Tor 的 Caddy 模块

在站点块中加入一条 ipscanner 指令,每位访客都会在 reverse_proxy 之前接受检测。默认以 Monitor 模式运行,切换前不会拦截任何请求。

免费,MIT 许可证Caddy 2.8+

流量类别

可以拦截哪些流量

每位访客对应一个类别。可在控制台中拦截某个类别,也可写入 block_classes。

  • 真人human
  • 已验证机器人verified_bot始终放行
  • AI 代理ai_agent
  • 恶意自动化malicious_automationEnforce 默认
  • Tortor
  • VPNvpn
  • 代理proxy
  • 主机托管hosting
  • 隐私中继relay

安装

四步上线

  1. 1

    获取 API 密钥

    Caddy 从 IPSCANNER_API_KEY 读取,也可在 Caddyfile 中用 api_key 设置。

    创建免费 API 密钥
    shell
    export IPSCANNER_API_KEY=<your API key>
  2. 2

    编译带模块的 Caddy

    使用 xcaddy 或在 Docker 中构建。需要 Caddy 2.8 或更高版本。

    xcaddy build --with github.com/ipscanner/ipscanner-caddy
    ./caddy list-modules | grep ipscanner
  3. 3

    在控制台中添加站点

    站点保存策略并显示流量。复制它的 Site ID。

    添加站点
    example.comCaddyMonitor

    Site ID

    site_4fQ8nZ2kLm7xR1vT9cBw

  4. 4

    添加指令

    无需全局 order 行:它在 basic_auth 和 reverse_proxy 之前运行。

    Caddyfile
    example.com {
    	ipscanner {
    		site_id site_4fQ8nZ2kLm7xR1vT9cBw
    	}
    	reverse_proxy localhost:8080
    }

不使用站点

Caddyfile 或 JSON

在配置中设置模式和要拦截的类别。ipscanner /app/* 这样的匹配器可将检测限定在部分路径。

example.com {
	ipscanner {
		mode enforce
		block_classes malicious_automation tor
	}
	reverse_proxy localhost:8080
}

占位符

在日志和匹配器中使用判定结果

由指令设置,可用于 log_append、vars 匹配器和请求头。

占位符
{http.vars.ipscanner.status}ok, error, timeout, backoff, skipped
{http.vars.ipscanner.class}流量类别,状态为 ok 时设置
{http.vars.ipscanner.action}allow, flag, block, would_flag, would_block
Caddyfile
log_append ipscanner_class {http.vars.ipscanner.class}
log_append ipscanner_action {http.vars.ipscanner.action}

@flagged vars ipscanner.action flag
request_header @flagged X-Review 1

客户端 IP

位于负载均衡或 CDN 之后

模块检测 Caddy 解析出的客户端 IP。请信任您的代理,trusted_proxies_strict 可防止访客伪造中间跳。

Caddyfile
{
	servers {
		trusted_proxies static 10.0.0.0/8
		trusted_proxies_strict
	}
}

设置

子指令

均为可选项。JSON 配置使用相同的名称。

子指令默认值
api_keyAPI 密钥。未设置时所有请求放行。{env.IPSCANNER_API_KEY}
site_id控制台中的站点,决定模式和策略。空
modemonitor 或 enforce。设置站点后仅 monitor 生效。monitor
block_classes未设置站点时,Enforce 模式下拦截的类别。malicious_automation
timeout单次检测的时间上限。1.5s
cache_ttl每位访客的判定缓存时长。10m
cache_size判定缓存条目数。10000
policy_ttl站点策略的缓存时长。30s
skip_paths不检测的路径(正则表达式)。静态资源
block_message403 页面的文字。Blocked by IPScanner edge guard.
debug调试响应头,并为每次判定记录一行日志。关闭
api_urlAPI 基础 URL。https://ipscanner.io

始终放行

永不拦截的流量

  • 经过验证的搜索引擎和 AI 爬虫。
  • 私有地址、回环地址和 OPTIONS 请求。
  • 静态资源和 skip_paths 中的路径。
  • IPScanner 响应慢或不可用时的所有请求。

常见问题

Caddy 模块常见问题

不会。Monitor 模式将请求标记为 would_block 并放行。确认日志无误后,再将站点或 Caddyfile 切换为 Enforce。

从 Monitor 模式开始

编译带模块的 Caddy,观察一周的判定,再开始拦截。