Monitorizando conexiones denegadas de nftables

por | febrero 29, 2020

Con nftables ya configurado llegó el momento de sacar algunas métricas de peticiones denegadas.

Para este artículo he utilizado:

  • Reglas de nftables con logging activado tal y como expliqué en el artículo anterior.
  • Collectd con el plugin tail para parsear el log de nftables.
  • InfluxDB para almacenar métricas.
  • Grafana para crear las gráficas a partir de las métricas.

Configuración de rsyslog

Lo primero que tenemos que hacer es configurar rsyslog para que todos los mensajes que registra el sistema y que contengan el string «nftables» se escriban en un log dedicado, de lo contrario irán al log messages. Creamos el fichero /etc/rsyslog.d/nftables.conf con el siguiente contenido:

if ($msg contains "nftables") then {
   action(type="omfile" file="/var/log/nftables.log")
   stop
}

Reiniciamos:

systemctl restart rsyslog

Rotado de log con Logrotate

Opcional pero recomendable, configuramos Logrotate para ir rotando el log semanalmente manteniendo un total de 4 logs. Creamos el fichero /etc/logrotate.d/nftables:

/var/log/nftables.log {
     rotate 4
     weekly
     compress
     dateext
     delaycompress
     create 640  root root
     }

Plugin tail de Collectd

Con el plugin tail Collectd parsearemos en el log de nftables los distintos patrones de peticiones denegadas para las cadenas input, forward y output:

  # Nftables dropped connections
  <File "/var/log/nftables.log">
    Instance "nftables_drop"

    # INPUT
    <Match>
      Regex "nftables-INPUT-Dropped:.*"
      DSType "GaugeInc"
      Type "gauge"
      Instance "input"
    </Match>

    # FORWARD
    <Match>
      Regex "nftables-FORWARD-Dropped:.*"
      DSType "GaugeInc"
      Type "gauge"
      Instance "forward"
    </Match>

    # OUTPUT
    <Match>
      Regex "nftables-OUTPUT-Dropped:.*"
      DSType "GaugeInc"
      Type "gauge"
      Instance "output"
    </Match>
  </File>

Si todo va bien en InfluxDB debemos ver que se están recogiendo métricas en la instancia correspondiente del plugin tail. Realizamos una query de prueba:

> select * from tail_value where "instance" = 'nftables_drop' limit 10
name: tail_value
time                host        instance      type  type_instance value
----                ----        --------      ----  ------------- -----
1582965734970790454 jota-server nftables_drop gauge input         3
1582965764971237040 jota-server nftables_drop gauge input         1
1582965774967935143 jota-server nftables_drop gauge input         2
1582965784970291714 jota-server nftables_drop gauge input         1
1582965794971866801 jota-server nftables_drop gauge input         1
1582965824968094893 jota-server nftables_drop gauge input         1
1582965834976603399 jota-server nftables_drop gauge input         2
1582965844970217538 jota-server nftables_drop gauge input         1
1582965854966781258 jota-server nftables_drop gauge input         2
1582965864966823038 jota-server nftables_drop gauge input         1

Grafana

Finalmente en Grafana podemos representar las métricas. Por ejemplo con esta sencilla query:

Conseguiremos crear una gráfica donde poder ver los bloqueos por minuto de cada una de las cadenas de nftables: