Forward auth para tu servidor

Bloquea bots, VPN y Tor en nginx, Apache y HAProxy

Un contenedor junto a tu servidor revisa cada solicitud en busca de bots, Tor, VPN y proxies. Empieza en modo monitor y no bloquea nada hasta que cambies.

Gratis, licencia MITDocker, amd64 y arm64

Un visitante de Tor llega a nginx, que consulta la pasarela de IPScanner, recibe un 403 y muestra su página de bloqueo. Una persona recibe un 200 y sigue hacia la app con los encabezados del veredicto. En modo proxy, para Apache y HAProxy, la pasarela va entre el servidor y la app, que queda de respaldo.
Enforce

Clases de tráfico

Qué puede bloquear

Cada clase llega a tu app como X-IPScanner-Class. Permítela, márcala o bloquéala por sitio en el panel.

  • Automatización maliciosa

    malicious_automation

  • Agente de IA

    ai_agent

  • Tor

    tor

  • VPN

    vpn

  • Proxy

    proxy

  • Alojamiento

    hosting

  • Relay privado

    relay

  • Bot verificado

    verified_bot

  • Humano

    human

Instalación

En marcha en cuatro pasos

  1. 1

    Crea una clave de API

    El plan gratis basta para empezar.

    IPSCANNER_API_KEY

    pk_live_••••••••3f9a

    Crea una clave de API gratis
  2. 2

    Ejecuta el contenedor

    En la misma red Docker que tu proxy. No publiques su puerto.

    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

    Añade un sitio y define SITE_ID

    El panel guarda entonces la política del sitio y muestra su tráfico.

    SITE_ID

    site_4fQ8nZ2kLm7xR1vT9cBw

    Añadir un sitio
  4. 4

    Añade el fragmento a tu servidor

    Elige tu servidor abajo. Cada fragmento está probado de punta a punta.

Configuración del servidor

Fragmentos para tu servidor

Copia el de tu configuración. Traefik y Caddy también funcionan con el mismo contenedor.

Va en tu bloque server. Inicia primero la pasarela: nginx resuelve ipscanner al arrancar.

Pasarela caída: pasan tras 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;
}

Ajustes

Variables de entorno

Defínelas en el contenedor. CACHE_TTL y POLICY_TTL también aceptan valores como 10m.

Variable
IPSCANNER_API_KEYTu clave de API. Sin ella, todas las solicitudes pasanPor defecto:Vacío
IPSCANNER_API_KEY_FILELee la clave de un archivo, para Docker secretsPor defecto:Vacío
SITE_IDVincula la pasarela a un sitio y su políticaPor defecto:Vacío
MODEmonitor o enforce. Con SITE_ID decide el panel, salvo con monitorPor defecto:monitor
BLOCK_CLASSESClases bloqueadas en modo enforce sin SITE_IDPor defecto:malicious_automation
TRUSTED_PROXIESProxies cuyo X-Forwarded-For se aceptaPor defecto:private
IP_HEADERSEncabezados leídos para la IP del visitante, en ordenPor defecto:X-Forwarded-For
TIMEOUT_MSTiempo por revisión; después la solicitud pasaPor defecto:1500
CACHE_TTLSegundos que se reutiliza un veredicto por visitantePor defecto:600
CACHE_SIZEVeredictos guardados en memoriaPor defecto:10000
POLICY_TTLSegundos que se reutiliza la política de un sitioPor defecto:30
SKIP_PATHSRegex de ruta que omite la revisiónPor defecto:Archivos estáticos
UPSTREAM_URLActiva el modo proxy y envía aquí las solicitudes permitidasPor defecto:Vacío
LISTENDirección de escuchaPor defecto::8080
HEALTH_PATHEndpoint de saludPor defecto:/healthz
BLOCK_MESSAGETexto de la página 403Por defecto:Blocked by IPScanner edge guard.
IPSCANNER_API_URLURL base de la APIPor defecto:https://ipscanner.io
DEBUGUna línea de log por decisiónPor defecto:false

Contenedor

Una imagen pequeña con health check

GET /healthz siempre responde 200 y muestra qué hace la pasarela.

  • Los rastreadores de búsqueda e IA verificados siempre pasan.
  • Si IPScanner va lento o no responde, las solicitudes pasan.
  • Tu clave de API nunca aparece en los 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
  • Menos de 4 MB
  • Sin root, sin shell

Preguntas

Preguntas sobre nginx, Apache y HAProxy

No. Es una revisión por solicitud de la IP y las señales de automatización del visitante, no un WAF de reglas que inspecciona payloads en busca de inyección SQL o XSS. Si necesitas uno, mantén tu WAF al lado.

Empieza en modo monitor

Ejecuta la pasarela, lee una semana de decisiones y luego bloquea.