Traefik 插件
机器人、Tor、VPN 和代理,每个路由只需一个标签即可检测。默认以 Monitor 模式运行,切换前不会拦截任何请求。
免费,MIT 许可证已在 Traefik v3.7 上测试
入口点
websecure:443路由
app@dockerHost(`example.com`)中间件
gzip@dockeripscanner@docker真人放行服务
app@docker200X-IPScanner-Class: humanX-IPScanner-Action: allow访问日志
流量类别
每位访客都会被归入一个类别,您的服务通过 X-IPScanner-Class 收到它。
安装
environment:
IPSCANNER_API_KEY: pk_live_...写入静态配置,或使用两个 CLI 参数,然后重启 Traefik。
experimental:
plugins:
ipscanner:
moduleName: github.com/ipscanner/ipscanner-traefik
version: v0.1.0traefik.http.middlewares.ipscanner.plugin.ipscanner.siteId=site_...其他路由可以通过 ipscanner@docker 复用它。
traefik.http.routers.app.middlewares=ipscanner您的技术栈
无论 Traefik 从哪里读取配置,都是同一个插件。
command:
# ...the flags Coolify set
- '--experimental.plugins.ipscanner.modulename=github.com/ipscanner/ipscanner-traefik'
- '--experimental.plugins.ipscanner.version=v0.1.0'
environment:
- IPSCANNER_API_KEY=pk_live_...traefik.http.middlewares.ipscanner-myapp.plugin.ipscanner.siteId=site_...
traefik.http.routers.https-0-<uuid>.middlewares=gzip,ipscanner-myapp每个应用使用一个独立的中间件名称,并追加到 Coolify 生成的每个路由上。如果站点在 Cloudflare 之后,还需设置 trustedProxies=cloudflare 和 ipHeaders=CF-Connecting-IP。
services:
traefik:
image: traefik:v3.7
command:
- --providers.docker=true
- --entrypoints.web.address=:80
- --experimental.plugins.ipscanner.modulename=github.com/ipscanner/ipscanner-traefik
- --experimental.plugins.ipscanner.version=v0.1.0
environment:
IPSCANNER_API_KEY: ${IPSCANNER_API_KEY}
ports: ["80:80"]
volumes: ["/var/run/docker.sock:/var/run/docker.sock:ro"]
app:
image: traefik/whoami:v1.11.0
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`example.com`)
- traefik.http.routers.app.middlewares=ipscanner
- traefik.http.middlewares.ipscanner.plugin.ipscanner.siteId=site_...Dokploy 和普通 Compose 读取相同的标签。
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: ipscanner
spec:
plugin:
ipscanner:
apiKey: urn:k8s:secret:ipscanner:apiKey
siteId: site_...在 IngressRoute 中引用,或在 Ingress 上使用 router.middlewares 注解。
http:
middlewares:
ipscanner:
plugin:
ipscanner:
apiKeyFile: /run/secrets/ipscanner_api_key
siteId: site_...密钥来自挂载的 Docker 或 Kubernetes Secret。
站点控制台
在控制台中为每个类别选择允许、标记或拦截。中间件会在 30 秒内应用更改。
策略
选项
在中间件上设置:通过标签、YAML 或 CRD。
| 选项 | 默认值 | 作用 |
|---|---|---|
siteId控制台中的站点,模式和策略由它决定 | 空 | 控制台中的站点,模式和策略由它决定 |
mode未设置 siteId 时使用 monitor 或 enforce | monitor | 未设置 siteId 时使用 monitor 或 enforce |
blockClasses未设置 siteId 时 enforce 模式下拦截的类别 | malicious_automation | 未设置 siteId 时 enforce 模式下拦截的类别 |
trustedProxies可信任其 IP 请求头的代理:CIDR、private、cloudflare | 空 | 可信任其 IP 请求头的代理:CIDR、private、cloudflare |
ipHeaders按顺序从可信代理读取的请求头 | X-Forwarded-For | 按顺序从可信代理读取的请求头 |
timeout单次检测的时限,超时后请求放行 | 1500ms | 单次检测的时限,超时后请求放行 |
cacheTTL每位访客的判定缓存 | 10m | 每位访客的判定缓存 |
cacheSize缓存中保留的访客数 | 10000 | 缓存中保留的访客数 |
policyTTL已获取策略的有效时长 | 30s | 已获取策略的有效时长 |
skipPaths跳过检测的路径正则 | 静态资源 | 跳过检测的路径正则 |
apiKeyFile存放 API 密钥的文件,用于 Secret | 空 | 存放 API 密钥的文件,用于 Secret |
debug在响应中添加请求头并记录每次判定 | false | 在响应中添加请求头并记录每次判定 |
常见问题