Forward auth pour votre serveur

Bloquez bots, VPN et Tor dans nginx, Apache et HAProxy

Un conteneur à côté de votre serveur vérifie chaque requête : bots, Tor, VPN et proxys. Il démarre en mode monitor et ne bloque rien tant que vous ne basculez pas.

Gratuit, licence MITDocker, amd64 et arm64

Un visiteur Tor atteint nginx, qui interroge la passerelle IPScanner, reçoit un 403 et affiche sa page de blocage. Une personne reçoit un 200 et continue vers l'application avec les en-têtes de verdict. En mode proxy, pour Apache et HAProxy, la passerelle se place entre le serveur et l'application, qui reste en secours.
Enforce

Classes de trafic

Ce qu'elle peut bloquer

Chaque classe arrive dans votre application en X-IPScanner-Class. Autorisez, signalez ou bloquez-la par site dans le tableau de bord.

  • Automatisation malveillante

    malicious_automation

  • Agent IA

    ai_agent

  • Tor

    tor

  • VPN

    vpn

  • Proxy

    proxy

  • Hébergement

    hosting

  • Relais privé

    relay

  • Robot vérifié

    verified_bot

  • Humain

    human

Installation

En ligne en quatre étapes

  1. 1

    Créez une clé API

    Le plan gratuit suffit pour commencer.

    IPSCANNER_API_KEY

    pk_live_••••••••3f9a

    Créer une clé API gratuite
  2. 2

    Lancez le conteneur

    Sur le même réseau Docker que votre proxy. Ne publiez pas son port.

    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

    Ajoutez un site et définissez SITE_ID

    Le tableau de bord porte alors la politique du site et affiche son trafic.

    SITE_ID

    site_4fQ8nZ2kLm7xR1vT9cBw

    Ajouter un site
  4. 4

    Ajoutez l'extrait à votre serveur

    Choisissez votre serveur ci-dessous. Chaque extrait est testé de bout en bout.

Configuration serveur

Extraits pour votre serveur

Copiez celui de votre configuration. Traefik et Caddy passent aussi par le même conteneur.

À placer dans votre bloc server. Lancez d'abord la passerelle : nginx résout ipscanner au démarrage.

Passerelle arrêtée : passage après 1 s

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;
}

Réglages

Variables d'environnement

Définissez-les sur le conteneur. CACHE_TTL et POLICY_TTL acceptent aussi des valeurs comme 10m.

Variable
IPSCANNER_API_KEYVotre clé API. Sans elle, toutes les requêtes passentDéfaut:Vide
IPSCANNER_API_KEY_FILELit la clé depuis un fichier, pour les secrets DockerDéfaut:Vide
SITE_IDRelie la passerelle à un site et à sa politiqueDéfaut:Vide
MODEmonitor ou enforce. Avec SITE_ID, le tableau de bord décide, sauf en monitorDéfaut:monitor
BLOCK_CLASSESClasses bloquées en mode enforce sans SITE_IDDéfaut:malicious_automation
TRUSTED_PROXIESProxys dont l'en-tête X-Forwarded-For est acceptéDéfaut:private
IP_HEADERSEn-têtes lus pour l'IP du visiteur, dans l'ordreDéfaut:X-Forwarded-For
TIMEOUT_MSBudget par vérification, ensuite la requête passeDéfaut:1500
CACHE_TTLSecondes de réutilisation d'un verdict par visiteurDéfaut:600
CACHE_SIZEVerdicts gardés en mémoireDéfaut:10000
POLICY_TTLSecondes de réutilisation d'une politique de siteDéfaut:30
SKIP_PATHSRegex de chemin qui saute la vérificationDéfaut:Fichiers statiques
UPSTREAM_URLActive le mode proxy et transmet ici les requêtes autoriséesDéfaut:Vide
LISTENAdresse d'écouteDéfaut::8080
HEALTH_PATHPoint de contrôle de santéDéfaut:/healthz
BLOCK_MESSAGETexte de la page 403Défaut:Blocked by IPScanner edge guard.
IPSCANNER_API_URLURL de base de l'APIDéfaut:https://ipscanner.io
DEBUGUne ligne de log par décisionDéfaut:false

Conteneur

Une petite image avec contrôle de santé

GET /healthz répond toujours 200 et indique ce que fait la passerelle.

  • Les robots de recherche et d'IA vérifiés passent toujours.
  • Si IPScanner est lent ou indisponible, les requêtes passent.
  • Votre clé API n'apparaît jamais dans les logs.
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
  • Moins de 4 Mo
  • Sans root, sans shell

Questions

FAQ nginx, Apache et HAProxy

Non. C'est une vérification par requête de l'IP et des signaux d'automatisation du visiteur, pas un WAF à règles qui inspecte les payloads à la recherche d'injections SQL ou de XSS. Si vous en avez besoin, gardez votre WAF à côté.

Commencez en mode monitor

Lancez la passerelle, lisez une semaine de décisions, puis bloquez.