为您的服务器提供 Forward Auth

在 nginx、Apache 和 HAProxy 中拦截机器人、VPN 与 Tor

服务器旁的一个容器检测每个请求中的机器人、Tor、VPN 和代理。默认以 Monitor 模式启动,在您切换之前不会拦截任何请求。

免费,MIT 许可证Docker,amd64 和 arm64

Tor 访客到达 nginx,nginx 询问 IPScanner 网关,收到 403 并显示网关的拦截页面。真人访客收到 200,带着判定标头继续访问应用。在代理模式下(Apache 和 HAProxy),网关位于服务器与应用之间,应用作为备用。
Enforce

流量类别

可以拦截哪些流量

每个类别都以 X-IPScanner-Class 传给您的应用。可在控制台中按站点允许、标记或拦截。

  • 恶意自动化

    malicious_automation

  • AI 代理

    ai_agent

  • Tor

    tor

  • VPN

    vpn

  • 代理

    proxy

  • 主机托管

    hosting

  • 隐私中继

    relay

  • 已验证机器人

    verified_bot

  • 真人

    human

安装

四步上线

  1. 1

    创建 API 密钥

    免费套餐即可开始。

    IPSCANNER_API_KEY

    pk_live_••••••••3f9a

    创建免费 API 密钥
  2. 2

    运行容器

    与代理位于同一 Docker 网络。不要对外公开其端口。

    docker-compose.yml
    services:
      ipscanner:
        image: ghcr.io/ipscanner/forward-auth:0.1
        restart: unless-stopped
        environment:
          IPSCANNER_API_KEY: ${IPSCANNER_API_KEY}
          SITE_ID: site_...
  3. 3

    添加站点并设置 SITE_ID

    之后控制台会保存站点策略并显示其流量。

    SITE_ID

    site_4fQ8nZ2kLm7xR1vT9cBw

    添加站点
  4. 4

    将配置片段加入服务器

    在下方选择您的服务器。每个片段都经过端到端测试。

服务器配置

服务器配置片段

复制适合您环境的片段。Traefik 和 Caddy 也可以通过同一个容器接入。

放入 server 块。请先启动网关:nginx 在启动时解析 ipscanner。

网关停止:1 秒后放行

nginx.conf
location / {
    auth_request /_ipscanner;
    auth_request_set $ipscanner_status     $upstream_http_x_ipscanner_status;
    auth_request_set $ipscanner_class      $upstream_http_x_ipscanner_class;
    auth_request_set $ipscanner_action     $upstream_http_x_ipscanner_action;
    auth_request_set $ipscanner_network    $upstream_http_x_ipscanner_network_class;
    auth_request_set $ipscanner_anonymized $upstream_http_x_ipscanner_anonymized;
    auth_request_set $ipscanner_risk       $upstream_http_x_ipscanner_risk;
    auth_request_set $ipscanner_country    $upstream_http_x_ipscanner_country;
    auth_request_set $ipscanner_site       $upstream_http_x_ipscanner_site;
    auth_request_set $ipscanner_request_id $upstream_http_x_ipscanner_request_id;
    error_page 403 = @ipscanner_blocked;

    proxy_set_header X-IPScanner-Status        $ipscanner_status;
    proxy_set_header X-IPScanner-Class         $ipscanner_class;
    proxy_set_header X-IPScanner-Action        $ipscanner_action;
    proxy_set_header X-IPScanner-Network-Class $ipscanner_network;
    proxy_set_header X-IPScanner-Anonymized    $ipscanner_anonymized;
    proxy_set_header X-IPScanner-Risk          $ipscanner_risk;
    proxy_set_header X-IPScanner-Country       $ipscanner_country;
    proxy_set_header X-IPScanner-Site          $ipscanner_site;
    proxy_set_header Host                      $host;
    proxy_set_header X-Forwarded-For           $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto         $scheme;
    proxy_pass http://app:80;
}

location = /_ipscanner {
    internal;
    proxy_pass http://ipscanner:8080/check;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Original-URI $request_uri;
    proxy_set_header X-Original-Method $request_method;
    proxy_connect_timeout 1s;
    proxy_read_timeout 5s;
    error_page 500 502 503 504 = @ipscanner_down;
}

location @ipscanner_down {
    return 204;
}

location @ipscanner_blocked {
    internal;
    proxy_method GET;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-IPScanner-Request-Id $ipscanner_request_id;
    rewrite ^ /blocked break;
    proxy_pass http://ipscanner:8080;
}

设置

环境变量

在容器上设置。CACHE_TTL 和 POLICY_TTL 也接受 10m 这样的值。

变量
IPSCANNER_API_KEY您的 API 密钥。未设置时所有请求直接放行默认值:空
IPSCANNER_API_KEY_FILE从文件读取密钥,适用于 Docker secrets默认值:空
SITE_ID将网关关联到站点及其策略默认值:空
MODEmonitor 或 enforce。设置 SITE_ID 后由控制台决定,monitor 除外默认值:monitor
BLOCK_CLASSES未设置 SITE_ID 时,enforce 模式下拦截的类别默认值:malicious_automation
TRUSTED_PROXIES信任其 X-Forwarded-For 的代理默认值:private
IP_HEADERS按顺序读取访客 IP 的标头默认值:X-Forwarded-For
TIMEOUT_MS每次检测的时限,超时后放行默认值:1500
CACHE_TTL每位访客判定结果的缓存秒数默认值:600
CACHE_SIZE内存中保留的判定数量默认值:10000
POLICY_TTL站点策略的缓存秒数默认值:30
SKIP_PATHS跳过检测的路径正则默认值:静态资源
UPSTREAM_URL开启代理模式,并将放行的请求转发到此处默认值:空
LISTEN监听地址默认值::8080
HEALTH_PATH健康检查端点默认值:/healthz
BLOCK_MESSAGE403 页面的文字默认值:Blocked by IPScanner edge guard.
IPSCANNER_API_URLAPI 基础 URL默认值:https://ipscanner.io
DEBUG每个决定记录一行日志默认值:false

容器

小巧的镜像,自带健康检查

GET /healthz 始终返回 200,并显示网关当前的状态。

  • 经过验证的搜索引擎和 AI 爬虫始终放行。
  • IPScanner 响应慢或不可用时,请求照常通过。
  • API 密钥永远不会写入日志。
GET /healthz
{
  "status": "ok",
  "version": "0.1.0",
  "mode": "forward_auth",
  "enabled": true,
  "site": "site_4fQ8nZ2kLm7xR1vT9cBw",
  "backoff": false,
  "policyMode": "monitor",
  "policyVersion": 3,
  "cachedVerdicts": 128
}

ghcr.io/ipscanner/forward-auth:0.1

  • linux/amd64
  • linux/arm64
  • 小于 4 MB
  • 非 root,无 shell

常见问题

nginx、Apache 和 HAProxy 常见问题

不是。它按请求检查访客的 IP 和自动化信号,而不是检查请求内容中 SQL 注入或 XSS 的规则型 WAF。如有需要,可与现有 WAF 同时使用。

从 Monitor 模式开始

运行网关,观察一周的判定,再开始拦截。