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.

A medida que se avanza correctamente sobre la configuración del nuevo firewall, es posible sobrescribir el contenido del archivo /root/firewall-seguro. Al finalizar el proceso se debe eliminar la tarea cron, simplemente borrando el archivo /etc/cron.d/restaurar-firewall.


Tal vez pueda interesarte


Compartí este artículo