Limitar acceso por SSH únicamente a ciertas IP con FirewallD
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