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 /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: