Ir al contenido

Solución de problemas

¿Por qué el bouncer no puede conectarse a MikroTik?

Sección titulada «¿Por qué el bouncer no puede conectarse a MikroTik?»
  1. Verifica que el servicio API está activado

    /ip/service/print where name=api
  2. Comprueba que el puerto coincide con tu configuración (por defecto: 8728, TLS: 8729)

  3. Verifica que las reglas del firewall permiten el acceso desde la IP del bouncer

  4. Si usas Docker, asegúrate de que el contenedor puede alcanzar la red del router

¿Por qué falla la autenticación de RouterOS?

Sección titulada «¿Por qué falla la autenticación de RouterOS?»
  1. Verifica las credenciales en tu archivo de configuración

  2. Comprueba que el usuario existe y tiene el grupo correcto

    /user/print where name=crowdsec
  3. Verifica que el grupo del usuario tiene las políticas necesarias: read, write, api, sensitive

  4. Comprueba las restricciones de allowed address en la cuenta de usuario

¿Cómo soluciono los errores de certificado TLS de RouterOS?

Sección titulada «¿Cómo soluciono los errores de certificado TLS de RouterOS?»
  1. Para certificados autofirmados del router, omite la verificación del certificado de la API de RouterOS:

    mikrotik:
    tls: true
    tls_insecure: true

    No existe una opción de ruta de CA para la conexión con MikroTik — tls_insecure es el único control de confianza. Para una conexión verificada, instala un certificado firmado por una CA en la que confíe el host del bouncer. (crowdsec.ca_cert_path solo afecta a la conexión con la LAPI de CrowdSec, no a RouterOS.)

  2. Verifica que el certificado es válido y no ha caducado

  3. Comprueba que el nombre de host coincide con el CN o SAN del certificado

¿Por qué el bouncer no puede conectarse a la LAPI de CrowdSec?

Sección titulada «¿Por qué el bouncer no puede conectarse a la LAPI de CrowdSec?»
  1. Verifica la URL de la LAPI

    Ventana de terminal
    curl http://localhost:8080/v1/decisions
  2. Comprueba la API key del bouncer

    Ventana de terminal
    cscli bouncers list
  3. Si CrowdSec se ejecuta en Docker, asegúrate de que hay conectividad de red entre los contenedores

¿Por qué el bouncer no recibe decisiones de CrowdSec?

Sección titulada «¿Por qué el bouncer no recibe decisiones de CrowdSec?»

Causas posibles:

  1. No hay decisiones activas — comprueba con cscli decisions list
  2. Filtrado por origen demasiado restrictivo — revisa la configuración de crowdsec.origins
  3. El filtrado de escenarios lo excluye todo — revisa crowdsec.scenarios_containing / crowdsec.scenarios_not_containing
  4. El motor de CrowdSec no detecta amenazas — revisa los logs de CrowdSec

¿Por qué no se crean las reglas del firewall?

Sección titulada «¿Por qué no se crean las reglas del firewall?»
  1. Comprueba que filter y raw están activados

    firewall:
    filter:
    enabled: true
    raw:
    enabled: true
  2. Busca errores en los logs

    Ventana de terminal
    journalctl -u cs-routeros-bouncer -f
  3. Verifica que el usuario tiene la política write para operaciones de firewall

Las reglas no están en la posición esperada

Sección titulada «Las reglas no están en la posición esperada»
  1. Verifica rule_placement en la configuración. Usa "top" para la máxima prioridad o "bottom" para añadir al final. Usa la colocación estructurada (position, before_comment, after_comment) cuando las reglas existentes del router deban mantenerse primero. Comprueba tanto el ajuste global como cualquier override firewall.ipv4.rule_placement o firewall.ipv6.rule_placement.

  2. Comprueba si hay reglas dinámicas en la posición 0. La lógica de reintento del bouncer solo se aplica a top y position. Prueba posiciones inferiores cuando RouterOS rechaza un destino dinámico o integrado.

  3. Comprueba los anclajes de comentario para before_comment y after_comment. La coincidencia distingue mayúsculas y minúsculas; comment_match: "contains" es una coincidencia literal de subcadena, no una expresión regular.

  4. Inspecciona las posiciones manualmente

    /ip/firewall/filter print
    /ip/firewall/raw print
  5. Revisa los logs del bouncer con journalctl -u cs-routeros-bouncer -f | grep -i placement. Los anclajes de comentario ausentes usan fallback (top por defecto, o bottom). La colocación numérica requiere position; las posiciones numéricas fuera de rango se añaden al final.

¿Por qué se dispara la CPU de RouterOS durante la reconciliación?

Sección titulada «¿Por qué se dispara la CPU de RouterOS durante la reconciliación?»

Benchmarks de rendimiento:

Tamaño de listaTiempoPico de CPU
~28.700 IPs (CAPI completo)~58 s de tiempo real; ~35–36 s de trabajo masivo en RouterOS~39% observado
Comprobación periódica sin deriva~3–4 sVuelve a niveles de reposo

Para reducir el impacto:

  1. Filtra las decisiones sincronizadas con origins:

    crowdsec:
    origins: ["crowdsec", "cscli"]
  2. Programa los reinicios del bouncer en periodos de poco tráfico

CPU de RouterOS alta de forma sostenida tras el arranque

Sección titulada «CPU de RouterOS alta de forma sostenida tras el arranque»

Comprueba si hay actividad repetida en la API de RouterOS:

Ventana de terminal
journalctl -u cs-routeros-bouncer --since "30 min ago" | grep -E "already have such entry|attempting reconnect|RouterOS command failed"

Señales de comportamiento correcto (qué buscar):

  1. Las decisiones de baneo duplicadas en caché se omiten sin tocar RouterOS
  2. Los errores de dispositivo already have such entry de RouterOS no provocan reconexiones
  3. La CPU del router vuelve a niveles cercanos al reposo/tráfico normal cuando termina la reconciliación

Si sigues viendo errores de duplicados repetidos e intentos de reconexión, actualiza a la primera versión cuyo changelog incluya las correcciones de gestión de errores de dispositivo de RouterOS y del fast-path de caché. Hasta que se publique esa versión, compila desde un commit que contenga esa entrada del changelog.

Las listas de direcciones grandes pueden hacer que la reconciliación de arranque sea la parte más lenta del inicio. Comprueba si los logs muestran avisos de scripts masivos, timeouts de comandos o mensajes de fallback del pool.

Acciones que puedes probar:

  1. Aumenta mikrotik.command_timeout desde su valor por defecto "30s" a "60s".
  2. Mantén crowdsec.origins: ["crowdsec", "cscli"] en routers pequeños.
  3. Aumenta mikrotik.pool_size desde su valor por defecto 4 solo después de comprobar max-sessions de la API de RouterOS.
  4. Traslada las pruebas con CAPI completo a una ventana de mantenimiento.
mikrotik:
command_timeout: "60s"
pool_size: 6

RouterOS puede devolver already have such entry cuando una dirección ya está presente. El bouncer lo trata como un duplicado a nivel de dispositivo, localiza la entrada existente y refresca el timeout/comentario cuando es necesario. Los mensajes de duplicado ocasionales son inofensivos.

Los mensajes de duplicado repetidos cada pocos segundos suelen indicar que la caché en memoria no coincide con el estado del router o que el servicio se está reiniciando. Comprueba si hay reinicios, ediciones manuales de la address-list y fallos de reconciliación repetidos.

Durante la reconciliación, las adiciones se envían en scripts de RouterOS de hasta 100 entradas. Si un script falla, el bouncer recurre a adiciones individuales para ese bloque y continúa.

Si el fallback ocurre con frecuencia:

  1. Revisa mikrotik.command_timeout.
  2. Revisa los logs de RouterOS en busca de errores de script o de políticas.
  3. Verifica que el usuario de la API tiene las políticas read, write, api y sensitive.
  4. Prueba con orígenes solo locales para reducir el tamaño de la lista.

RouterOS almacena las direcciones IPv6 individuales en las listas de direcciones con un prefijo /128 explícito. El bouncer normaliza así las direcciones IPv6 individuales antes de las operaciones de adición, búsqueda y reconciliación. Esto es lo esperado y no significa que CrowdSec haya enviado un rango.

logging:
level: "debug"

O mediante variable de entorno:

Ventana de terminal
LOG_LEVEL=debug cs-routeros-bouncer -c config.yml
  1. Usa red de host en Docker Compose:

    services:
    cs-routeros-bouncer:
    network_mode: host
  2. O asegúrate de que la red de Docker puede enrutar hacia la IP del router

  3. Comprueba la resolución DNS si usas nombres de host

Permiso denegado para el archivo de configuración

Sección titulada «Permiso denegado para el archivo de configuración»
  1. Comprueba los permisos del archivo: chmod 644 config.yml

  2. Si usas secretos de Docker, asegúrate de que el secreto está montado correctamente

  3. O usa variables de entorno en lugar de un archivo de configuración