LibreNMS

Proceso de instalación de LibreNMS en Debian 11

Este artículo recoge el proceso de instalación paso a paso del sistema de monitorización LibreNMS, que para quién no lo conozca es una plataforma de monitoreo de red de código abierto, la cual, proporciona una solución integral para supervisar cualquier dispositivo de red.

LibreNMS nos permite recopilar datos sobre el rendimiento de los dispositivos de red, como la utilización del ancho de banda, estado de los puertos, carga de CPU, uso de memoria RAM, uso de disco e incluso datos sobre servicios que podamos estar ejecutando en un servidor. Esta información la recopila a través de protocolos como SNMP (Simple Network Management Protocol), ICMP (Internet Control Message Protocol) y otros.

Características e integraciones de LibreNMS

El siguiente listado recoge todas las características e integraciones que se verán de LibreNMS a lo largo de este artículo:

  • Descubrimiento automático de dispositivos en la red.
  • Monitorización de distintos dispositivos de red (routers, switches, wireless, servidores físicos, virtuales, etcétera).
  • Integración con RRDCached (almacenamiento en caché para Round Robin Database).
  • Integración con FastPing (herramienta para realizar pruebas de ping de manera rápida y eficiente).
  • Integración con Oxidized (herramienta que permite realizar el respaldo y versionado de configuraciones de dispositivos de red).
  • Integración con Nagios (herramienta de monitorización de la que utilizaremos sus plugins ).
  • Integración con SmokePing (herramienta para medir y visualizar la latencia y la pérdida de paquetes).
  • Integración con Graylog (plataforma para la gestión de registros y eventos).

Requisitos

En el siguiente listado presento los requisitos necesarios para un entorno de laboratorio con el que poder realizar pruebas antes de llevarlo a un entorno de producción.

Instalación de paquetes básicos

Antes de comenzar con la configuración de repositorios y la instalación de servicios, es recomendable que actualicemos el sistema y como hemos partido de una instalación limpia de una Debian 11, tendremos que identificarnos como root y procederemos a instalar y configurar sudo para nuestro usuario.

su -
apt update && apt upgrade -y && apt dist-upgrade -y
apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring apt-transport-https \
 software-properties-common git sudo gnupg -y

Agregamos nuestro usuario al grupo sudo y adm, en este ejemplo el usuario es boscolopez.

usermod -aG sudo,adm boscolopez

Una vez hemos finalizado este proceso, reiniciaremos el servidor con el siguiente comando.

shutdown -r now

Configuración de repositorios

Antes de comenzar la instalación, configuraremos los repositorios que vamos a utilizar durante todo el proceso para los siguientes servicios:

  • Repositorio PHP 8.2 para Debian 11.
  • Repositorio oficial MongoDB 6 para Debian 11.
  • Repositorio ElasticSearch 7.10.2 para Debian 11.

Repositorio última versión PHP para Debian 11

Para contar con la última versión de PHP agregaremos el repositorio de Ondřej Surý, quien mantiene actualizados los paquetes de PHP para distintas versiones de Ubuntu y Debian.

wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

Repositorio MongoDB 6

Antes de implementar el repositorio de debemos tener en cuenta que Graylog en su versión 5.1 es compatible con las versiones de MongoDB 5.x y 6.X, pero para estas versiones es necesario contar una CPU que permita las instrucciones AVX.

¿Cómo verificar si la CPU cuenta con instrucciones AVX?

Contando que ya tenemos nuestro servidor implementado con una Debian 11, podremos ejecutar el siguiente comando en consola para verificar que tenemos la instrucción AVX habilitada

grep avx /proc/cpuinfo

La salida en caso de tener estas instrucciones disponibles podría ser como estar:

boscolopez@librenms ~ $ grep avx /proc/cpuinfo
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw xop fma4 tbm perfctr_core ssbd vmmcall tsc_adjust bmi1 virt_ssbd arat npt nrip_save arch_capabilities
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw xop fma4 tbm perfctr_core ssbd vmmcall tsc_adjust bmi1 virt_ssbd arat npt nrip_save arch_capabilities
boscolopez@librenms ~ $

En el caso de que no tengamos disponible esta instrucción, la salida sería la siguiente:

boscolopez@isengard ~ $ grep avx /proc/cpuinfo
boscolopez@isengard ~ $

Si estamos realizando la implementación en un entorno virtual como Proxmox, por poner un ejemplo, es importante verificar que el tipo de CPU que hemos designado para la máquina virtual permita esta instrucción o comprobar antes que el procesador de nuestros servidor físico permite este tipo de instrucciones. En el caso de Proxmox y por no entrar en muchos detalles, se puede poner que el tipo de CPU sea «host»
Importamos la clave del repositorio de MongoDB

Para importar la clave del repositorio de MongoDB 6 ejecutaremos el siguiente comando.

curl -fsSL https://pgp.mongodb.com/server-6.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg \
   --dearmor
Agregar repositorio MongoDB

Creamos el fichero list para nuestra distribución.

echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg] http://repo.mongodb.org/apt/debian bullseye/mongodb-org/6.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

Repositorio ElasticSearch 7.10.2

La versión 7.10.2 es la única compatible con Graylog 5.1, así que en el caso de irnos a un entorno de producción, se nos recomienda utilizar OpenSearch.

Importación clave GPG ElasticSearch

Ejecutamos el siguiente comando para importar la clave.

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
Agregar repositorio ElasticSearch

Creamos el fichero list para la versión 7 de ElasticSearch.

echo "deb [ signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

Inicio del proceso de instalación de LibreNMS

Una vez hemos finalizado el proceso de implementación de todos los repositorios, realizaremos una actualización de paquetes, seguiremos el siguiente proceso de instalación y configuración para no saltarnos ningún paso.

  • Proceso de instalación de servidor Nginx y PHP-FPM.
    • Instalar Nginx.
    • Instalar PHP-FPM
  • Proceso de configuración de Nginx y PHP-FPM.
    • Agregar el usuario librenms.
    • Modificar zona horaria en Sistema.
    • Modificar zona horaria en PHP.
    • Creación y configuración del pool librenms en PHP-FPM
    • Creación y configuración del Virtual Host
  • Proceso de instalación del servidor de bases de datos MariaDB
    • Instalación de MariaDB.
    • Configuración del servidor.
    • Creación de la base de datos.
    • Creación del usuario.
      • Asignación de permisos al usuario sobre la base de datos.
    • Pruebas del correcto funcionamiento.
  • Instalación RRDCached
  • Instalación de LibreNMS.
    • Instalación de paquetes requeridos.
    • Descarga de LibreNMS desde repositorio git.
    • Asignación de permisos en directorios de LibreNMS.
    • Instalación de dependencias PHP.

Proceso de instalación de Nginx y PHP-FPM

Después de haber realizado todos los pasos anteriores, estamos en la posición de comenzar el proceso de instalación, el cual, iremos realizando paso a paso y verificando cada uno de los puntos por separado; de esta forma aseguraremos que cada uno de los puntos funcionará sin problema.

Lo primero de todo es implementar un servidor web que en esta caso hemos seleccionado Nginx y LibreNMS al ser un proyecto desarrollado con el framework Laravel, precisa de PHP.

Instalar Nginx en Debian 11

Para instalar Nginx en nuestra Debian 11, ejecutaremos los siguientes comandos que nos realizarán una actualización de los repositorios e iniciará el proceso de instalación.

sudo apt update && sudo apt install nginx-full -y

