Sign inSign up

firebotco/netix-waf

By firebotco

•Updated 4 months ago

NetIX WAF Security

Image
Networking
Security
API management
0

1.8K

firebotco/netix-waf repository overview

Web Application Firewall con Nginx, ModSecurity + OWASP CRS, GeoIP2, ZeroTier y API REST de administración.

Docker Hub


⁠Qué incluye

ComponenteDescripción
Nginx 1.30.2Con módulos dinámicos ModSecurity, GeoIP2, headers-more
ModSecurity v3WAF engine con OWASP CRS v4 (844+ reglas)
GeoIP2Filtrado de tráfico por país (MaxMind GeoLite2)
netix_modsecMotor de puntuación de amenazas con bloqueo automático vía ipset/iptables
waf-apiAPI REST en Go para administrar toda la configuración (puerto 10000)
ZeroTierRed P2P para gestión remota segura
certbotCertificados SSL automáticos con Let's Encrypt + auto-renovación
Error PagesPágina de error empresarial con tema auto dark/light
AntivirusAnálisis de archivos enviados vía POST,PUT,PATCH

⁠Despliegue rápido

⁠Opción 1: Docker Hub
docker run -d \
  --name netix-waf \
  --network host \
  --privileged \
  --restart unless-stopped \
  --pid host \
  -e WAF_API_KEY="$(openssl rand -hex 16)" \
  -v letsencrypt:/etc/letsencrypt \
  -v waf-data:/etc/waf-api \
  -v /var/log/nginx:/var/log/nginx \
  firebotco/netix-waf:latest
⁠Opción 2: docker-compose con imagen publicada
# docker-compose.yml
services:
  netix-waf:
    image: firebotco/netix-waf:latest
    container_name: netix-waf
    network_mode: host
    privileged: true
    restart: unless-stopped
    pid: host
    environment:
      - WAF_API_KEY=${WAF_API_KEY:-00000000000000000000000000000000}
    volumes:
      - letsencrypt:/etc/letsencrypt
      - waf-data:/etc/waf-api
      - /var/log/nginx:/var/log/nginx

volumes:
  letsencrypt:
  waf-data:
# Con API key personalizada
WAF_API_KEY="ea4f6eeba6b9dd8d19c98a1e0a607488" docker-compose up -d

# O sin variable (usa default)
docker-compose up -d
⁠Opción 3: Instalación directa (.deb) para Ubuntu Server
curl -fsSL https://distro.netix.app/install.sh | sudo bash

⁠Puertos

PuertoServicio
80nginx HTTP
443nginx HTTPS
10000waf-api REST

⁠API REST (waf-api)

Base URL: http://<host>:10000/api/v1

Auth: Header x-api-key: <32-char-hex-key> (configurable en /etc/waf-api/config.yaml)

Documentación completa: GET /api/v1/openapi.yml (importable en Postman, Insomnia, etc.)

⁠Endpoints
RecursoEndpoints
GeoIP CountriesGET/POST /geoip/countries, GET/PUT/DELETE /geoip/countries/{code}
Bot RulesGET/POST /bots/rules, GET/PUT/DELETE /bots/rules/{id}
Rate LimitGET/POST /ratelimit/zones, GET/PUT/DELETE /ratelimit/zones/{id}
Trusted IPsGET/POST /trusted-ips, DELETE /trusted-ips/{id}
ModSecurity RulesGET/POST /modsec/rules, GET/PUT/DELETE /modsec/rules/{id}
CORS OriginsGET/POST /cors/origins, GET/PUT/DELETE /cors/origins/{id}
BlacklistGET/POST /blacklist, DELETE /blacklist/{id}
DomainsGET/POST /domains, GET/PUT/DELETE /domains/{domain}
Domain LocationsGET/POST /domains/{domain}/locations, GET/PUT/DELETE /domains/{domain}/locations/{id}
SSL CertificatesPOST /domains/{domain}/ssl, POST /domains/{domain}/ssl/renew, POST /ssl/renew-all
ZeroTierGET/POST /zerotier/networks, GET/PUT/DELETE /zerotier/networks/{id}
MetricsGET /metrics
StatsGET /stats, GET /stats/top-attackers
⁠Ejemplos rápidos
# Ver info del API
curl http://localhost:10000/api/v1/

# Listar países permitidos
curl -H "x-api-key: YOUR_KEY" http://localhost:10000/api/v1/geoip/countries

# Crear un dominio proxy inverso
curl -X POST -H "x-api-key: YOUR_KEY" -H "Content-Type: application/json" \
  -d '{"domain":"mi.app.com","backend_ip":"127.0.0.1","backend_port":8080}' \
  http://localhost:10000/api/v1/domains

# Provisionar SSL
curl -X POST -H "x-api-key: YOUR_KEY" \
  http://localhost:10000/api/v1/domains/mi.app.com/ssl

# Ver métricas del sistema
curl -H "x-api-key: YOUR_KEY" http://localhost:10000/api/v1/metrics

