Cómo instalar Mastodon en Docker - Red social descentralizada en Docker

Imagen
Mastodon | Fediverse | Docker Mastodon: Red social descentralizada y autohospedada en Docker Alternativa open source a Twitter con federación. Crea tu propia instancia de Mastodon completamente descentralizada, sin anuncios, sin algoritmos secretos, en tu propio servidor. ¿Qué es Mastodon? Mastodon es una red social descentralizada y de código abierto basada en ActivityPub, el protocolo federado de redes sociales. Es una alternativa completa a Twitter donde tú eres el dueño de tu instancia, tus datos, y tu comunidad. No hay anuncios, no hay algoritmo oculto, no hay tracking corporativo. La magia de Mastodon es la federación : múltiples servidores independientes funcionan como una red conectada. Puedes seguir a usuarios de otros servidores, interactuar con ellos, y formar comunidades. Es como correo electrónico: tu email está en Gmail pero puedes escribir a usuarios en Outlook. Con Mastodon, tú hospeadas tu propia insta...

Cómo configurar Nginx Proxy Manager + Fail2Ban + GeoIP2

Nginx Proxy Manager | Fail2Ban | GeoIP2

Securización total de Nginx Proxy Manager con Fail2Ban y GeoIP2

Protege tus servicios Docker expuestos a Internet con bloqueo geográfico automatizado, detección de intrusiones y filtrado de IPs maliciosas. Privacidad y control total desde tu servid or.

¿Por qué securizar Nginx Proxy Manager?




Nginx Proxy Manager (NPM)
es una herramienta poderosa para gestionar proxies inversos, certificados SSL y dominios de forma visual. Sin embargo, al exponer puertos 80/4 43 a Internet, tu infraestructura queda expuesta a una amplia gama de amenazas: ataques de fuerza bruta, escaneos automatizados, bots maliciosos y accesos desde países con alto índice de cibe rataques.

La solución: Implementar una capa de seguridad proactiva que combine filtrado geográfico (GeoIP2) con bloqueo automático de IPs (Fail2Ban). Esto permite bloquear tráfic o no deseado antes de que llegue a tus servicios, reduciendo drásticamente la superficie de ataque.

Defensa en profundidad: GeoIP2 bloquea países no deseados a nivel de red. Fail2Ban detecta patrones de ataque y banea IPs dinámicamente. Juntos forman una barrera robus ta y configurable al 100%.

Componentes de la solución

Nginx Proxy Manager

Proxy inverso con interfaz web intuitiva. Gestión visual de hosts, SSL y redirecciones.

Fail2Ban

Monitorea logs y banea IPs tras intentos fallidos. Reglas personalizables y notificaciones.

GeoIP2 (MaxMind)

Base de datos GeoLite2-Country para filtrar tráfico por país en tiempo real via nginx.

Filtrado proactivo

Bloquea países enteros antes de que lleguen a tu aplicación. Reduce carga y riesgos.

Bloqueo reactivo

Fail2Ban analiza logs en tiempo real y banea IPs que intentan ataques o escaneos.

Logs centralizados

Todos los intentos quedan registrados para auditoría y análisis forense detallado.

Actualizaciones automáticas

Base de datos GeoIP2 se actualiza semanalmente. Reglas Fail2Ban se recargan dinámicamente.

100% Open Source

Ninguna dependencia de terceros o servicios en la nube. Control total sobre tu seguridad.

Docker Compose

Despliegue unificado y reproducible. Fácil mantenimiento y escalabilidad futura.

Compatibilidad

Compatible con cualquier servicio backend: Home Assistant, Nextcloud, Plex, etc.

Notificaciones

Configura alertas email, Telegram o Discord cuando se produce un baneo de IP.

Whitelist flexible

Define excepciones por IP, red o país. Nunca bloquearás accidentalmente tu acceso.

Requisitos del sistema

  • Docker y Docker Compose instalados (v2.0.0+)
  • 1-2 GB de RAM para el stack completo (NPM + Fail2Ban + geoipupdate)
  • 10+ GB de espacio para logs, base de datos GeoIP y certificados SSL
  • Puertos 80/443 disponibles y redirigidos en el router/firewall
  • Cuenta gratuita en MaxMind para descargar GeoLite2-Country (license key)
  • Opcional: Notificaciones email/Telegram configuradas para alertas Fail2Ban
