Cómo crear una lista blanca de acceso de direcciones IP usando tan solo systemd

Buscando alternativas para bloquear intentos de conexión al servicio SSH que llenaban los registros sin tener que crear reglas con iptables o nft, systemd documenta cómo controlar los recursos.

En el manual de systemd.resource-control se documenta IPAccounting=, que permite habilitar la característica.

La manera eficiente de personalizar un fichero de configuración de unidades de systemd es mediante su sistema de sobrescritura de configuración. Por ejemplo, para personalizar sshd.service se puede ejecutar:

sudo systemctl edit sshd

Y luego simplemente agregar líneas. En este caso se pretendía agregar líneas nuevas a la sección [Service], por lo que solamente hay que poner el nombre de la sección y las líneas a personalizar. El fichero a editar aparecerá con una muestra de líneas comentadas, que por el hecho de estar desactivadas se pueden borrar si se desea.

Con este ejemplo se quería bloquear el acceso desde cualquier dirección IP al servicio de SSH, excepto desde algunos prefijos de direcciones (lista blanca):

[Service]
IPAccounting=yes
IPAddressDeny=any
IPAddressAllow=2001:db8::/32
IPAddressAllow=192.0.2.0/24
IPAddressAllow=198.51.100.0/24
IPAddressAllow=203.0.113.0/24

Esta forma de configurar permite tanta flexibilidad como permitan las unidades de systemd y los grupos de control de Linux. Sin servicios adicionales ni reglas complejas.

3 comentarios en “Cómo crear una lista blanca de acceso de direcciones IP usando tan solo systemd

  1. RandallZR:

    Genial estrategia. Lo simple es lo más efectivo en ocasiones.

    1. Francisco de la Peña:

      Gracias Randall, aprovecho para mencionar que esta técnica requiere grupo de control versión 2 (cgroupv2), por lo que requiere una distribución relativamente reciente que lo tenga habilitado. Por ejemplo, en CentOS 8 está soportado pero deshabilitado por defecto. En esta distribución puede habilitar en la línea de arranque del kernel en la configuración de GRUB, agregando systemd.unified_cgroup_hierarchy=1
      Históricamente Docker no funciona con cgroupv2, por esta razón se ha venido recomendando podman que sí lo soporta.
      Saludos.

  2. Francisco de la Peña:

    Conviene comentar que agregar listas muy grandes, por ejemplo una lista blanca, como las de ipverse.net, a partir de miles de líneas puede causar problemas de rendimiento en el procesado de las listas en versiones de systemd anteriores a la 250. En el ticket #20680 de systemd en github se puede obtener más información.

Responder a Francisco de la Peña

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *