為您的伺服器提供 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 模式開始

運行閘道,觀察一星期的判定,再開始攔截。