Importante: Fail2Ban en Docker requiere privilegios adicionales para manipular iptables. Asegúrate de ejecutar el contenedor con cap_add: [NET_ADMIN] o mod o privileged: true según tu entorno.

Instalación con Docker Compose

Paso 1: Crea tu archivo docker-compose.yml

# Docker Compose para NPM + Fail2Ban + GeoIP2 version: '3.8' services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: # These ports are in format : - '80:80' # Public HTTP Port - '443:443' # Public HTTPS Port - '81:81' # Admin Web Port volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt # Monta volumen compartido para logs accesibles por Fail2Ban - ./nginx-logs:/var/log/nginx:ro environment: - DB_SQLITE_FILE=/data/database.sqlite networks: - npm-net fail2ban: image: crazymax/fail2ban:latest restart: unless-stopped cap_add: - NET_ADMIN - NET_RAW volumes: - ./fail2ban-data:/data # Lee logs de NPM desde el volumen compartido - ./nginx-logs:/nginx-logs:ro - ./fail2ban-jail.local:/etc/fail2ban/jail.local - ./fail2ban-filters:/etc/fail2ban/filter.d environment: - TZ=Europe/Madrid - F2B_LOG_LEVEL=INFO - F2B_DB_FILE=/data/fail2ban.sqlite3 networks: - npm-net geoipupdate: image: maxmindinc/geoipupdate:latest restart: unless-stopped volumes: - ./geoip-data:/usr/share/GeoIP environment: - GEOIPUPDATE_ACCOUNT_ID_FILE=/run/secrets/geoip_account_id - GEOIPUPDATE_LICENSE_KEY_FILE=/run/secrets/geoip_license_key - GEOIPUPDATE_EDITION_IDS=GeoLite2-Country - GEOIPUPDATE_FREQUENCY=168 # Actualizar cada semana (168 horas) networks: - npm-net networks: npm-net: driver: bridge

Paso 2: Configura Fail2Ban

Crea el archivo fail2ban-jail.local:

[DEFAULT] # Dirección de email para notificaciones (opcional) destemail = admin@tudominio.com sender = fail2ban@tudominio.com action = %(action_mwl)s [nginx-npm] enabled = true port = 80,443 filter = nginx-npm logpath = /nginx-logs/proxy-host-*.log maxretry = 3 bantime = 3600 findtime = 600

Crea el filtro personalizado en fail2ban-filters/nginx-npm.conf:

[Definition] failregex = ^ .* "(GET|POST|HEAD).*HTTP.*" (401|403|404|444) .* ignoreregex =

Paso 3: Configura GeoIP2 en Nginx

Crea/modifica el archivo data/nginx/custom/server_proxy.conf en el volumen de NPM:

# Carga el módulo GeoIP2 y define el mapeo por país load_module modules/ngx_http_geoip2_module.so; geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb { $geoip2_data_country_code country iso_code; } map $geoip2_data_country_code $allowed_country { default no; ES yes; # España FR yes; # Francia DE yes; # Alemania # Añade más países permitidos según necesites } server { if ($allowed_country = no) { return 444; } # ... resto de configuración del server }

Paso 4: Iniciar los servicios

# Descarga imágenes y levanta contenedores docker compose up -d # Verifica que todos los contenedores están corriendo docker compose ps # Ver logs de Fail2Ban en tiempo real docker compose logs -f fail2ban

Acceso

Abre http://localhost:81 para acceder al panel de administración de Nginx Proxy Manager. Configura tu primer proxy host y certificado SSL. Las IPs bloqueadas por GeoIP2 re cibirán una respuesta 444 (connection closed without response).

Primeros pasos tras la instalación

1. Configurar proxy hosts en NPM

  1. Accede al panel web de NPM en http://localhost:81
  2. Credenciales por defecto: admin@example.com / changeme
  3. Ve a HostsProxy HostsAdd Proxy Host
  4. Indica el dominio, esquema (http/https), IP interna y puerto del servicio backend
  5. Activa Websockets Support si tu app lo requiere (ej: Home Assistant)

2. Solicitar certificado SSL

  1. Edita tu proxy host recién creado
  2. Ve a la pestaña SSL
  3. Selecciona Request a new SSL Certificate
  4. Activa Force SSL y HTTP/2 Support
  5. Acepta los términos de Let's Encrypt y guarda

3. Verificar reglas de Fail2Ban

  1. Conéctate al contenedor de Fail2Ban: docker compose exec fail2ban sh
  2. Revisa el estado de la cárcel: fail2ban-client status nginx-npm
  3. Lista IPs baneadas: fail2ban-client status nginx-npm | grep Banned
  4. Prueba un baneo manual (para verificar): desconecta tu VPN y haz varios intentos fallidos 404 desde otra IP

4. Verificar filtrado GeoIP2

  1. Comprueba que la base de datos existe: ls ./geoip-data/
  2. Verifica que el módulo GeoIP2 cargó correctamente en los logs de NPM
  3. Prueba desde una IP extranjera (VPN) que debería estar bloqueada
  4. Revisa los logs: docker compose logs app | grep 444

Reglas y automatizaciones de seguridad

1. Bloquear intentos de path traversal

# Regla adicional de nginx para bloquear URLs sospechosas location ~ (\.env|config\.xml|\.git|phpmyadmin|wp-admin) { return 444; }

2. Rate limiting por IP

$binary_remote_addr zone=one:10m rate=10r/s; server { location / { limit_req zone=one burst=20 nodelay; } }

3. Whitelist de IPs conocidas (evita baneo accidental)

[nginx-npm] ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.0/8

4. Alertas de correo para baneos

[DEFAULT] action = %(action_mwl)s # Envía email con whois y logs del baneo

Integraciones adicionales

Monitorización

  • Grafana + Loki: Visualiza logs de NPM y Fail2Ban en dashboards centralizados
  • Prometheus: Métricas de contenedores Docker y estado de Fail2Ban
  • Uptime Kuma: Monitoriza si tus servicios son accesibles desde IPs permitidas

Notificaciones

  • Telegram: Bot de alertas instantáneas cuando se banea una IP
  • Discord: Webhooks para alertas en canales de tu servidor
  • Slack: Integración con apps de trabajo para equipos IT

Servicios protegidos comunes

  • Nextcloud: Protege tu nube privada contra escaneos de cuentas
  • Home Assistant: Evita intentos de acceso al panel de administración
  • Plex/Jellyfin: Bloquea distribución de contenido desde países no autorizados
  • Portainer: Acceso restringido solo a IPs de tu país

Gestión y mantenimiento

Ver logs en tiempo real

# Logs de Nginx Proxy Manager docker compose logs -f app # Logs de Fail2Ban docker compose logs -f fail2ban # Logs específicos de una cárcel docker compose exec fail2ban fail2ban-client status nginx-npm

Desbanear una IP manualmente

docker compose exec fail2ban fail2ban-client set nginx-npm unbanip 192.168.1.100

Backup de configuraciones

# Backup de directorios clave tar czf npm-fail2ban-backup-$(date +%Y%m%d).tar.gz \ ./data ./fail2ban-data ./geoip-data ./letsencrypt

Actualizar imágenes Docker

docker compose pull docker compose up -d --force-recreate

Actualizar base de datos GeoIP2 manualmente

docker compose run --rm geoipupdate

Casos de uso

  • Blog personal: Bloquea accesos masivos de bots de scraping y comentarios spam desde países no deseados
  • Home Lab: Protege todos tus contenedores Docker con una única puerta de entrada segura y monitoreada
  • Pequeña empresa: Centraliza acceso a servicios internos (CRM, ERP) exponiendo solo lo necesario al exterior
  • Proyecto freelance: SSL automático, redirecciones y seguridad sin tocar línea de comando
  • Comunidad gamer/Discord: Panel web para administrar servidores protegido por reglas geográficas
  • Fotógrafo/Diseñador: Galerías privadas para clientes con acceso restringido por IP y país

Comentarios

Entradas populares de este blog

Cómo Instalar y configurar SERVIDOR VPN WIREGUARD en MIKROTIK 🔐 #VPN #Wireguard #Mikrotik #RouterOS

Cómo instalar y configurar DSM SYNOLOGY 7.2.2 en PC | Guía completa, instalación, RAID 1, SMB

Cómo INSTALAR y CONFIGURAR OpenVPN en MIKROTIK. Guía completa paso a paso.