El plugin iptables de collectd se encarga de recuperar contadores de paquetes y bytes del firewall del kernel Linux para IPv4 e IPv6. Este plugin requiere que se especifique qué reglas se desean monitorear (seleccionar qué contadores registrar). Es posible seleccionar reglas de una tabla y cadena por su comentario o por su número de regla (posición).
Dependiendo de la configuración de cada firewall es posible recolectar estadísticas de paquetes/bytes para cierto servicio, host fuente/destino, paquetes descartados, etc.
Un aspecto interesante, desde el punto de vista de la eficiencia de la implementación, es que este plugin utiliza la librería libiptc
en lugar de la herramienta iptables
. Esto significa que se comunica directamente con el kernel y la sobrecarga es tan baja como sea posible. Cabe recordar que collectd está especialmente enfocado en la eficiencia ya que apunta a ser utilizado en sistemas embebidos y routers (OpenWRT).
Este artículo demuestra cómo configurar el plugin iptables de collectd para visualizar contadores de bytes y paquetes con Grafana.
Compilar collectd con soporte para iptables
Para poder utilizar el plugin iptables es necesario compilar collectd con soporte para iptables, agregando la opción --enable-iptables
. Esto requiere que el sistema cuente con las librerías de desarrollo de iptables (libiptc
).
Para instalar esta dependencia en Debian y derivados:
# apt-get install iptables-dev
En CentOS y derivados:
# yum install iptables-devel
Luego configurar y compilar collectd con soporte para iptables:
# ./configure --enable-iptables
Comparto los siguientes scripts de compilación de collectd para Debian y CentOS.
La instalación y configuración de InfluxDB, junto con la configuración del plugin "network" (que permite enviar las métricas recolectadas por collectd a una base de datos InfluxBD) se explican detalladamente en el artículo Compilar y configurar collectd con InfluxDB en Debian y derivados.
Configurar el plugin iptables
Habiendo instalado correctamente collectd, configurar el plugin editando el archivo de configuración del demonio:
# nano collectd.conf
Habilitar el plugin:
LoadPlugin iptables
Configurar el plugin "iptables":
<Plugin iptables> Chain "filter" "INPUT" 6 Chain "filter" "INPUT" 7 Chain "filter" "INPUT" 8 # Chain6 table chain </Plugin>
Este plugin registra cada regla del firewall de forma independiente. Las reglas a monitorear se seleccionan por su respectivo número (ver la salida de iptables -t filter -nL INPUT -v -x --line-numbers
) o por su comentario.
En este ejemplo de configuración se monitorean los contadores de las reglas 6, 7 y 8 de la cadena "INPUT" en la tabla "filter".
El artículo Visualizar contadores y números de reglas de iptables demuestra cómo identificar el número de cada regla para identificar qué reglas se desean monitorear.
La desventaja de la configuración del plugin por número de regla es que, si se reconfigura el firewall del sistema alterando el orden de las reglas (o agregando reglas nuevas en posiciones intermedias), será necesario reconfigurar collectd para reflejar el cambio. Sin embargo reconfigurar o alterar un firewall en un sistema en producción es una tarea muy poco frecuente.
Finalmente, reiniciar collectd:
# service collectd stop && service collectd start
Siempre que se reconfigura y reinicia collectd, es recomendable verificar los mensajes en el log del sistema (/var/log/syslog
en Debian y derivados, /var/log/messages
en CentOS y derivados) para asegurarse de que el demonio haya iniciado correctamente y todos los plugins estén funcionando (y su configuración sea correcta sintáctica y semánticamente):
Oct 29 09:11:20 debian collectd[27114]: Exiting normally. Oct 29 09:11:20 debian collectd[27114]: collectd: Stopping 5 read threads. Oct 29 09:11:20 debian collectd[27114]: collectd: Stopping 5 write threads. Oct 29 09:11:23 debian collectd[12644]: plugin_load: plugin "syslog" successfully loaded. Oct 29 09:11:23 debian collectd[12644]: plugin_load: plugin "apache" successfully loaded. Oct 29 09:11:23 debian collectd[12644]: plugin_load: plugin "cpu" successfully loaded. Oct 29 09:11:23 debian collectd[12644]: plugin_load: plugin "interface" successfully loaded. Oct 29 09:11:23 debian collectd[12644]: plugin_load: plugin "iptables" successfully loaded. Oct 29 09:11:23 debian collectd[12644]: plugin_load: plugin "load" successfully loaded. Oct 29 09:11:23 debian collectd[12644]: plugin_load: plugin "memory" successfully loaded. Oct 29 09:11:23 debian collectd[12644]: plugin_load: plugin "network" successfully loaded. Oct 29 09:11:23 debian collectd[12644]: plugin_load: plugin "tcpconns" successfully loaded. Oct 29 09:11:23 debian collectd[12645]: Initialization complete, entering read-loop. Oct 29
Graficar contadores de iptables en Grafana
La siguiente consulta en InfluxDB permite graficar un contador de iptables en Grafana:
SELECT derivative(mean("value"), 10s) FROM "iptables_value" WHERE ("host" = 'www.linuxito.com' AND "instance" = 'filter-INPUT' AND "type" = 'ipt_packets' AND "type_instance" = '6') AND $timeFilter GROUP BY time($__interval) fill(none)
El tag "instance" selecciona un par tabla-cadena; "type" selecciona paquetes o bytes; mientras que "type_instance" selecciona la regla por su número.De esta forma, la consulta anterior visualiza el contador de paquetes procesados a través de la regla 6 de la cadena "INPUT" en la tabla "filter" para el host "www.linuxito.com":

Debido a que los contadores de iptables no son deltas/gauges (mediciones en un instante o periodo de tiempo) sino precisamente contadores (valga la redundancia), es importante destacar que es conveniente aplicar la transformación derivada (derivative(mean("value"), 10s)
) sobre la serie de tiempo. Esto permite graficar la variación de los contadores a lo largo del tiempo de forma conveniente.
Referencias
- Plugin:IPTables - collectd Wiki
- Manpage collectd.conf(5) - Plugin iptables
- Compilar y configurar collectd con InfluxDB en Debian y derivados
- Cómo configurar el cortafuegos en Debian
- Visualizar contadores y números de reglas de iptables
- Transformar contadores a deltas en Grafana sobre datos de InfluxDB