Al finalizar el proceso de instalación, verificaremos que abriendo un navegador en nuestro equipo y escribiendo la dirección IP de nuestro servidor (http://172.16.10.151), se nos muestra lo siguiente.

En este ejemplo la dirección IP del servidor es 172.16.10.151

Instalar PHP-FPM en Debian 11

La versión de PHP que implementaremos es la última disponible en el repositorio de Ondřej Surý, junto con los paquetes de PHP necesarios para LibreNMS.

sudo apt install php-cli php-curl php-fpm php-gd php-gmp php-json \
 php-mbstring php-mysql php-snmp php-xml php-zip php-rrd -y

Verificamos con el siguiente comando la versión implementada de PHP que a día de hoy 28/05/2023 la 8.2.6, siendo requerido por parte de LibreNMS una versión igual o superior a la 8.1.

php -v

La salida del anterior comando debería mostrar lo siguiente:

boscolopez@librenms ~ $ php -v
PHP 8.2.6 (cli) (built: May 12 2023 07:48:41) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.6, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.6, Copyright (c), by Zend Technologies

Proceso de configuración de Nginx y PHP-FPM

Antes de seguir con la instalación realizaremos las configuraciones necesarias en Nginx y PHP-FPM.

Agregar el usuario y grupo librenms al sistema

LibreNMS, recomienda crear un usuario específico para su ejecución, así que con el siguiente comando crearemos el usuario y grupo librenms en nuestro sistema.

sudo useradd librenms -d /opt/librenms -M -r -s "$(which bash)"

Modificar zona horaria del sistema

Para realizar la modificación de la zona horaria del sistema, ejecutaremos el siguiente comando.

sudo timedatectl set-timezone Europe/Madrid

Verificaremos que la zona horaria ha sido modificada correctamente ejecutando el siguiente comando.

sudo timedatectl show

Este comando nos debería devolver lo siguiente:

boscolopez@librenms ~ $ sudo timedatectl show
Timezone=Europe/Madrid
LocalRTC=no
CanNTP=yes
NTP=yes
NTPSynchronized=yes
TimeUSec=Sun 2023-05-28 10:37:00 CEST
RTCTimeUSec=Sun 2023-05-28 10:37:01 CEST

Modificar zona horaria en PHP

La modificación de la zona horaria de PHP debemos realizarla tanto en el fichero php.ini de consola (cli) como en el fichero php.ini de FPM.

Los ficheros que debemos modificar se encuentra en las siguientes rutas.

  • /etc/php/8.2/cli/php.ini
  • /etc/php/8.2/fpm/php.ini

Editaremos el primer fichero ejecutando el siguiente comando.

sudo nano /etc/php/8.2/cli/php.ini

Pulsaremos la combinación de teclas Ctrl+W y buscaremos el texto date.timezone.

Lo que veremos en el fichero por defecto será lo siguiente:

[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
;date.timezone =

Lo editamos agregando nuestra zona horaria y descomentando la variable date.timezone.

[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
date.timezone = "Europe/Madrid"

Guardaremos pulsando la combinación de teclas Ctrl+o y para cerrar pulsaremos la combinación Ctrl+x.

Procedemos a editar el fichero de FPM de la misma forma que el anterior, pero ejecutando el siguiente comando.

sudo nano /etc/php/8.2/fpm/php.ini

Creación y configuración del pool librenms en PHP-FPM.

Crearemos un fichero librenms.conf copiando el original de www.conf y lo editaremos modificando lo siguiente:

OriginalModificado
[www-data][librenms]
user = www-datauser = librenms
group = www-datagroup = librenms
listen = /run/php/php8.2-fpm.socklisten = /run/php/php-fpm-librenms.sock

Copiamos el fichero:

sudo cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/librenms.conf

Editamos el fichero:

sudo nano /etc/php/8.2/fpm/pool.d/librenms.conf

El fichero original muestra lo siguiente:

; Start a new pool named 'www'.
; the variable $pool can be used in any directive and will be replaced by the
; pool name ('www' here)
[www]

; Per pool prefix
; It only applies on the following directives:
; - 'access.log'
; - 'slowlog'
; - 'listen' (unixsocket)
; - 'chroot'
; - 'chdir'
; - 'php_values'
; - 'php_admin_values'
; When not set, the global prefix (or /usr) applies instead.
; Note: This directive can also be relative to the global prefix.
; Default Value: none
;prefix = /path/to/pools/$pool

; Unix user/group of the child processes. This can be used only if the master
; process running user is root. It is set after the child process is created.
; The user and group can be specified either by their name or by their numeric
; IDs.
; Note: If the user is root, the executable needs to be started with
;       --allow-to-run-as-root option to work.
; Default Values: The user is set to master process running user by default.
;                 If the group is not set, the user's group is used.
user = www-data
group = www-data

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /run/php/php8.2-fpm.sock

Una vez modificamos el fichero quedaría así:

; Start a new pool named 'www'.
; the variable $pool can be used in any directive and will be replaced by the
; pool name ('www' here)
[librenms]

; Per pool prefix
; It only applies on the following directives:
; - 'access.log'
; - 'slowlog'
; - 'listen' (unixsocket)
; - 'chroot'
; - 'chdir'
; - 'php_values'
; - 'php_admin_values'
; When not set, the global prefix (or /usr) applies instead.
; Note: This directive can also be relative to the global prefix.
; Default Value: none
;prefix = /path/to/pools/$pool

; Unix user/group of the child processes. This can be used only if the master
; process running user is root. It is set after the child process is created.
; The user and group can be specified either by their name or by their numeric
; IDs.
; Note: If the user is root, the executable needs to be started with
;       --allow-to-run-as-root option to work.
; Default Values: The user is set to master process running user by default.
;                 If the group is not set, the user's group is used.
user = librenms
group = librenms

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /run/php/php-fpm-librenms.sock

Creación del virtual host para LibreNMS

Ya que el objetivo de este artículo es mostrar una configuración que se pueda replicar en entornos de pruebas más reales, vamos a generar un virtual host con un dominio real, por lo que utilizaremos como ejemplo el dominio boscolopez.cloud, donde hemos creado un subdominio que es librenms.boscolopez.cloud; como es lógico deberéis sustituir tanto el dominio como el subdominio por el que vosotros vayáis a utilizar.

Para crear el fichero del virtual host librenms.boscolopez.cloud, ejecutaremos el siguiente comando:

sudo touch /etc/nginx/sites-available/librenms_boscolopez_cloud.conf
Solicitud del certificado SSL

Para dejar la configuración del virtual host lo más completa posible, realizaré la solicitud de un certificado SSL a Let’s Encrypt, instalando certbot y el plugin para Nginx.

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d librenms.boscolopez.cloud
Modificación del virtual host

Editaremos el fichero de nuestro virtual host para que se muestre como el siguiente donde sólo deberíais modificar los datos que muestro en la siguiente tabla y que corresponderán al subdominio que utilicéis para la implementación y en el caso de resolver 172.16.10.1, debéis sustituir la dirección IP 172.16.10.1 por la de vuestro servidor DNS.

Variables a personalizar
server_name = librenms.boscolopez.cloud;
$host = librenms.boscolopez.cloud
ssl_certificate /etc/letsencrypt/live/librenms.boscolopez.cloud/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/librenms.boscolopez.cloud/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/librenms.boscolopez.cloud/chain.pem;
resolver 172.16.10.1;
sudo nano /etc/nginx/sites-available/librenms_boscolopez_cloud.conf

Temporalmente en este fichero ya que aún no hemos instalado librenms, vamos a poner que el directorio es /var/www/html, esto se registra en la variable root, que por el momento dejaremos como:

  • root /var/www/html

El contenido de nuestro virtual host será el siguiente:

server {
        listen      80;
        server_name librenms.boscolopez.cloud;

        if ($host = librenms.boscolopez.cloud) {
            return 301 https://$host$request_uri;
        }

}

server {
    listen 443 ssl http2;
    server_name librenms.boscolopez.cloud;
    ssl_certificate /etc/letsencrypt/live/librenms.boscolopez.cloud/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/librenms.boscolopez.cloud/privkey.pem;
    ssl_session_cache shared:SSL:50m;
    add_header Strict-Transport-Security "max-age=63072000" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/librenms.boscolopez.cloud/chain.pem;
    resolver 172.16.10.1;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    root        /opt/librenms/html;
    index       index.php;
    charset utf-8;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ [^/]\.php(/|$) {
        fastcgi_pass unix:/run/php/php-fpm-librenms.sock;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi.conf;
    }
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Proceso de instalación del servidor de bases de datos MariaDB

LibreNMS precisa de un servidor de base de datos MySQL, por lo que utilizaremos MariaDB, corriéndolo dentro del mismo servidor, algo que en otra topología deberíamos separar y yo particularmente recomendaría utilizar la versión MySQL de Perconna.

La versión que se implementa utilizando los repositorios de Debian es la 10.5.19, así que procedemos con el proceso de instalación.

Instalación de MariaDB

Para realizar la instalación de MariaDB, ejecutaremos el siguiente comando que nos instalará tanto los paquetes de servidor como de cliente.

sudo apt install mariadb-client mariadb-server -y

Configuración del servidor MariaDB

Editaremos el fichero de configuración del servicio MariaDB que se encuentra en la la siguiente ruta /etc/mysql/mariadb.conf y con el nombre 50-server.cnf, modificando algunos valores que nos permitirán tener un mejor rendimiento y que agregaremos en la sección [mysqld].

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

En el fichero por defecto nos encontraremos esta configuración:

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#

user                    = mysql
pid-file                = /run/mysqld/mysqld.pid
basedir                 = /usr
datadir                 = /var/lib/mysql
tmpdir                  = /tmp
lc-messages-dir         = /usr/share/mysql
lc-messages             = en_US
skip-external-locking

# Broken reverse DNS slows down connections considerably and name resolve is
# safe to skip if there are no "host by domain name" access grants
#skip-name-resolve

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1

#
# * Fine Tuning
#

#key_buffer_size        = 128M
#max_allowed_packet     = 1G
#thread_stack           = 192K
#thread_cache_size      = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
#myisam_recover_options = BACKUP
#max_connections        = 100
#table_cache            = 64

#
# * Logging and Replication
#

# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# Recommend only changing this at runtime for short testing periods if needed!
#general_log_file       = /var/log/mysql/mysql.log
#general_log            = 1

# When running under systemd, error logging goes via stdout/stderr to journald
# and when running legacy init error logging goes to syslog due to
# /etc/mysql/conf.d/mariadb.conf.d/50-mysqld_safe.cnf
# Enable this if you want to have error logging into a separate file
#log_error = /var/log/mysql/error.log
# Enable the slow query log to see queries with especially long duration
#slow_query_log_file    = /var/log/mysql/mariadb-slow.log
#long_query_time        = 10
#log_slow_verbosity     = query_plan,explain
#log-queries-not-using-indexes
#min_examined_row_limit = 1000

# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
#max_binlog_size        = 100M

#
# * SSL/TLS
#

# For documentation, please read
# https://mariadb.com/kb/en/securing-connections-for-client-and-server/
#ssl-ca = /etc/mysql/cacert.pem
#ssl-cert = /etc/mysql/server-cert.pem
#ssl-key = /etc/mysql/server-key.pem
#require-secure-transport = on

#
# * Character sets
#

# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
# utf8 4-byte character set. See also client.cnf
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci

#
# * InnoDB
#

# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
# Most important is to give InnoDB 80 % of the system RAM for buffer use:
# https://mariadb.com/kb/en/innodb-system-variables/#innodb_buffer_pool_size
#innodb_buffer_pool_size = 8G

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.5 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.5]

El fichero de configuración que tendremos será así:

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#

user                    = mysql
pid-file                = /run/mysqld/mysqld.pid
basedir                 = /usr
datadir                 = /var/lib/mysql
tmpdir                  = /tmp
lc-messages-dir         = /usr/share/mysql
lc-messages             = en_US
skip-external-locking

# Broken reverse DNS slows down connections considerably and name resolve is
# safe to skip if there are no "host by domain name" access grants


# DESCOMENTAMOS PARA QUE NO REALICE RESOLUCIÓN INVERSA DE LAS CONEXIONES
skip-name-resolve

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 0.0.0.0


# VALORES AGREGADOS LIBRENMS
innodb_file_per_table = 1
lower_case_table_names = 0
innodb_flush_log_at_trx_commit = 0

#
# * Fine Tuning
#

#key_buffer_size        = 2800M
#max_allowed_packet     = 1G
#thread_stack           = 192K
#thread_cache_size      = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
#myisam_recover_options = BACKUP
max_connections        = 200
#table_cache            = 64

#
# * Logging and Replication
#

# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# Recommend only changing this at runtime for short testing periods if needed!
#general_log_file       = /var/log/mysql/mysql.log
#general_log            = 1

# When running under systemd, error logging goes via stdout/stderr to journald
# and when running legacy init error logging goes to syslog due to
# /etc/mysql/conf.d/mariadb.conf.d/50-mysqld_safe.cnf
# Enable this if you want to have error logging into a separate file
#log_error = /var/log/mysql/error.log
# Enable the slow query log to see queries with especially long duration
#slow_query_log_file    = /var/log/mysql/mariadb-slow.log
#long_query_time        = 10
#log_slow_verbosity     = query_plan,explain
#log-queries-not-using-indexes
#min_examined_row_limit = 1000

# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
#max_binlog_size        = 100M

#
# * SSL/TLS
#

# For documentation, please read
# https://mariadb.com/kb/en/securing-connections-for-client-and-server/
#ssl-ca = /etc/mysql/cacert.pem
#ssl-cert = /etc/mysql/server-cert.pem
#ssl-key = /etc/mysql/server-key.pem
#require-secure-transport = on

#
# * Character sets
#

# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
# utf8 4-byte character set. See also client.cnf
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci

#
# * InnoDB
#

# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
# Most important is to give InnoDB 80 % of the system RAM for buffer use:
# https://mariadb.com/kb/en/innodb-system-variables/#innodb_buffer_pool_size
#innodb_buffer_pool_size = 8G

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.5 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.5]

Las variables que hemos modificado son:

  • skip-name-resolve, que por defecto viene comentada y nos permitirá que no se hagan resoluciones inversas a nivel de DNS por cada conexión.
  • max_connections, que por defecto viene con un valor de 100 y hemos subido a 200.
  • bind-address, por defecto tiene el valor 127.0.0.1, lo he modificado a 0.0.0.0 para que escuche en cualquier dirección IP que tengáis agregada en el servidor, pero lo recomendable es especificar una concreta que en mi caso sería 172.16.10.151.

Las variables que hemos agregado son:

  • innodb_file_per_table = 1
  • lower_case_table_names = 0
  • innodb_flush_log_at_trx_commit = 0

Algunos valores que podríamos agregar o modificar serían los siguientes:

  • key_buffer_size, este valor puede establecerse en un 20% del total de la RAM disponible, pero nunca deberá superar los 3GB.
  • innodb_buffer_pool_size, si disponemos de un servidor dedicado que tiene 4GB de RAM podríamos ponerle un valor de 3G.

No se ha entrado en temas de optimización, pero si tenéis el servidor funcionando una semana seguida os recomendaría utilizar el siguiente Script (MySQLTuner) para ver que valores retocar acorde a la configuración que tengáis de RAM y el uso que se vaya generando y leer el siguiente artículo.

Habilitamos que el servicio MariaDB arranque al inicio del sistema y reiniciamos el servicio para que se apliquen las configuraciones que hemos modificado.

sudo systemctl enable mariadb
sudo systemctl restart mariabd

Creación de la base de datos

Por defecto MariaDB no le tiene implementada contraseña al usuario root, por lo que si ejecutamos el siguiente comando estando identificados como root en el sistema no nos solicitará contraseña.

su -
mysql -uroot

Os muestro como se ve, tal cual, se ha ejecutado.

boscolopez@librenms ~ $ su -
Contraseña:
root@librenms ~ # mysql -uroot
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 31
Server version: 10.5.19-MariaDB-0+deb11u2 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Dejo a la decisión de cada uno dejarlo de esta manera, aunque aquí mostraré la opción que yo utilizo ejecutando el siguiente comando:

sudo mariadb-secure-installation

Una vez ejecutamos este comando, nos comenzará a realizar preguntas:

boscolopez@librenms ~ $ sudo mariadb-secure-installation
[sudo] password for boscolopez:

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] Y
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Ahora que ya tenemos un acceso para mí más cómodo ejecutaremos el siguiente comando para iniciar el cliente de MariaDB y crear la base de datos:

mysql -uroot -p

Al especificar el -p, nos solicitará la contraseña que hemos especificado para el usuario root y seguidamente nos abrirá la consola de MariaDB donde crearemos una base de datos con el nombre librenms.

CREATE DATABASE librenms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Creamos el usuario que utilizará la aplicación para conectarse a la base de datos.

CREATE USER 'usrlibrenms'@'localhost' IDENTIFIED BY 'UnaP4$$w0rd_h1p3rSegura#';

Asignamos todos los permisos al usuario sobre la base de datos.

GRANT ALL PRIVILEGES ON librenms.* TO 'usrlibrenms'@'localhost';
exit

Os muestro como serían todos los comandos seguidos en la consola de MariaDB.

boscolopez@librenms ~ $ mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 42
Server version: 10.5.19-MariaDB-0+deb11u2 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE librenms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0,000 sec)

