Solución de problemas
Problemas de conexión
Sección titulada «Problemas de conexión»¿Por qué el bouncer no puede conectarse a MikroTik?
Sección titulada «¿Por qué el bouncer no puede conectarse a MikroTik?»-
Verifica que el servicio API está activado
/ip/service/print where name=api -
Comprueba que el puerto coincide con tu configuración (por defecto: 8728, TLS: 8729)
-
Verifica que las reglas del firewall permiten el acceso desde la IP del bouncer
-
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?»-
Verifica las credenciales en tu archivo de configuración
-
Comprueba que el usuario existe y tiene el grupo correcto
/user/print where name=crowdsec -
Verifica que el grupo del usuario tiene las políticas necesarias:
read,write,api,sensitive -
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?»-
Para certificados autofirmados del router, omite la verificación del certificado de la API de RouterOS:
mikrotik:tls: truetls_insecure: trueNo existe una opción de ruta de CA para la conexión con MikroTik —
tls_insecurees 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_pathsolo afecta a la conexión con la LAPI de CrowdSec, no a RouterOS.) -
Verifica que el certificado es válido y no ha caducado
-
Comprueba que el nombre de host coincide con el CN o SAN del certificado
Problemas con la LAPI de CrowdSec
Sección titulada «Problemas con la LAPI de CrowdSec»¿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?»-
Verifica la URL de la LAPI
Ventana de terminal curl http://localhost:8080/v1/decisions -
Comprueba la API key del bouncer
Ventana de terminal cscli bouncers list -
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:
- No hay decisiones activas — comprueba con
cscli decisions list - Filtrado por origen demasiado restrictivo — revisa la configuración de
crowdsec.origins - El filtrado de escenarios lo excluye todo — revisa
crowdsec.scenarios_containing/crowdsec.scenarios_not_containing - El motor de CrowdSec no detecta amenazas — revisa los logs de CrowdSec
Problemas con las reglas del firewall
Sección titulada «Problemas con las reglas del firewall»¿Por qué no se crean las reglas del firewall?
Sección titulada «¿Por qué no se crean las reglas del firewall?»-
Comprueba que filter y raw están activados
firewall:filter:enabled: trueraw:enabled: true -
Busca errores en los logs
Ventana de terminal journalctl -u cs-routeros-bouncer -f -
Verifica que el usuario tiene la política
writepara 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»-
Verifica
rule_placementen 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 overridefirewall.ipv4.rule_placementofirewall.ipv6.rule_placement. -
Comprueba si hay reglas dinámicas en la posición 0. La lógica de reintento del bouncer solo se aplica a
topyposition. Prueba posiciones inferiores cuando RouterOS rechaza un destino dinámico o integrado. -
Comprueba los anclajes de comentario para
before_commentyafter_comment. La coincidencia distingue mayúsculas y minúsculas;comment_match: "contains"es una coincidencia literal de subcadena, no una expresión regular. -
Inspecciona las posiciones manualmente
/ip/firewall/filter print/ip/firewall/raw print -
Revisa los logs del bouncer con
journalctl -u cs-routeros-bouncer -f | grep -i placement. Los anclajes de comentario ausentes usanfallback(toppor defecto, obottom). La colocación numérica requiereposition; las posiciones numéricas fuera de rango se añaden al final.
Problemas de rendimiento
Sección titulada «Problemas de rendimiento»¿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 lista | Tiempo | Pico 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 s | Vuelve a niveles de reposo |
Para reducir el impacto:
-
Filtra las decisiones sincronizadas con
origins:crowdsec:origins: ["crowdsec", "cscli"] -
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:
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):
- Las decisiones de baneo duplicadas en caché se omiten sin tocar RouterOS
- Los errores de dispositivo
already have such entryde RouterOS no provocan reconexiones - 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.
Timeout de reconciliación o arranque lento
Sección titulada «Timeout de reconciliación o arranque lento»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:
- Aumenta
mikrotik.command_timeoutdesde su valor por defecto"30s"a"60s". - Mantén
crowdsec.origins: ["crowdsec", "cscli"]en routers pequeños. - Aumenta
mikrotik.pool_sizedesde su valor por defecto4solo después de comprobarmax-sessionsde la API de RouterOS. - Traslada las pruebas con CAPI completo a una ventana de mantenimiento.
mikrotik: command_timeout: "60s" pool_size: 6Mensajes de dirección duplicada
Sección titulada «Mensajes de dirección duplicada»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.
Avisos de fallback de scripts masivos
Sección titulada «Avisos de fallback de scripts masivos»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:
- Revisa
mikrotik.command_timeout. - Revisa los logs de RouterOS en busca de errores de script o de políticas.
- Verifica que el usuario de la API tiene las políticas
read,write,apiysensitive. - Prueba con orígenes solo locales para reducir el tamaño de la lista.
Las direcciones IPv6 aparecen con /128
Sección titulada «Las direcciones IPv6 aparecen con /128»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.
Registro y depuración
Sección titulada «Registro y depuración»logging: level: "debug"O mediante variable de entorno:
LOG_LEVEL=debug cs-routeros-bouncer -c config.ymlcurl http://localhost:2112/healthcurl http://localhost:2112/metrics# Ver las entradas de la lista de direcciones/ip/firewall/address-list print where list=crowdsec-banned
# Contar las entradas/ip/firewall/address-list print count-only where list=crowdsec-banned
# Ver las reglas de firewall del bouncer/ip/firewall/filter print where comment~"crowdsec-bouncer"/ip/firewall/raw print where comment~"crowdsec-bouncer"Problemas específicos de Docker
Sección titulada «Problemas específicos de Docker»El contenedor no puede alcanzar el router
Sección titulada «El contenedor no puede alcanzar el router»-
Usa red de host en Docker Compose:
services:cs-routeros-bouncer:network_mode: host -
O asegúrate de que la red de Docker puede enrutar hacia la IP del router
-
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»-
Comprueba los permisos del archivo:
chmod 644 config.yml -
Si usas secretos de Docker, asegúrate de que el secreto está montado correctamente
-
O usa variables de entorno en lugar de un archivo de configuración