Forward auth pour votre serveur
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
Classes de trafic
Chaque classe arrive dans votre application en X-IPScanner-Class. Autorisez, signalez ou bloquez-la par site dans le tableau de bord.
malicious_automation
ai_agent
tor
vpn
proxy
hosting
relay
verified_bot
human
Installation
Le plan gratuit suffit pour commencer.
IPSCANNER_API_KEY
pk_live_••••••••3f9a
Sur le même réseau Docker que votre proxy. Ne publiez pas son port.
services:
ipscanner:
image: ghcr.io/ipscanner/forward-auth:0.1
restart: unless-stopped
environment:
IPSCANNER_API_KEY: ${IPSCANNER_API_KEY}
SITE_ID: site_...SITE_IDLe tableau de bord porte alors la politique du site et affiche son trafic.
SITE_ID
site_4fQ8nZ2kLm7xR1vT9cBw
Choisissez votre serveur ci-dessous. Chaque extrait est testé de bout en bout.
Configuration 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
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
Définissez-les sur le conteneur. CACHE_TTL et POLICY_TTL acceptent aussi des valeurs comme 10m.
| Variable | Défaut | Rôle |
|---|---|---|
IPSCANNER_API_KEYVotre clé API. Sans elle, toutes les requêtes passentDéfaut:Vide | Vide | Votre clé API. Sans elle, toutes les requêtes passent |
IPSCANNER_API_KEY_FILELit la clé depuis un fichier, pour les secrets DockerDéfaut:Vide | Vide | Lit la clé depuis un fichier, pour les secrets Docker |
SITE_IDRelie la passerelle à un site et à sa politiqueDéfaut:Vide | Vide | Relie la passerelle à un site et à sa politique |
MODEmonitor ou enforce. Avec SITE_ID, le tableau de bord décide, sauf en monitorDéfaut:monitor | monitor | monitor ou enforce. Avec SITE_ID, le tableau de bord décide, sauf en monitor |
BLOCK_CLASSESClasses bloquées en mode enforce sans SITE_IDDéfaut:malicious_automation | malicious_automation | Classes bloquées en mode enforce sans SITE_ID |
TRUSTED_PROXIESProxys dont l'en-tête X-Forwarded-For est acceptéDéfaut:private | private | Proxys dont l'en-tête X-Forwarded-For est accepté |
IP_HEADERSEn-têtes lus pour l'IP du visiteur, dans l'ordreDéfaut:X-Forwarded-For | X-Forwarded-For | En-têtes lus pour l'IP du visiteur, dans l'ordre |
TIMEOUT_MSBudget par vérification, ensuite la requête passeDéfaut:1500 | 1500 | Budget par vérification, ensuite la requête passe |
CACHE_TTLSecondes de réutilisation d'un verdict par visiteurDéfaut:600 | 600 | Secondes de réutilisation d'un verdict par visiteur |
CACHE_SIZEVerdicts gardés en mémoireDéfaut:10000 | 10000 | Verdicts gardés en mémoire |
POLICY_TTLSecondes de réutilisation d'une politique de siteDéfaut:30 | 30 | Secondes de réutilisation d'une politique de site |
SKIP_PATHSRegex de chemin qui saute la vérificationDéfaut:Fichiers statiques | Fichiers statiques | Regex de chemin qui saute la vérification |
UPSTREAM_URLActive le mode proxy et transmet ici les requêtes autoriséesDéfaut:Vide | Vide | Active le mode proxy et transmet ici les requêtes autorisées |
LISTENAdresse d'écouteDéfaut::8080 | :8080 | Adresse d'écoute |
HEALTH_PATHPoint de contrôle de santéDéfaut:/healthz | /healthz | Point de contrôle de santé |
BLOCK_MESSAGETexte de la page 403Défaut:Blocked by IPScanner edge guard. | Blocked by IPScanner edge guard. | Texte de la page 403 |
IPSCANNER_API_URLURL de base de l'APIDéfaut:https://ipscanner.io | https://ipscanner.io | URL de base de l'API |
DEBUGUne ligne de log par décisionDéfaut:false | false | Une ligne de log par décision |
Conteneur
GET /healthz répond toujours 200 et indique ce que fait la passerelle.
{
"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
Questions
Lancez la passerelle, lisez une semaine de décisions, puis bloquez.