MariaDB [(none)]> CREATE USER 'usrlibrenms'@'localhost' IDENTIFIED BY 'UnaP4$$w0rd_h1p3rSegura#';
Query OK, 0 rows affected (0,003 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON librenms.* TO 'usrlibrenms'@'localhost';
Query OK, 0 rows affected (0,003 sec)

MariaDB [(none)]> exit
Bye
boscolopez@librenms ~ $

Pruebas del correcto funcionamiento

Antes de seguir, vamos a verificar que podemos iniciar sesión en el servidor MariaDB con el usuario que hemos creado y que tiene acceso a la base de datos, para ello ejecutaremos:

mysql -uusrlibrenms -p

Si introducimos correctamente la contraseña que hemos definido, nos debería abrir la consola de MariaDB y podemos verificar que tenemos acceso a la base de datos:

SHOW databases;
boscolopez@librenms ~ $ mysql -uusrlibrenms -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 44
Server version: 10.5.19-MariaDB-0+deb11u2 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| librenms           |
+--------------------+
2 rows in set (0,000 sec)

MariaDB [(none)]>

Instalación RRDCached

Para implementar RRDCached en nuestro servidor, ejecutaremos el siguiente comando.

sudo apt install rrdcached -y

Configuración RRDCached

Al finalizar el proceso de instalación, editaremos el fichero de configuración que se encuentra en /etc/default/rrdcached, modificando las variables de la siguiente lista:

  • DAEMON=/usr/bin/rrdcached
  • DAEMON_USER=librenms
  • DAEMON_GROUP=librenms
  • WRITE_THREADS=4
  • WRITE_TIMEOUT=1800
  • WRITE_JITTER=1800
  • BASE_PATH=/opt/librenms/rrd/
  • JOURNAL_PATH=/var/lib/rrdcached/journal/
  • PIDFILE=/runrrdcached.pid
  • SOCKFILE=/run/rrdcached.sock
  • SOCKGROUP=librenms
  • BASE_OPTIONS=»-B -F -R»

Para editar el fichero de configuración de RRDCached ejecutaremos:

sudo nano /etc/default/rrdcached

Así debería quedar el fichero de configuración de RRDCached:

# /etc/default file for RRD cache daemon

# Full path to daemon
DAEMON=/usr/bin/rrdcached

# Optional override flush interval, in seconds.
WRITE_TIMEOUT=1800

# Optional override maximum write delay, in seconds.
WRITE_JITTER=1800

# Optional override number of write_threads
WRITE_THREADS=4

# Where database files are placed.  If left unset, the default /tmp will
# be used.  NB: The daemon will reject a directory that has symlinks as
# components.  NB: You may want to have -B in BASE_OPTS.
BASE_PATH=/opt/librenms/rrd

# Where journal files are placed.  If left unset, journaling will
# be disabled.
JOURNAL_PATH=/var/lib/rrdcached/journal/

# FHS standard placement for process ID file.
PIDFILE=/var/run/rrdcached.pid

# FHS standard placement for local control socket.
SOCKFILE=/run/rrdcached.sock

# Optional override group that should own/access the local control
# socket
SOCKGROUP=librenms

# Optional override access mode of local control socket.
#SOCKMODE=0660

# Optional unprivileged group to run under when daemon.  If unset
# retains invocation group privileges.
DAEMON_GROUP=librenms

# Optional unprivileged user to run under when daemon.  If unset
# retains invocation user privileges.
DAEMON_USER=librenms

# Network socket address requests.  Use in conjunction with SOCKFILE to
# also listen on INET domain sockets.  The option is a lower-case ell
# ASCII 108 = 0x6c, and should be repeated for each address.  The
# parameter is an optional IP address, followed by an optional port with
# a colon separating it from the address.  The empty string is
# interpreted as "open sockets on the default port on all available
# interfaces", but generally does not pass through init script functions
# so use -L with no parameters for that configuration.
#NETWORK_OPTIONS="-L"

# Any other options not specifically supported by the script (-P, -f,
# -F, -B).
BASE_OPTIONS="-B -F -R"

Modificación de permisos

Asignaremos los permisos al grupo y usuario librenms del directorio /var/lib/rrdcached/journal/ ejecutando lo siguiente:

sudo chown librenms:librenms /var/lib/rrdcached/journal/

Habilitamos el servicio al inicio del sistemas y lo reiniciamos.

sudo systemctl enable rrdcached.service
sudo systemctl start rrdcached.service

Instalación de LibreNMS

Instalación de paquetes requeridos

Necesitaremos instalar unos paquetes extra que son requeridos, por lo que ejecutaremos:

sudo apt install acl curl fping git graphviz imagemagick mtr-tiny python3-dotenv python3-pymysql python3-redis python3-setuptools python3-systemd python3-pip rrdtool snmp snmpd whois -y

Descarga de LibreNMS desde el repositorio git

Vamos a proceder a descargar LibreNMS desde su repositorio, así que nos identificaremos como root, nos desplazaremos hasta el directorio /opt e iniciaremos la descarga.

su -
cd /opt
git clone https://github.com/librenms/librenms.git

Asignación de permisos

Ejecutaremos los siguientes comandos para la correcta asignación de permisos al directorio librenms que se nos ha creado y a los distintos subdirectorios.

chown -R librenms:librenms /opt/librenms
chmod 771 /opt/librenms
chmod -R g+rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/
find /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/ -type d -exec chmod g+rwx {} \;

Instalación de dependencias

Como ya hemos creado el usuario librenms con anterioridad en el sistema, vamos a identificarnos con este usuario y realizar el siguiente proceso.

su - librenms
./scripts/composer_wrapper.php install --no-dev
exit

Ahora habilitaremos que los servicios de Nginx y PHP-FPM se inicien en el arranque del sistema y reiniciaremos los servicios, para seguidamente abrir en un navegador la dirección URL de nuestro virtual host.

sudo systemctl enable nginx
sudo systemctl enable php8.2-fpm
sudo systemctl reload nginx
sudo systemct restart php8.2-fpm

Comandos previos a la instalación vía web

Antes de abrir en nuestro navegador la URL del servicio de LibreNMS, vamos a ejecutar una serie de comandos:

sudo cp /opt/librenms/dist/librenms-scheduler.service /opt/librenms/dist/librenms-scheduler.timer /etc/systemd/system/
sudo cp /opt/librenms/dist/librenms.cron /etc/cron.d/librenms
sudo cp /opt/librenms/misc/librenms.logrotate /etc/logrotate.d/librenms
sudo cp /opt/librenms/misc/lnms-completion.bash /etc/bash_completion.d/
sudo ln -s /opt/librenms/lnms /usr/local/bin/lnms
sudo systemctl enable librenms-scheduler.timer
sudo systemctl start librenms-scheduler.timer

Configurar SNMP en nuestro servidor

Este mismo proceso lo podremos ejecutar en otros servidores Linux, pero lo vamos a dejar ya configurado en este para después poderlo monitorizar y agregarlo como el primer servidor a LibreNMS.

Ejecutamos los siguientes comandos, para copiar primero el fichero de configuración de snmp y acto seguido descargarnos un fichero que obtendrá ciertos valores de la distribución.

sudo cp /opt/librenms/snmpd.conf.example /etc/snmp/snmpd.conf
sudo curl -o /usr/bin/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro
sudo chmod +x /usr/bin/distro

Ahora editaremos el fichero de SNMP para sustituir ciertos valores:

sudo nano /etc/snmp/snmpd.conf

El fichero por defecto mostrará el siguiente contenido:

# Change RANDOMSTRINGGOESHERE to your preferred SNMP community string
com2sec readonly  default         RANDOMSTRINGGOESHERE

group MyROGroup v2c        readonly
view all    included  .1                               80
access MyROGroup ""      any       noauth    exact  all    none   none

syslocation Rack, Room, Building, City, Country [Lat, Lon]
syscontact Your Name <your@email.address>

#OS Distribution Detection
extend distro /usr/bin/distro

#Hardware Detection
# (uncomment for x86 platforms)
#extend manufacturer '/bin/cat /sys/devices/virtual/dmi/id/sys_vendor'
#extend hardware '/bin/cat /sys/devices/virtual/dmi/id/product_name'
#extend serial '/bin/cat /sys/devices/virtual/dmi/id/product_serial'

# (uncomment for ARM platforms)
#extend hardware '/bin/cat /sys/firmware/devicetree/base/model'
#extend serial '/bin/cat /sys/firmware/devicetree/base/serial-number'

Vamos a realizar una configuración básica, donde nuestra comunidad snmp sea monitorizando y pongamos como localización A Coruña.

# Change RANDOMSTRINGGOESHERE to your preferred SNMP community string
com2sec readonly  default         monitorizando

group MyROGroup v2c        readonly
view all    included  .1                               80
access MyROGroup ""      any       noauth    exact  all    none   none

syslocation A Coruña, Spain [43.37410178129225, -8.434399038449621]
syscontact Bosco Lopez <tu@email.com>

#OS Distribution Detection
extend distro /usr/bin/distro

#Hardware Detection
# (uncomment for x86 platforms)
#extend manufacturer '/bin/cat /sys/devices/virtual/dmi/id/sys_vendor'
#extend hardware '/bin/cat /sys/devices/virtual/dmi/id/product_name'
#extend serial '/bin/cat /sys/devices/virtual/dmi/id/product_serial'

# (uncomment for ARM platforms)
#extend hardware '/bin/cat /sys/firmware/devicetree/base/model'
#extend serial '/bin/cat /sys/firmware/devicetree/base/serial-number'

Si contásemos con un servidor físico podríamos descomentar las siguientes líneas:

extend manufacturer '/bin/cat /sys/devices/virtual/dmi/id/sys_vendor'
extend hardware '/bin/cat /sys/devices/virtual/dmi/id/product_name'
extend serial '/bin/cat /sys/devices/virtual/dmi/id/product_serial'

Habilitamos y reiniciamos el servicio de snmp.

sudo systemctl enable snmpd
sudo systemctl restart snmpd

Proceso de instalación web de LibreNMS

Una vez introducimos en un navegador la URL de nuestro virtual host en el caso de ejemplo https://librenms.boscolopez.cloud, nos mostrará lo siguiente, conforme cumplimos todos los requisitos.

Pulsaremos sobre el icono de la base de datos.

Introducimos los datos de configuración de la base de datos que hemos creado.

Pulsamos sobre el botón de Check Credentials y nos mostrará lo siguiente para que pulsemos acto seguido sobre el botón Build Database.

El proceso de generación de la base de datos tardará unos segundos y se nos confirmará si todo ha quedado correcto de la siguiente forma.

Pulsaremos sobre el icono de la llave.

Escribimos los datos del usuario administrador del entorno que queremos crear y pulsamos sobre el botón Add user.

Nos confirmará la creación del usuario.

Pulsaremos sobre el icono del check para finalizar el proceso de instalación.

Marcaremos la opciones que prefiramos y pulsamos el botón Finish Install.

Se nos mostrará el siguiente modal, que primero pulsaremos sobre Validate Install.

Para finalizar, se nos mostrará nuestro formulario de inicio de sesión, donde podremos introducir los datos del usuario y contraseña que hemos creado.

Agregando nuestro primer Host

Para agregar un host nuevo es un proceso muy sencillo, iremos al menú superior que pone Devices y nos desplazaremos hasta Add Device.

Se nos mostrará la siguiente pantalla, donde deberemos completar el hostname o la dirección IP del host que queremos monitorizar, seleccionar la versión de SNMP que vamos a utilizar y poner el nombre de la comunidad.

Pulsamos el botón Add Device.

Si ponemos el hostname o FQDN completo es necesario que nuestro servidor de LibreNMS lo pueda resolver, para ello, desde consola podríamos ejecutar un: nslookup librenms.boscolopez.cloud , esto nos debería devolver la dirección IP.

En unos segundos si todo ha ido bien, nos debería mostrar el siguiente mensaje.

Configurar SNMP

Para poder iniciar el descubrimiento automático de dispositivos que tengamos dentro de nuestra red, tendremos que configurar en cada uno de ellos SNMP en la versión que prefiramos para que así puedan ser dados de alta después en nuestro LibreNMS.

Para que sirva de guía, agregaré algunos ejemplos de cómo configurar SNMP en versión 2 utilizando como comunidad de sólo lectura monitorizando y que sólo puedan ser consultados desde la dirección IP de nuestro servidor LibreNMS que en este tutorial es 172.16.10.151.

¿Cómo configurar SNMP en Mikrotik v7?

Ya que los dispositivos Mikrotik nos permiten realizar configuraciones tanto desde consola como desde la interface de gestión Winbox, mostraré el proceso conectándonos al Mikrotik por SSH.

Configurar SNMP v2c en Mikrotik mediante SSH

Nos conectaremos por SSH a nuestro Mikrotik desde una consola y lo primero que tendremos que hacer en caso de no tener ya el servicio de SNMP habilitado es configurarlo correctamente.

Habilitar SNMP en Mikrotik

Para habilitar SNMP ejecutaremos el siguiente comando:

/snmp/set enabled=yes

Configuraremos el contacto ejecutando el siguiente comando:

/snmp/set contact="Bosco Lopez <tu@email.com>"

Asignaremos una localización asignando la ciudad donde se encuentra el dispositivo, el país y las coordenadas GPS para que después se nos muestre en el mapa que nos genera LibreNMS. Para obtener las coordenadas GPS yo utilizo Google Maps, pongo la dirección completa y pulso con el botón derecho del ratón sobre la ubicación.

El comando para insertar la ubicación sería de la siguiente forma:

/snmp/set location="A Coruna,Spain [43.36920,-8.41978]"
Crear comunidad SNMP en Mikrotik
/snmp/community/add name=monitorizando read-access=yes write-access=no addresses=172.16.10.151/32

Este comando nos generará la comunidad monitorizando que sólo tiene acceso de lectura y que es accesible desde la dirección IP 172.16.10.151, desde cualquier otra dirección IP no podría ser utilizada.

Si ejecutamos el siguiente comando veremos las comunidades SNMP que tenemos disponibles y su configuración:

/snmp/community/print

Os dejo la ejecución de ambos comandos:

[admin@r01] > /snmp/community/add name=monitorizando read-access=yes write-access=no addresses=172.16.10.151/32 comment=LibreNMS
[admin@r01] > /snmp/community/print
Flags: * - DEFAULT; X - DISABLED
Columns: NAME, ADDRESSES, SECURITY, READ-ACCESS, WRITE-ACCESS
#    NAME           ADDRESSES         SECURITY  READ-ACCESS  WRITE-ACCESS
0 *X public         ::/0              none      yes          no
;;; LibreNMS
1    monitorizando  172.16.10.151/32  none      yes          no
[admin@r01] >

Esta configuración en caso de tener múltiples dispositivos de Mikrotik podremos ejecutarla en todos.

¿Cómo configurar SNMP en Cisco Nexus NX-OS?

Nos conectamos por SSH a nuestro Cisco Nexus y ejecutamos los siguientes comandos para iniciar la configuración:

snmp-server community monitorizando ro
snmp-server contact "Bosco Lopez <tu@email.com>"
snmp-server location "A Coruna,Spain [43.36920,-8.41978]"

¿Cómo configurar SNMP en Cisco IOS?

Accedemos por SSH a nuestro dispositivo Cisco y escribimos los siguientes comandos:

snmp-sever community monitorizando ro
snmp-server contact "Bosco Lopez <tu@email.com>"
snmp-server location "A Coruna,Spain [43.36920,-8.41978]"

Descubrimiento automático de dispositivos en la red

Comenzaremos haciendo las primeras parametrizaciones específicas en nuestro fichero de configuración de LibreNMS, así que lo primero será loguearse con el usuario librenms, si estamos con nuestro usuario personal por ssh ejecutaremos:

sudo su - librenms

Si por el contrario ya estamos como root:

su - librenms

Una vez ejecutado estaremos por ssh con el usuario librenms y dentro del directorio /opt/librenms

librenms@librenms:~$ pwd
/opt/librenms

En este directorio tenemos el fichero de configuración config.php, así que lo editaremos ejecutando:

nano config.php

Por defecto este fichero tiene el siguiente contenido:

<?php

## Have a look in misc/config_definitions.json for examples of settings you can set here. DO NOT EDIT misc/config_definitions.json!

// This is the user LibreNMS will run as
//Please ensure this user is created and has the correct permissions to your install
#$config['user'] = 'librenms';

### This should *only* be set if you want to *force* a particular hostname/port
### It will prevent the web interface being usable form any other hostname
#$config['base_url']        = "/";

### Enable this to use rrdcached. Be sure rrd_dir is within the rrdcached dir
### and that your web server has permission to talk to rrdcached.
#$config['rrdcached']    = "unix:/var/run/rrdcached.sock";

### Default community
#$config['snmp']['community'] = array('public');

### Authentication Model
#$config['auth_mechanism'] = "mysql"; # default, other options: ldap, http-auth
#$config['http_auth_guest'] = "guest"; # remember to configure this user if you use http-auth

### List of RFC1918 networks to allow scanning-based discovery
#$config['nets'][] = "10.0.0.0/8";
#$config['nets'][] = "172.16.0.0/12";
#$config['nets'][] = "192.168.0.0/16";

# Uncomment the next line to disable daily updates
#$config['update'] = 0;

# Number in days of how long to keep old rrd files. 0 disables this feature
#$config['rrd_purge'] = 0;

# Uncomment to submit callback stats via proxy
#$config['callback_proxy'] = "hostname:port";

# Set default port association mode for new devices (default: ifIndex)
#$config['default_port_association_mode'] = 'ifIndex';

# Enable the in-built billing extension
#$config['enable_billing'] = 1;

# Enable the in-built services support (Nagios plugins)
#$config['show_services'] = 1;

Vamos a editarlo para poder hacer el descubrimiento automático de nuestros dispositivos, los valores que editaremos serán:

OriginalModificado
#$config[‘snmp’][‘community’] = array(‘public’);$config[‘snmp’][‘community’] = array(‘monitorizando’);
#$config[‘nets’][] = «10.0.0.0/8»;$config[‘nets’][] = «172.16.10.0/24»;
  • La primera línea que modificamos es la que tiene el contenido de la comunidad SNMP por defecto y que en el fichero de configuración se nos muestra con una almohadilla delante, la cual, quitaremos y sustituiremos el texto public por monitorizando que fue la comunidad que definimos en pasos anteriores.
  • La segunda línea que modificaremos será la que contiene una definición de red 10.0.0.0/8, línea a la cual también le quitaremos la almohadilla y escribiremos la red que tengamos configurada, en mi caso 172.16.10.0/24.

Si tenemos más redes, podríamos agregarlas, al igual que si utilizamos distintas comunidades SNMP, las cuales, separaríamos por comas.

El fichero de configuración quedaría de la siguiente manera:

<?php

## Have a look in misc/config_definitions.json for examples of settings you can set here. DO NOT EDIT misc/config_definitions.json!

// This is the user LibreNMS will run as
//Please ensure this user is created and has the correct permissions to your install
#$config['user'] = 'librenms';

### This should *only* be set if you want to *force* a particular hostname/port
### It will prevent the web interface being usable form any other hostname
#$config['base_url']        = "/";

### Enable this to use rrdcached. Be sure rrd_dir is within the rrdcached dir
### and that your web server has permission to talk to rrdcached.
#$config['rrdcached']    = "unix:/var/run/rrdcached.sock";

### Default community
$config['snmp']['community'] = array('monitorizando');

### Authentication Model
#$config['auth_mechanism'] = "mysql"; # default, other options: ldap, http-auth
#$config['http_auth_guest'] = "guest"; # remember to configure this user if you use http-auth

### List of RFC1918 networks to allow scanning-based discovery
$config['nets'][] = "172.16.10.0/24";
#$config['nets'][] = "172.16.0.0/12";
#$config['nets'][] = "192.168.0.0/16";

# Uncomment the next line to disable daily updates
#$config['update'] = 0;

# Number in days of how long to keep old rrd files. 0 disables this feature
#$config['rrd_purge'] = 0;

# Uncomment to submit callback stats via proxy
#$config['callback_proxy'] = "hostname:port";

# Set default port association mode for new devices (default: ifIndex)
#$config['default_port_association_mode'] = 'ifIndex';

# Enable the in-built billing extension
#$config['enable_billing'] = 1;

# Enable the in-built services support (Nagios plugins)
#$config['show_services'] = 1;

Si no tenemos resolución DNS de todos los dispositivos que podríamos querer agregar, podemos añadir al fichero de configuración lo siguiente para que permita añadirlos por dirección IP.

$config['discovery_by_ip'] = true;

Una vez configurado, podemos ejecutar el siguiente comando:

./snmp-scan.py

El proceso tardará un tiempo, pero al final nos mostrará los dispositivos que se han agregado.

librenms@librenms:~$ ./snmp-scan.py
Scanning IPs:
***++++............................+........................................................-..............................---*...............................................................................................-.......--...............****.***..-..-.......................*..............--..................................................-.................................*........-...-...-..............................................................................-....--.........*..*..*.*..***................--.................*........--...................................................-................................--...*...-...........................................................................--.....-........................----

Scanned 762 IPs: 22 known devices, added 8 devices, failed to add 33 devices
Runtime: 119.17 seconds

Si vamos al menú Devices y pulsamos sobre All Devices, podríamos ver algo así:

Comandos y configuraciones extras

Esta serie de comandos, los podríamos ejecutar desde el usuario librenms por SSH.

lnms config:set rrdcached "unix:/run/rrdcached.sock"
lnms config:set snmp.timeout 1                         # timeout in seconds
lnms config:set snmp.retries 5                         # how many times to retry the query
lnms config:set snmp.transports '["udp", "udp6", "tcp", "tcp6"]'    # Transports to use
lnms config:set snmp.version '["v2c", "v3", "v1"]'       # Default versions to use
lnms config:set snmp.port 161                          # Default port
lnms config:set snmp.exec_timeout 1200                 # execution time limit in seconds

Equipos que devuelven su nombre sin dominio

Algunos equipos bien sea por configuración o no, pueden que devuelvan sólo su hostname sin agregar el nombre del dominio configurado; por ejemplo que tengamos un equipo que nos devuelva servidor01, pero realmente sería servidor01.boscolopez.cloud, para estos casos podemos ejecutar el siguiente comando.

lnms config:set mydomain boscolopez.cloud

Excluir direccionamientos IP

Podemos excluir que no se realice auto descubrimiento de ciertos direccionamientos IP que no nos interesen, para ello ejecutaremos:

lnms config:set autodiscovery.nets-exclude.+ '192.168.20.0/24'

Métodos de auto descubrimiento

Los siguientes métodos de auto descubrimiento están presentes en LibreNMS y lo que mostraré en la tabla es si vienen activados por defecto y que deberíamos poner en el fichero de configuración config.php para desactivarlos o activarlos en caso de que nos interese.

MétodoEstadoTipo
ARPDeshabilitadoComandolnms config:set discovery_modules.discovery-arp true
XDPHabilitadoFichero$config[‘autodiscovery’][‘xdp’] = false;
OSPFHabilitadoFichero$config[‘autodiscovery’][‘ospf’] = false
BGPHabilitadoFichero$config[‘autodiscovery’][‘bgp’] = false;

Cuando estamos haciendo una configuración por comando, pero no nos sabemos todos los parámetros, podemos ir escribiendo y tabulando para que nos muestre las opciones
librenms@librenms:~$ lnms config:set discovery_modules.
discovery_modules.applications          discovery_modules.discovery-protocols   discovery_modules.mef                   discovery_modules.services
discovery_modules.arp-table             discovery_modules.entity-physical       discovery_modules.mempools              discovery_modules.slas
discovery_modules.bgp-peers             discovery_modules.entity-state          discovery_modules.mpls                  discovery_modules.storage
discovery_modules.cisco-cbqos           discovery_modules.fdb-table             discovery_modules.ntp                   discovery_modules.stp
discovery_modules.cisco-cef             discovery_modules.hr-device             discovery_modules.os                    discovery_modules.ucd-diskio
discovery_modules.cisco-mac-accounting  discovery_modules.ipv4-addresses        discovery_modules.ports                 discovery_modules.vlans
discovery_modules.cisco-otv             discovery_modules.ipv6-addresses        discovery_modules.ports-stack           discovery_modules.vmware-vminfo
discovery_modules.cisco-pw              discovery_modules.isis                  discovery_modules.printer-supplies      discovery_modules.vrf
discovery_modules.cisco-qfp             discovery_modules.junose-atm-vp         discovery_modules.processors            discovery_modules.wireless
discovery_modules.cisco-vrf-lite        discovery_modules.libvirt-vminfo        discovery_modules.route                 discovery_modules.xdsl
discovery_modules.discovery-arp         discovery_modules.loadbalancers         discovery_modules.sensors
librenms@librenms:~$ lnms config:set discovery_modules.

Instalación y configuración de Oxidized

Lo primero de todo será implementar una serie de paquetes

sudo apt  install ruby ruby-dev libsqlite3-dev libssl-dev pkg-config cmake libssh2-1-dev libicu-dev zlib1g-dev g++ -y

Después instalaremos Oxidized y una versión específica del paquete psych, en otras instalaciones lo he tenido que especificar para que no me diese problemas a la larga.

gem install oxidized
gem install oxidized-script
gem install su oxidized-web
gem install psych -v 3.3.2

Creamos el usuario oxidized:

useradd oxidized -s /bin/bash -d /home/oxidized/ -m

Asignamos una contraseña al usuario y lo agregamos al grupo sudo:

passwd oxidized
usermod -aG sudo oxidized

Nos identificamos con el usuario oxidized:

su - oxidized

Verificamos con el comando pwd en qué directorio estamos, para comprobar que lo creamos de manera correcta:

oxidized@librenms:~$ pwd
/home/oxidized/

Asignamos como propietario del directorio a oxidized

sudo chown -R oxidized:oxidized /home/oxidized

Ejecutamos el comando oxidized, os muestro la salida para que comprobéis que aún seguimos identificados con el usuario oxidized.

oxidized@librenms:~$ oxidized
edit ~/.config/oxidized/config
oxidized@librenms:~$

Editamos el fichero config cuya ruta completa es /home/oxidized/.config/oxidized/config.

nano /home/oxidized/.config/oxidized/config

El fichero por defecto que nos genera en formato YAML es el siguiente:

---
username: username
password: password
model: junos
resolve_dns: true
interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
rest: 127.0.0.1:8888
next_adds_job: false
vars: {}
groups: {}
models: {}
pid: "/home/oxidized/.config/oxidized/pid"
crash:
  directory: "/home/oxidized/.config/oxidized/crashes"
  hostnames: false
stats:
  history_size: 10
input:
  default: ssh, telnet
  debug: false
  ssh:
    secure: false
  ftp:
    passive: true
  utf8_encoded: true
output:
  default: file
source:
  default: csv
model_map:
  juniper: junos
  cisco: ios

En las líneas 2 y 3 nos encontramos los valores de username y password, que utilizaremos en el caso de que para nuestra electrónica tengamos un usuario y contraseña común.

Como nos encontramos en un entorno de laboratorio y después veremos como podemos especificar por fabricante, definiremos que tenemos un usuario creado en la electrónica de red que se llama oxidized y que tiene como contraseña ox1d1z3d.

Antes de ponernos a retocar el fichero de configuración, crearemos un usuario desde la interface web de LibreNMS para poder realizar consultar vía API desde Oxidized hacia LibreNMS.

¿Cómo crear un usuario en LibreNMS con acceso vía API?

En la parte superior derecha de la interface web de LibreNMS, tenemos a la derecha de nuestro nombre de usuario el icono de una tuerca que nos desplegará un menú donde seleccionaremos Manage Users.

Pulsaremos el botón Add User:

Cumplimentamos los datos del formulario con los siguientes valores de ejemplo:

CamposValores
Usernameoxidized
Real NameOxidized
EnabledON
Emailoxidized@tumail.com
DescriptionGestión de configuraciones
LevelAdmin
Dashboard
Passwordcontraseñahipersegura
Can Modify PasswordOFF
TimezoneEurope/Madrid

Ahora que ya tenemos nuestro usuario oxidized creado, iremos otra vez al menú superior, nos desplazaremos a la opción API y seleccionamos API Settings.

Pulsamos el botón Create API access token:

Se nos abrirá un modal, donde podemos seleccionar en el desplegable de User, el usuario oxidized que acabamos de crear y pulsaremos el botón Create API Token.

Ahora se nos mostrará el Token Hash de nuestro usuario oxidized que copiaremos para poder agregar al fichero de configuración de oxidized.

Fichero de configuración Oxidized integrado con LibreNMS

El siguiente es el fichero de configuración de Oxidized integrado con LibreNMS donde tenemos que prestar atención a los siguientes valores para sustituirlos por los que correspondan con nuestro entorno:

ValoresDescripción
usernameUsuario por defecto de acceso a nuestros dispositivos
passwordContraseña por defecto de acceso
restDirección IP y puerto donde tenemos expuesto Oxidized
urlURL completa de la API de nuestro LibreNMS
X-Auth-TokenToken generado en la interface web de LibreNMS para el usuario de Oxidized

Fichero de configuración:

---
username: oxidized
password: ox1diz3d
model: junos
resolve_dns: true
interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
rest: 172.16.10.151:8888
next_adds_job: false
vars: {}
groups:
   defaultgrp:
     username: default
     password: default
   routeros:
     username: usroxidized
     password: pwdusroxi
     vars:
       ssh_port: 22
models: {}
pid: "/home/oxidized/.config/oxidized/pid"
crash:
  directory: "/home/oxidized/.config/oxidized/crashes"
  hostnames: false
stats:
  history_size: 10
input:
  default: ssh, telnet
  debug: false
  ssh:
    secure: false
  ftp:
    passive: true
  utf8_encoded: true
output:
  default: file
  file:
    directory: "/home/oxidized/.config/oxidized/configs
source:
  default: http
  debug: false
  http:
    url: https://librenms.boscolopez.cloud/api/v0/oxidized
    file: "/hom/oxidized/.config/oxidized/router.db"
    delimiter: !ruby/regexp /:/
    map:
      name: hostname
      model: os
      group: group
    headers:
      X-Auth-Token: "2c65a58755ef24ede5c6e079b247c633"
model_map:
  mikrotik: routeros

Creamos el directorio configs y generamos el fichero router.db desde el propio usuario oxidized.

mkdir -p ~/.config/oxidized/configs
mkdir -p ~/.config/oxidized/crashes
touch ~/.config/oxidized/router.db

Antes de volver a ejecutar oxidized, vamos a realizar las configuraciones necesarias en LibreNMS.

Configuración de LibreNMS para la integración con Oxidized

Nos ponemos en nuestra consola ssh como root y nos identificamos como el usuario librenms.

su - librenms

Editamos el fichero config.php para agregar las siguientes líneas:

$config['oxidized']['enabled']                  = TRUE;
$config['oxidized']['url']                      = 'http://172.16.10.151:8888';
$config['oxidized']['features']['versioning']   = true;
$config['oxidized']['group_support']            = true;
$config['oxidized']['default_group']            = 'oxidized';
$config['oxidized']['reload_nodes']             = true;
$config['oxidized']['ignore_os'] = array('linux','windows');
$config['oxidized']['ignore_types'] = array('server','power');

Debéis sustituir la dirección IP 172.16.10.151 por la vuestra
VariableDescripción
enabledHabilitamos la integración con Oxidized.
urlLa URL donde tendremos disponible la interface web de Oxidized.
versioningHabilitar el control de versiones.
group_supportPara poder utilizar la gestión mediante grupos de dispositivos.
default_groupGrupo predeterminado que utilizará oxidized para capturar las configuraciones.
reload_nodesPermite recargar la lista cada vez que se agrega un dispositivo a LibreNMS.
ignore_osIgnorar por sistema operativo.
ignore_typesIgnorar por tipos de dispositivos.

Fichero de configuración Oxidized parametrizado

Este es el fichero de configuración que quedaría para este entorno.

---
resolve_dns: true
interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
rest: 172.16.10.151:8888
next_adds_job: false
vars: {}
groups:
   defaultgrp:
     username: oxidized
     password: ox1diz3d
   oxidized:
     username: usroxidized
     password: unapasswordsegura
     vars:
       ssh_port: 22
models: {}
pid: "/home/oxidized/.config/oxidized/pid"
crash:
  directory: "/home/oxidized/.config/oxidized/crashes"
  hostnames: false
stats:
  history_size: 10
input:
  default: ssh, telnet
  debug: false
  ssh:
    secure: false
  ftp:
    passive: true
  utf8_encoded: true
output:
  default: file
  file:
    directory: "/home/oxidized/.config/oxidized/configs"
source:
  default: http
  debug: false
  http:
    url: https://librenms.boscolopez.cloud/api/v0/oxidized
    file: "/hom/oxidized/.config/oxidized/router.db"
    delimiter: !ruby/regexp /:/
    map:
      name: hostname
      model: os
      group: group
    headers:
      X-Auth-Token: "2c65a58755ef24ede5c6e079b247c633"
model_map:
  mikrotik: routeros

Configurar Oxidized como servicio

Desde el usuario root localizamos donde está el fichero oxidized.service, que podemos hacerlo con el comando locate y con whereis localizamos el binario.

root@librenms ~ # locate oxidized.service
/var/lib/gems/2.7.0/gems/oxidized-0.28.0/extra/oxidized.service
root@librenms ~ # whereis oxidized.service
oxidized: /usr/local/bin/oxidized

Copiamos oxidized.service a la ruta /usr/lib/systemd/system/

cp /var/lib/gems/2.7.0/gems/oxidized-0.28.0/extra/oxidized.service /usr/lib/systemd/system/

Habilitamos que el servicio oxidized arranque con el sistema, pero por el momento no lo iniciaremos, aún nos quedan algunas configuraciones que realizar.

systemctl daemon-reload
systemctl enable oxidized

Crear un grupo en LibreNMS para Oxidized

En la interface web de LibreNMS, crearemos un grupo para los dispositivos que queremos que Oxidized nos gestione y haga copia de sus configuraciones, para esto vamos al menú Devices y pulsamos en Manage Groups.

Pulsamos en el botón New Device Group.

En el formulario que se nos muestra, seleccionamos como Type, Stactic y seleccionamos uno de nuestros dispositivos en mi caso r01.boscolopez.cloud que es un router Mikrotik CCR.

A este grupo podremos ir añadiendo todos los dispositivos de los que queramos gestionar sus configuraciones con Oxidized y el nombre del grupo debe coincidir con lo que definimos en el fichero config.php de LibreNMS en la variable: $config[‘oxidized’][‘default_group’] = ‘oxidized’;

Verificar la configuración de Oxidized en LibreNMS

En la interface web de LibreNMS parte superior derecha desplegaremos el menú de configuración e iremos a la sección Global Settings.

Esta pantalla nos presenta todas configuraciones de LibreNMS, dividida por secciones que se nos representan en distintos tabs.

Iremos a la sección de External y desplegaremos Oxidized Integration.

Podremos verificar que la configuración que agregamos en nuestro fichero config.php la tenemos aquí disponible e incluso podremos añadir o editar.

Crear el usuario oxidized en Mikrotik

Si queremos que nuestra integración funcione, deberemos crear en los dispositivos de los cuales queremos hacer una copia de seguridad y versionado de la configuración el usuario que hemos definido que tendrá acceso desde el servicio oxidized.

En nuestro fichero de configuración de oxidized definimos que para los dispositivos con sistema routeros, utilizaremos como usuario usroxidized y contraseña pwdoxidized, así que vamos a crear este usuario con permisos sólo de lectura en nuestro Mikrotik.

[admin@r01] > user/add name=usroxidized password=unapasswordsegura group=read

Iniciando el servicio Oxidized

Ya estamos listo para iniciar el nuestro servicio de Oxidized y comprobar que nos realiza el volcado de la configuración de nuestro dispositivo.

systemctl start oxidized.service
systemctl status oxidized.service

Si hemos seguido todos los pasos, podremos primero acceder a la interface web de Oxidized en este ejemplo es http://172.16.10.151:8888 y verificar que se están realizando las copias de nuestras configuraciones.

Si queremos visualizarlo en LibreNMS, iremos al menú Devices, All Devices y en el buscador filtraremos por el nombre de nuestro dispositivo.

Pulsamos sobre el nombre del dispositivo y veremos en uno de los tabs el nombre Config.

Al pulsar sobre Config, podremos verificar la última sincronización de la configuración y la configuración que tenemos aplicada en nuestro router.

Configurar Virtual Host en Nginx para Oxidized

Vamos a crear un virtual host en Nginx para la interface web de Oxidized y que esta sólo sea accesible desde nuestra red LAN.

La configuración del fichero de Nginx para que el site https://oxidized.boscolopez.cloud, sea sólo accesible desde la red 172.16.10.0/24 sería el siguiente:

server {
        listen      80;
        server_name oxidized.boscolopez.cloud;

        if ($host = oxidized.boscolopez.cloud) {
            return 301 https://$host$request_uri;
        }

}

server {
    listen 443 ssl http2;
    server_name oxidized.boscolopez.cloud;
    ssl_certificate /etc/letsencrypt/live/oxidized.boscolopez.cloud/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/oxidized.boscolopez.cloud/privkey.pem;
    ssl_session_cache shared:SSL:50m;
    add_header Strict-Transport-Security "max-age=63072000" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/oxidized.boscolopez.cloud/chain.pem;
    resolver 172.16.10.1;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    location / {
             allow 172.16.10.0/24;
             deny all;
             proxy_pass http://172.16.10.151:8888/;
    }
    access_log /var/log/nginx/access_oxidized.log;
    error_log /var/log/nginx/error_oxidized.log;
}

Integración plugins de Nagios en LibreNMS

Vamos a proceder a integrar los plugins de monitorización de Nagios en LibreNMS para así poder monitorizar ciertos servicios que tengamos en nuestros servidores corriendo en la propia interface de LibreNMS.

Instalación de paquetes necesarios

Instalaremos el paquete monitoring-plugins con el siguiente comando:

sudo apt install monitoring-plugins -y

Asignamos permisos de ejecución a todos los plugins:

sudo chmod +x /usr/lib/nagios/plugins/*

Configuración en LibreNMS para integrar Nagios Plugins

Nos identificamos con el usuario librenms para así editar el fichero config.php.

sudo su - librenms

En este fichero agregaremos las siguientes líneas:

$config['show_services'] = 1;
$config['discover_services'] = true;
$config['discover_services_templates'] = true;
$config['nagios_plugins'] = "/usr/lib/nagios/plugins";
$config['service_poller_enabled'] = true;
$config['service_poller_workers'] = 16;
$config['service_poller_frequency'] = 300;
$config['service_poller_down_retry'] = 5;
$config['service_discovery_enabled'] = true;
$config['service_discovery_workers'] = 16;
$config['service_discovery_frequency'] = 3600;
$config['service_services_enabled'] = true;
$config['service_services_workers'] = 16;
$config['service_services_frequency'] = 60;

Cerramos sesión del usuario librenms y editamos el fichero /etc/cron.d/librenms para agregar la siguiente línea:

*/5 * * * * librenms /opt/librenms/services-wrapper.py 1

Agregar monitorización de un servicio en LibreNMS

Probaremos la funcionalidad de monitorizar servicios con los plugins de Nagios desde LibreNMS, agregando la monitorización http de nuestro LibreNMS https://librenms.boscolopez.cloud, así que abrimos la interface web de LibreNMS y veremos en el menú Services, vamos a Add Service.

En el formulario que se nos muestra lo cumplimentamos de la siguiente forma.

Desde el menú Services, All Services, podremos listar todos los servicios que tengamos monitorizados o bien mostrar sólo los que estén Ok, Warning o Ciritical.

Implementación de FastPing

Por defecto LibreNMS envía un ping a cada dispositivo antes de sondearlo, para así comprobar si está activo o inactivo. Esta verificación se vincula con la frecuencia establecida por defecto en 5 minutos, por lo que podría tardar algo más de 5 minutos en informarnos si un dispositivo está caído.

En el caso de dispositivos críticos, este intervalo de 5 minutos podría llegarnos a generar un problema grave, por lo que LibreNMS incorpora un script ping.php que ejecuta comprobaciones única y exclusivamente a nivel ICMP sin llegar a sondearlo a nivel SNMP.

Para activar esta funcionalidad, podemos hacerlo de dos manera que procedo a explicar.

Activar FastPing en fichero de configuración

Necesitamos loguearnos con el usuario librenms, para ello, ejecutaremos el siguiente comando.

sudo su - librenms

Ahora desde el propio usuario librenms, que su home se encuentra ya en el directorio /opt/librenms, editaremos el fichero config.php y agregaremos lo siguiente al final del mismo.

#Fast Ping
$config['ping_rrd_step'] = 60;

Activar FastPing desde consola

Para activar FastPing de una manera rápida, tendremos que identificarnos como el usuario librenms y ejecutar en consola el siguiente comando:

lnms config:set ping_rrd_step 60

Actualizar los archivos RRD y modificar el cron

Da igual la opción anterior que seleccionemos para agregar la funcionalidad de FastPing que este paso será común para las dos.

Como ya estamos identificados con el usuario librenms, ejecutaremos lo siguiente:

./scripts/rrdstep.php -h all

Ahora procederemos a editar el fichero librenms que tenemos en /etc/cron.d/, para esto saldremos del usuario librenms y los editaremos bien como root o con nuestro usuario anteponiendo sudo.

Al final del fichero agregamos la siguientes líneas:

#Fast Ping
*    *    * * *   librenms    /opt/librenms/ping.php >> /dev/null 2>&1

Integración SmokePing y LibreNMS

SmokePing nos permite realizar un seguimiento de la latencia entre nuestros dispositivos de red y visualizarla mediante los gráficos RRD.

Instalar SmokePing en Debian 11

Para instalar SmokePing en Debian 11 sólo tendremos que ejecutar el siguiente comando:

sudo apt install -y smokeping

Una vez finaliza el proceso de instalación, vamos a copiar el fichero de ejemplo que viene con LibreNMS para que se ejecute cada hora y lo convertimos en ejecutable.

sudo cp /opt/librenms/misc/smokeping-debian.example /etc/cron.hourly/librenms-smokeping
sudo chmod +x /etc/cron.hourly/librenms-smokeping

Modificaremos el fichero Probes que se encuentra en el directorio /etc/smokeping/config.d/.

Este fichero originalmente tiene el siguiente contenido:

*** Probes ***

+ FPing

binary = /usr/bin/fping

Eliminamos el contenido y lo dejaremos de la siguiente manera:

*** Probes ***

@include /etc/smokeping/config.d/librenms-probes.conf

Ahora editamos el fichero Targets que se encuentra en el directorio /etc/smokeping/config.d/.

Este fichero por defecto contiene lo siguiente:

*** Targets ***

probe = FPing

menu = Top
title = Network Latency Grapher
remark = Welcome to the SmokePing website of xxx Company. \
         Here you will learn all about the latency of our network.

+ Local

menu = Local
title = Local Network
#parents = owner:/Test/James location:/

++ LocalMachine

menu = Local Machine
title = This host
host = localhost
#alerts = someloss

Eliminamos todo el contenido y agregamos lo siguiente:

*** Targets ***

probe = FPing

menu = Top
title = Network Latency Grapher
remark = Welcome to the SmokePing website of <b>boscolopez.com</b>. \
         Here you will learn all about the latency of our network.

@include /etc/smokeping/config.d/librenms-targets.conf

Añadir configuración en LibreNMS

Nos identificamos con el usuario librenms y esta vez añadiremos la configuración directamente desde consola ejecutando las siguientes líneas.

lnms config:set smokeping.dir '/var/lib/smokeping'
lnms config:set smokeping.pings 20
lnms config:set smokeping.probes 2
lnms config:set smokeping.integration true
lnms config:set smokeping.url 'smokeping/'

Por si alguno prefiere tenerlo en el fichero config.php, se añadiría lo siguiente:

#SmokePing
$config['smokeping']['dir'] = '/var/lib/smokeping';
$config['smokeping']['pings'] = 20;
$config['smokeping']['probes'] = 2;
$config['smokeping']['integration'] = true;
$config['smokeping']['url'] = 'smokeping/';

Configurar SmokePing en Nginx

Ya que en este documento hemos implementado la Nginx como servidor web, la configuración siguiente sólo aplicará para Nginx.

Lo primero que debemos realizar es instalar el paquete fcgiwrap y lo haremos ejecutando la siguiente línea:

sudo apt install fcgiwrap

Copiamos el fichero nginx.conf que se encuentra en el directorio /usr/share/doc/fcgiwrap/examples/ a /etc/nginx/ pero con el nombre fcgiwrap.conf.

sudo cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf

Editamos nuestro Virtual Host destinado a LibreNMS para agregar la configuración de SmokePing, contando que en la configuración que hicimos anteriormente pusimos que la URL de acceso sería /smokeping/ (lnms config:set smokeping.url ‘smokeping/’).

sudo nano /etc/nginx/sites-available/librenms_boscolopez_cloud.conf

Nuestro fichero hasta el momento tenía la siguiente configuración:

server {
        listen      80;
        server_name librenms.boscolopez.cloud;

        if ($host = librenms.boscolopez.cloud) {
            return 301 https://$host$request_uri;
        }

}

server {
    listen 443 ssl http2;
    server_name librenms.boscolopez.cloud;
    ssl_certificate /etc/letsencrypt/live/librenms.boscolopez.cloud/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/librenms.boscolopez.cloud/privkey.pem;
    ssl_session_cache shared:SSL:50m;
    add_header Strict-Transport-Security "max-age=63072000" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/librenms.boscolopez.cloud/chain.pem;
    resolver 172.16.10.1;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    root        /opt/librenms/html;
    index       index.php;
    charset utf-8;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ [^/]\.php(/|$) {
        fastcgi_pass unix:run/php/php-fpm-librenms.sock;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi.conf;
    }
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Ahora quedará así:

server {
        listen      80;
        server_name librenms.boscolopez.cloud;

        if ($host = librenms.boscolopez.cloud) {
            return 301 https://$host$request_uri;
        }

}

server {
    listen 443 ssl http2;
    server_name librenms.boscolopez.cloud;
    ssl_certificate /etc/letsencrypt/live/librenms.boscolopez.cloud/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/librenms.boscolopez.cloud/privkey.pem;
    ssl_session_cache shared:SSL:50m;
    add_header Strict-Transport-Security "max-age=63072000" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/librenms.boscolopez.cloud/chain.pem;
    resolver 172.16.10.1;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    root        /opt/librenms/html;
    index       index.php;
    charset utf-8;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ [^/]\.php(/|$) {
        fastcgi_pass unix:run/php/php-fpm-librenms.sock;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi.conf;
    }
    location ~ /\.(?!well-known).* {
        deny all;
    }
# http://librenms.boscolopez.cloud/smokeping/
    location = /smokeping/ {
            fastcgi_intercept_errors on;

            fastcgi_param   SCRIPT_FILENAME         /usr/lib/cgi-bin/smokeping.cgi;
            fastcgi_param   QUERY_STRING            $query_string;
            fastcgi_param   REQUEST_METHOD          $request_method;
            fastcgi_param   CONTENT_TYPE            $content_type;
            fastcgi_param   CONTENT_LENGTH          $content_length;
            fastcgi_param   REQUEST_URI             $request_uri;
            fastcgi_param   DOCUMENT_URI            $document_uri;
            fastcgi_param   DOCUMENT_ROOT           $document_root;
            fastcgi_param   SERVER_PROTOCOL         $server_protocol;
            fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
            fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;
            fastcgi_param   REMOTE_ADDR             $remote_addr;
            fastcgi_param   REMOTE_PORT             $remote_port;
            fastcgi_param   SERVER_ADDR             $server_addr;
            fastcgi_param   SERVER_PORT             $server_port;
            fastcgi_param   SERVER_NAME             $server_name;
            fastcgi_param   HTTPS                   $https if_not_empty;

            fastcgi_pass unix:/var/run/fcgiwrap.socket;
    }

    location ^~ /smokeping/ {
            alias /usr/share/smokeping/www/;
            index smokeping.cgi;
            gzip off;
    }
}

Reiniciamos los servicios de Nginx y PHP y accedemos a nuestro LibreNMS.

sudo systemctl restart nginx && sudo systemctl restart php8.2-fpm.service

Al acceder a la interface web de nuestro LibreNMS, en el menú Overview, nos desplazaremos a Tools y veremos ahí el acceso a la interface de SmokePing.

Si se han seguido todos los pasos realizados hasta el momento, tendréis que ver algo parecido a esto.

Integrar Graylog en LibreNMS

Al inicio del documento ya hemos implementado los repositorios de MongoDB y ElasticSearch que precisamos para hacer la instalación, así que comencemos.

Instalar MongoDB 6

La versión que implementaremos es MongoDB 6.

sudo apt install -y mongodb-org

Ejecutamos los siguientes comandos para que se recargue el daemon, se habilite el arranque el inicio de mongodb, reiniciamos el servicio de mongodb y verificamos que el servicio esté activo.

sudo systemctl daemon-reload
sudo systemctl enable mongod.service
sudo systemctl restart mongod.service
sudo systemctl --type=service --state=active | grep mongod

Instalar ElasticSearch 7.10.2

Ejecutaremos el siguiente comando para realizar la instalación de la versión específica 7.10.2.

sudo apt install -y elasticsearch=7.10.2

Modificar fichero elasticsearch.yml

Editaremos el fichero elasticsearch.yml que se encuentra en el directorio /etc/elasticsearch/.

En este fichero modificaremos la siguiente variable:

  • cluster.name, viene por defecto comentada y con el nombre my-application, la descomentamos borrando la almohadilla (#) y sustituimos my-application por graylog.
OriginalModificada
#cluster.name: my-applicationcluster.name: graylog

Una vez guardado el fichero podremos reiniciar el servicio de ElasticSearch, así que ejecutaremos los siguientes comandos:

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl restart elasticsearch.service
sudo systemctl --type=service --state=active | grep elasticsearch

Instalar Graylog en Debian 11

La versión de Graylog que implementaremos es la 5.1 y lo realizaremos ejecutando lo siguiente.

wget https://packages.graylog2.org/repo/packages/graylog-5.1-repository_latest.deb
sudo dpkg -i graylog-5.1-repository_latest.deb
sudo apt update && sudo apt install -y graylog-server

Editar el fichero de configuración de Graylog

El fichero de configuración se encuentra en la ruta /etc/graylog/server/ y tiene el nombre de server.conf.

En este fichero necesitamos dos variables root_password_sha2 y password_secret, para generar estos valores ejecutaremos lo siguiente.

Generar password_secret Graylog

Lo primero instalamos el paquete pwgen y el valor que nos devuelva al ejecutar pwgen -N… lo copiaremos en la variable password_secret del fichero server.conf.

sudo apt install pwgen
sudo pwgen -N 1 -s 96

Generar root_password_sha2 Graylog

Para generar esta contraseña, definimos una «SuperMegaContraseña» y ejecutamos el siguiente comando, ya que el valor que nos devuelva es el que debemos introducir en la variables root_password_sha2 del fichero server.conf

echo -n SuperMegaContraseña | shasum -a 256

Virtual Host Graylog en Nginx

La configuración que vamos a realizar de este Virtual Host aplicará tanto si tenemos un servidor dedicado como si utilizamos un servidor en modo Capa 3 como balanceador.

El fichero de nuestro Virtual Host quedaría así:

server {
        listen      80;
        server_name graylog.boscolopez.cloud;

        if ($host = graylog.boscolopez.cloud) {
            return 301 https://$host$request_uri;
        }



}

server {
    listen 443 ssl http2;
    server_name graylog.boscolopez.cloud;
    ssl_certificate /etc/letsencrypt/live/graylog.boscolopez.cloud/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/graylog.boscolopez.cloud/privkey.pem;
    ssl_session_cache shared:SSL:50m;
    add_header Strict-Transport-Security "max-age=63072000" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/graylog.boscolopez.cloud/chain.pem;
    resolver 172.16.10.1;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    location / {
             proxy_set_header Host $http_host;
             proxy_set_header X-Forwarded-Host $host;
             proxy_set_header X-Forwarded-Server $host;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header X-Graylog-Server-URL http://$server_name/;
             proxy_pass http://127.0.0.1:9000/;
    }
    access_log /var/log/nginx/access_graylog.log;
    error_log /var/log/nginx/error_graylog.log;

}

Añadir configuración al fichero config.php de LibreNMS

Nos identificaremos con el usuario librenms y editaremos el fichero config.php para agregar las siguientes líneas:

#Graylog
$config['graylog']['server'] = 'https://graylog.boscolopez.cloud';
$config['graylog']['username'] = 'admin';
$config['graylog']['password'] = 'SuperMegaContraseña';
$config['graylog']['version'] = '5.1';
$config['graylog']['timezone'] = 'Europe/Madrid';
$config['graylog']['match-any-address'] = 'true';

Crear Stream en Graylog

Accedemos a la URL de nuestro Graylog https://graylog.boscolopez.cloud y vamos al menú Streams; una vez cargado este menú se nos mostrará en la parte derecha el botón Create Stream, el cual, pulsaremos.

Cumplimentamos el formulario añadiendo como título LibreNMS y descripción LibreNMS o LibreNMS Logs, eso al gusto del consumidor.

Ahora en el menú superior vamos a System/Inputs y seleccionamos en el desplegable el menú Inputs.

Al cargarnos la pantalla de Inputs, veremos que tenemos un desplegable para seleccionar el tipo de Input, el que necesitamos es de tipo Raw/Plaintext UDP.

Una vez lo seleccionamos pulsamos en el botón Launch new input y cumplimentamos los siguientes datos en el formulario:

CampoValor
TitleElastic
Port5556
No. of worker threads6

Una vez pulsemos en el botón Launch Input se nos mostrará lo siguiente:

Volvemos al menú Streams y veremos que el Stream LibreNMS está pausado, pulsamos sobre el botón Paused para que se inicie.

Una vez pulsemos veremos lo siguiente:

Volvemos al menú System / Inputs y vamos a Inputs, pulsando en el botón Show Received messages del input que generamos con el nombre de Elastic.

Al pulsar sobre este botón se nos mostrará un buscador con un texto del tipo gl2_source_input:64899f63561cdb7f93b5a403, copiamos este valor y nos vamos al menú Streams y en el menú More de nuestro Streams llamado LibreNMS seleccionamos Manages Rules.

Pulsamos el botón verde Add Stream Rules y cumplimentamos lo siguiente:

CampoValor
Fieldgl2_source_input
Typematch exactly
Value64899f63561cdb7f93b5a403

El campo value se cumplimentará con el dato que habéis copiado vosotros, no será el mismo que muestro aqui.

Pulsamos el botón Create Rule y de seguido el botón I’m done!

Ahora ya estamos listos para configurar algún dispositivo de nuestra electrónica para que envíe mensajes.

Configurar Mikrotik para que remita datos a Graylog

Para configurar en un Mikrotik el envío de información hacia nuestro Graylog, iremos al menú System y opción Logging.

En la pantalla que se nos abre, iremos primero al Tab Actions y editaremos la de remote.

Aquí cumplimentaremos los siguientes datos:

CampoValorDescripción
Typeremote
Remote Address172.16.10.151Dirección IP de nuestro servidor Graylog
Remote Port5556Puerto que configuramos a nuestro Input Elastic
Src. Address172.16.10.2Dirección IP de nuestro dispositivo de red

Ahora en la pestaña Rules añadiremos pulsando en + una nueva regla para este ejemplo.

TopicsinterfaceSeleccionamos el topic asociado a eventos de todas las interfaces
PrefixElasticEl prefijo que se asocia con nuestro input
ActionremoteLa acción que hemos creado anteriormente

En estos momentos si deshabilitamos una interface de red de nuestro dispositivo, recibiríamos lo siguiente en nuestro Graylog

Dentro de nuestro LibreNMS podremos ver esta información en el menú OverView, Graylog.

User Rating: 4.7 ( 1 votes)

Check Also

Propiedades Hardware máquina virtual Proxmox

Migrar máquina virtual de VMware a Proxmox

Con todos los cambios que se están anunciando desde la compra de VMware por parte …

Deja una respuesta