Este artículo explica cómo administrar de forma correcta el firewall en sistemas operativos basados en Red Hat/CentOS. Cómo agregar y eliminar reglas, guardar la configuración, iniciar y detener el firewall, y más.
¿Cómo listar las reglas del firewall?: utilizando el comando iptables -nL
. La opción L
se utiliza para listar las reglas del firewall, n
para que la salida sea numérica, es decir que no convierta las direcciones IP y puertos en hostnames y nombres de servicios.
# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Se observa que por defecto el firewall sólo permite conexiones entrantes al puerto 22.
NOTA: este artículo no trata de explicar el funcionamiento de iptables, más bien trata de cómo se administran las reglas en los sistemas operativos basados en Red Hat. Para comprender el funcionamiento y sintaxis de las reglas de iptables acceder al manual: man iptables
.
¿Cómo agregar una nueva regla al firewall?: utilizando directamente el comando iptables
. No es necesario editar un archivo de configuración ni reiniciar el firewall, simplemente agregar la regla.
# iptables -A INPUT -p TCP --dport 80 -m state --state NEW -j ACCEPT
Al listar las reglas nuevamente, se observa que ahora el puerto 80 está abierto (se permiten conexiones entrantes):
# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 state NEW Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
En Red Hat/CentOS, el firewall es gestionado por el servicio "iptables". Para detener el firewall se debe ejecutar service iptables stop
, para iniciar el firewall service iptables start
.
Si se desea reiniciar el firewall, ejecutar:
# service iptables restart iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] iptables: Applying firewall rules: [ OK ]
Aunque si se listan las reglas luego de reiniciar el firewall, se observa que falta la regla que abre el puerto 80:
# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Esto sucede porque no se guardó el estado del firewall antes de reiniciarlo. Para que las reglas de iptables sean persistentes (no se pierdan luego reiniciar el firewall o el sistema operativo) es necesario guardarlas. Para ello se utiliza el comando service iptables save
.
Agregar la regla nuevamente:
iptables -A INPUT -p TCP --dport 80 -m state --state NEW -j ACCEPT
# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 state NEW Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Guardar el estado del firewall luego de agregar la regla (y verificar que funcione correctamente):
# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
Si ahora se reinicia el firewall o el sistema operativo, las nuevas reglas persisten:
# service iptables restart iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] iptables: Applying firewall rules: [ OK ]
# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 state NEW Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
¿Cómo eliminar una regla persistente?. Si se ha agregado una regla, se ha guardado el estado del firewall, y luego se desea eliminar la misma, se debe seguir el siguiente procedimiento:
1. Listar las reglas del firewall utilizando la opción --line-numbers
:
# iptables -nL --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 state NEW Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
A cada regla se le asigna un número de linea (observar la primera columna).
2. Para eliminar la regla número 5 (la cual abre el puerto 80) ejecutar:
# iptables -D INPUT 5
El comando -D
acepta como parámetro el nombre de la cadena y el número de línea que se desea eliminar.
Al listar el firewall se observa que la regla ha desaparecido:
# iptables -nL --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
3. Finalmente, guardar el estado del firewall para que los cambios sean persistentes:
# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
4. Comprobar los cambios:
# service iptables restart iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] iptables: Applying firewall rules: [ OK ]
# iptables -nL --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
Observación: cada vez que se trabaja con un firewall de forma remota pueden ocurrir problemas, provocados por errores de configuración, que nos dejen fuera del sistema y sin posibilidades de volver a ingresar. Algo que siempre hago cuando trabajo sobre un firewall en un sistema remoto es crear una tarea de cron que haga un reset del firewall a un estado seguro cada, por ejemplo, 15 minutos. De esta forma, si cometo un error en la configuración de una regla iptables que me deja fuera del sistema, tengo que esperar como máximo 15 minutos para volver a ingresar.
Para implementar este salvoconducto, seguir los siguientes pasos:
1. A partir de un estado seguro del firewall, volcar las reglas a un archivo utilizando el comando:
# iptables-save > /root/firewall-seguro
2. Agregar una tarea cron que restaure las reglas del firewall desde el archivo generado por iptables-save
en el paso anterior. Crear el archivo /etc/cron.d/restaurar-firewall
:
# nano /etc/cron.d/restaurar-firewall
Insertar el siguiente contenido:
# Restaurar el firewall cada 15 minutos */15 * * * * root /sbin/iptables-restore < /root/firewall-seguro
La herramienta iptables-restore
restaura las reglas desde la entrada estándar (o un archivo en este caso), haciendo previamente un flush de las tabla actual.