Limitar acceso por SSH únicamente a ciertas IP con FirewallD

De Apuntes

FirewallD

FirewallD es una solución de firewall que viene con los Linux que utilizan SystemD como administrador de servicios (RHEL, CentOS, Rocky Linux, entre otros). A diferencia de Iptables, FirewallD divide el tráfico que recibe la máquina por zonas, donde cada zona puede tener asociadas interfaces de red y sus reglas específicas de filtrado. De esta forma, se puede tener una zona configurada para los servicios que sean accesados mediante una IP pública y otra zona para las labores de administración o comunicación con otros servicios de forma interna.

En FirewallD las reglas de filtrado se especifican de tres formas:

  • Servicios: reglas predeterminadas para servicios conocidos, como SSH, HTTP, HTTPS, DNS, entre otros
  • Puertos: se especifican los puertos a abrir en conjunto al protocolo a utilizar, ya sea TCP o UDP
  • Rich-Rules: reglas con sintaxis similar a la utilizada en Iptables para casos en los que se requiera un filtrado más granular

Uso básico de FirewallD

Nota: Se hace la suposición que FirewallD se encuentra instalado y habilitado como firewall.

FirewallD usa el binario firewall-cmd como la herramienta de administración por línea de comandos. A continuación se listan algunas de las operaciones más comunes:

  • Listar las zonas activas
sudo firewall-cmd --get-active-zones
  • Listar la configuración de una zona específica
sudo firewall-cmd --zone=public --list-all
  • Añadir un servicio a una zona específica (En caso de no poner la bandera --permanent, el cambio es temporal)
sudo firewall-cmd --zone=public --add-service=https --permanent
  • Remover un servicio de una zona específica
sudo firewall-cmd --zone=public --remove-service=http --permanent
  • Añadir un puerto a una zona específica
sudo firewall-cmd --zone=public --add-port=9443/tcp --permanent
  • Remover un puerto de una zona específica
sudo firewall-cmd --zone=public --remove-port=9443/tcp --permanent
  • Asignar una interfaz de red a una zona específica
sudo firewall-cmd --zone=internal --change-interface=eno1 --permanent
  • Cargar los cambios realizados sin interrumpir las conexiones persistentes
sudo firewall-cmd --reload

Configuración de SSH

Nota: Se hace la suposición que se configuraron los servicios o puertos necesarios para funcionamiento del servidor previamente. Nota: Se hace la suposición que la zona internal es la utilizada para accesar por SSH al servidor.

A pesar de que FirewallD contiene de forma predeterminada un servicio para usar SSH, este servicio no permite filtrar el acceso por IP específicas, por lo que es necesario usar 'Rich-Rules'.

En caso de haber configurado previamente el servicio de SSH en FirewallD, es necesario removerlo:

sudo firewall-cmd --zone=internal --remove-service=ssh --permanent

Por cada IP que se deba conectar al servidor por SSH ejecutar el siguiente comando:

sudo firewall-cmd --zone=internal --add-rich-rule='rule family=ipv4 source address=1.2.3.4/24 service name=ssh log prefix="SSH Access" level="notice" accept' --permanent

Cargar los cambios realizados

sudo firewall-cmd --reload

Verifique la configuración realizada

sudo firewall-cmd --zone=internal --list-all