# Agregar un location estático al dominio
curl -X POST -H "x-api-key: YOUR_KEY" -H "Content-Type: application/json" \
  -d '{"path":"/assets","location_type":"static","root_path":"/var/www/static"}' \
  http://localhost:10000/api/v1/domains/mi.app.com/locations

# Unirse a una red ZeroTier
curl -X POST -H "x-api-key: YOUR_KEY" -H "Content-Type: application/json" \
  -d '{"network_id":"952c4ef89420eb51","name":"NetIX Security"}' \
  http://localhost:10000/api/v1/zerotier/networks

⁠Seguridad L7

El WAF incluye protección multi-capa:

CapaTecnología
WAFModSecurity v3 + OWASP CRS v4 — 844 reglas contra SQLi, XSS, RCE, LFI/RFI
BotsDetección por User-Agent (21 reglas)
Rate LimitLímite de peticiones y conexiones por IP (4 zonas)
GeoIPBloqueo por país (23 países configurados)
Custom Rules39 reglas ModSecurity para DSpace, Koha, OJS, OMP
CORSControl de orígenes permitidos
IP ReputationScoring automático con bloqueo permanente/temporal
Error PagesPágina de error personalizada con tema auto dark/light, mensajes en español
Domain LocationsMúltiples locations por dominio (proxy inverso + static files)
SSL Auto-RenewalRenovación automática de certificados cada 75 días vía certbot
GeoIP2 DirectConsulta directa a base de datos GeoLite2-Country.mmdb vía mmdblookup

⁠netix_modsec — Anti False Positives

El motor de puntuación incluye 3 fases de protección contra falsos positivos:

FaseProtecciónDetalle
1Critical Rule suavizada1er hit → TEMP, 2do hit → PERM. +60 rangos CDN/Cloud nunca bloqueados
2Time-decay + diferenciaciónEventos antiguos pesan menos. Reglas de protocolo 5pts, ataque 15pts. Cap por detector
3Reputación + paísHistorial SQLite acelera reincidentes. IPs de países bloqueados +20 base. IPs privadas sin DDoS

⁠Proxy Template — 16 Optimizaciones

El template de dominio incluye optimizaciones de seguridad y rendimiento:

CategoríaMejoras
CORS/SeguridadCORS fuera de if, limit_except métodos, proxy_hide_header
ProxyX-Forwarded-Host/Port, proxy_redirect, proxy_cookie_domain
Performancetcp_nodelay, proxy_buffer_size 128k, proxy_socket_keepalive
Timeoutsproxy_next_upstream_tries 2, proxy_next_upstream_timeout 10s
WebSocketlocation /ws/ con timeout 3600s
SSLssl_ecdh_curve X25519:prime256v1 sin ML-KEM experimental

⁠SQLite — Rendimiento

La base de datos usa WAL mode + busy timeout para evitar bloqueos bajo escritura concurrente:

ParámetroValorPropósito
_journal_modeWALLectores y escritores no se bloquean entre sí
_busy_timeout5000msEspera 5s si hay contención de escritura
_synchronousNORMALEscritura más rápida
_cache_size-2000020MB de caché en RAM

⁠Bootstrap Data

Al iniciar por primera vez, la BD se precarga desde los archivos de configuración:

RecursoEntidadesArchivo origen
GeoIP23 paísesgeoip_access.conf
Bot Rules21 reglasbad_bots.conf
Rate Limit4 zonaslimit_req.conf
Trusted IPs1 CIDRtrusted-ips.list
ModSec Rules39 reglascustom_rules.conf
CORS1 origencors.conf
ZeroTier1 red952c4ef89420eb51

⁠Upstreams (proxy inverso)

Con network_mode: host, el contenedor comparte la red del host:

  • 127.0.0.1 dentro del contenedor = 127.0.0.1 del host
  • proxy_pass http://127.0.0.1:8080 alcanza servicios locales del host
  • proxy_pass http://192.168.1.100:3000 alcanza cualquier IP de la LAN

⁠Volúmenes

VolumenRutaContenido
letsencrypt/etc/letsencryptCertificados SSL
waf-data/etc/waf-apiBase de datos SQLite3 (configuración, IPs, dominios)
bind mount/var/log/nginxLogs de acceso y error

⁠Requisitos de ejecución

El contenedor necesita:

  • --network host — acceso a la red real del host para iptables y proxy inverso
  • --privileged — modificar iptables, crear ipsets, interfaces ZeroTier

⁠Variables de entorno

VariableDefaultDescripción
WAF_API_CONFIG/etc/waf-api/config.yamlRuta al archivo de configuración del API
WAF_API_KEY(config.yaml)API key de 32 caracteres hex. Generar con openssl rand -hex 16. Se inyecta en config.yaml al iniciar el contenedor

⁠Créditos

Desarrollado por: Alexander Rubio Cáceres

Email: [email protected]⁠

WhatsApp: +57 311 508 1919⁠

Tag summary

Content type

Image

Digest

sha256:a8ad18323…

Size

236.4 MB

Last updated

4 months ago

docker pull firebotco/netix-waf