¿Cómo mostrar y eliminar reglas de firewall en iptables?

Actualizado el 26 de Julio, 2016. Por BlueHosting.

Iptables es un firewall que juega un rol esencial en la seguridad de redes para la mayoría de los sistemas Linux. La mayoría de los tutoriales que abordan iptables enseñan cómo crear las reglas para asegurar un servidor, en cambio este se enfoca en un aspecto distinto de la administración de Firewalls: enumerar y eliminar reglas.

En este tutorial, cubriremos cómo llevar a cabo las siguientes tareas con iptables:

  • Mostrar reglas;
  • Limpiar paquetes y contadores de Byte;
  • Eliminar reglas;
  • Eliminar cadenas (borrar todas las reglas de una cadena);
  • Eliminar todas las cadenas y tablas, borrar todas las cadenas y aceptar todo el tráfico.

Nota:
Al trabajar con firewalls, tenga especial cuidado de no bloquearse a sí mismo, lo que impediría el acceso a su propio servidor por bloqueo de tráfico SSH (puerto 22, por defecto). Si usted pierde el acceso su servidor, probablemente, deberá contactar al servicio técnico para que puedan realizar el acceso por consola y reiniciar la configuración de iptables. Existen otras técnicas avanzadas como el uso de crontab para cambios temporales de iptables pero no se abordan dentro de este tutorial.

Requisitos previos

Antes de comenzar con este tutorial, debería tener una cuenta de superusuario (usuario con privilegios sudo) separada y no root en su servidor. Si necesita ayuda en este paso, puede consultar nuestra guía de configuración inicial de su servidor con CentOS.

Primero, miraremos cómo enumerar las reglas disponibles. Hay dos maneras diferentes de ver sus reglas activas de iptables: en una tabla o como una lista de especificaciones de cada regla. Ambos métodos proporcionan prácticamente la misma información en diferentes formatos.

Enumerar reglas por especificaciones

Para enumerar todas las reglas de iptables activas por especificaciones, ejecute el comando iptables con la opción -S:

sudo iptables -S

El resultado tendrá la siguiente forma

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22222 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

Tal como se observa, la salida se parece mucho a los comandos utilizados para crear cada regla, pero sin el prefijo iptables. Esta también será muy similar al archivo de configuración de reglas iptables, si alguna vez ha ejecutado iptables-persistent o iptables save.

Enumerar una cadena específica

Si usted quiere limitar el resultado a una cadena específica (INPUT, OUTPUT, TCP, etc.), puede especificar el nombre de la cadena directamente después de la opción -S. Por ejemplo, para mostrar todas las especificaciones de reglas en la cadena OUTPUT, ejecute este comando:

sudo iptables -S OUTPUT

Veamos ahora una forma alternativa para ver las reglas activas de iptables, como una tabla de reglas.

Enumerar reglas como tablas

Enumerar las reglas iptables en una vista tipo tabla puede ser útil para comprar distintas reglas entre sí,

Para ver todas las reglas iptables activas en una tabla, ejecute el comando iptables con la opción -L:

sudo iptables -L

Esto imprimirá todas las reglas actuales ordenadas por cadena.

Si usted quiere limitar la salida a una cadena específica (INPUT, OUTPUT, TCP, etc.), puede especificar la opción directamente después del parámetro -L.

Veamos un ejemplo con la cadena INPUT:

sudo iptables -L INPUT

La salida lucirá similar a lo siguiente:

Chain INPUT (policy ACCEPT)
target     prot opt source       destination
ACCEPT     all  --  anywhere     anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere     anywhere
DROP       all  --  anywhere     anywhere            ctstate INVALID
ACCEPT     all  --  anywhere     anywhere
ACCEPT     tcp  --  anywhere     anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere     anywhere            state NEW tcp dpt:22222
ACCEPT     tcp  --  anywhere     anywhere            tcp dpt:http state NEW,ESTABLISHED
ACCEPT     tcp  --  anywhere     anywhere            tcp dpt:ndmp
REJECT     all  --  anywhere     anywhere            reject-with icmp-host-prohibited

La primera línea en la salida indica el nombre de la cadena (INPUT, en este caso), seguido de su política por defecto (ACCEPT). La siguiente línea estará comprendida por las cabeceras de cada columna en la tabla, y estará seguida por las reglas de la cadena. Expliquemos qué significa cada una de las cabeceras:

  • target: Si un paquete coincide con la regla, el target u objetivo especifica qué debería hacerse con dicho paquete. Por ejemplo: un paquete puede ser aceptado, descartado, registrado o enviado a otra cadena para ser comparado contra otras reglas.
  • prot: El protocolo, ya sea tcp, udp, icmp o todos.
  • opt: Es muy poco frecuente que se utilice, esta columna indica opciones IP.
  • source: La dirección IP fuente o la subred del tráfico, o anywhere, que en este caso indica que puede ser cualquier fuente sin restricciones.
  • destination: La dirección IP de destino o la subred del tráfico, o anywhere, que en este caso indica que puede ser cualquier destino sin restricciones.

La última columna, que no está identificada, indica las opciones de una regla. Es decir, una parte de la regla que no es indicada en las columnas previas. Esto podría ser cualquier cosa, desde los puertos de fuente y destino hasta el estado de la conexión del paquete.

Mostrar el conteo de paquetes y agregar el tamaño

Cuando muestra las reglas de iptables, también es posible mostrar el número de paquetes, y agregar el tamaño de esos paquetes en bytes, según la regla particular con la que coincidieron. Esto es útil a menudo cuando se intenta obtener una idea general de cuáles reglas están haciendo coincidencia contra los paquetes. Para hacerlo, simplemente utilice el parámetro -v y la opción -L en conjunto.

Por ejemplo, veamos la cadena INPUT una vez más, agregando ahora la opción -v:

sudo iptables -L INPUT -v

El resultado se asemejará a lo siguiente:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target   prot opt in     out  source     destination
 5207  695K ACCEPT   all  --  any    any  anywhere   anywhere     state RELATED,ESTABLISHED
   25  1452 ACCEPT   icmp --  any    any  anywhere   anywhere
    0     0 DROP     all  --  any    any  anywhere   anywhere     ctstate INVALID
    0     0 ACCEPT   all  --  lo     any  anywhere   anywhere
   30  1304 ACCEPT   tcp  --  any    any  anywhere   anywhere     state NEW tcp dpt:ssh
    2   828 ACCEPT   tcp  --  any    any  anywhere   anywhere     state NEW tcp dpt:22222
   53  2804 ACCEPT   tcp  --  eth0   any  anywhere   anywhere     tcp dpt:http state NEW,ESTABLISHED
   57  4268 ACCEPT   tcp  --  any    any  anywhere   anywhere     tcp dpt:ndmp
 3533  613K REJECT   all  --  any    any  anywhere   anywhere     reject-with icmp-host-prohibited

Como puede observar, la lista ahora tiene dos columnas adicionales, pkts y bytes.

Ahora que ya sabe cómo enumerar las reglas activas de firewall en distintas formas, veamos cómo puede reiniciar los paquetes y contadores de bytes.

Reinicar el conteo de paquetes y agregar el tamaño

Si usted quiere limpiar o colocar en cero los paquetes y contadores de bytes de las reglas, utilice la opción -Z. También se reinician si ocurre un reinicio del servidor. Esto es útil si usted quiere ver si sus servidores están recibiendo tráfico nuevo que coincida con las reglas existentes.

Para limpiar los contadores de todas las reglas y cadenas, utilice solo la opción -Z:

sudo iptables -Z

Para limpiar los contadores de todas las reglas en una cadena específica, use la opción -Z y especifique la cadena. Por ejemplo, para limpiar los contadores en la cadena INPUT ejecute este comando:

sudo iptables -Z INPUT

Si usted desea limpiar los contadores para una regla en específico, especifique el nombre de la cadena y el número de la regla. Por ejemplo, para colocar en cero los contadores de la primera regla de la cadena INPUT, ejecute:

sudo iptables -Z INPUT 1

Ahora que sabe cómo reiniciar los paquetes y contadores de bytes de iptables, veamos los dos métodos que puede utilizar para borrarlas.

Eliminar reglas por especificación

Una de las formas de eliminar las reglas de iptables es por especificación de regla. Para hacerlo, puede ejecutar el comando iptables con la opción -D seguida por la especificación de la regla. Si usted quiere eliminar reglas usando este método, puede usar como referencia y ayuda, la lista obtenida a través del comando iptables -S

Por ejemplo, si usted quiere eliminar la regla que descarta los paquetes entrantes (-A INPUT -m conntrack --ctstate INVALID -j DROP), podría ejecutar el siguiente comando:

sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP

Tenga en cuenta que la opción -A, que es usada para indicar la posición de la regla al momento de la creación, debe ser excluida en el comando anterior.

Eliminar reglas por cadena y número

La otra forma de eliminar reglas de iptables es por su cadena y número de línea. Para determinar el número de línea de cada regla, enumere las reglas en la tabla e ingrese la opción --line-numbers:

sudo iptables -L --line-numbers
num  target    prot opt source        destination
1    ACCEPT    all  --  anywhere      anywhere            state RELATED,ESTABLISHED
2    ACCEPT    icmp --  anywhere      anywhere
3    DROP      all  --  anywhere      anywhere             ctstate INVALID
4    ACCEPT    all  --  anywhere      anywhere
5    ACCEPT    tcp  --  anywhere      anywhere            state NEW tcp dpt:ssh
6    ACCEPT    tcp  --  anywhere      anywhere            state NEW tcp dpt:22222
7    ACCEPT    tcp  --  anywhere      anywhere            tcp dpt:http state NEW,ESTABLISHED
8    ACCEPT    tcp  --  anywhere      anywhere            tcp dpt:ndmp
9    REJECT    all  --  anywhere      anywhere            reject-with icmp-host-prohibited
. . .

Esta opción agrega los números de línea para las reglas en cada fila, indicados por la cabecera num.

Una vez que sabe cuál regla quiere eliminar, tome nota de la cadena y el número de línea de la regla. Luego ejecute el comando iptables -D seguido por la cadena y el número de la regla.

Por ejemplo si quisiéramos eliminar la regla de entrada que descarta los paquetes inválidos, podemos ver que es la regla número 3 en la cadena INPUT. Deberíamos ejecutar entonces el siguiente comando:

sudo iptables -D INPUT 3

Ahora que sabe cómo eliminar una regla de firewall individual, veamos cómo eliminar cadenas de reglas completas.

Eliminar cadenas

Iptables ofrece una forma de eliminar todas las reglas en una cadena. Esta sección cubrirá varias maneras de lograr este objetivo.

Nota: Tenga cuidado de no bloquearse a sí mismo en el servidor, a través de SSH, cuando elimine una cadena con una política por defecto de descarte. Si lo hace, deberá acceder por consola para arreglarlo.

Eliminar una sola cadena

Para eliminar una cadena específica, lo que borrará todas las reglas en dicha cadena, puede usar la opción -F -o su equivalente --flush- seguida por el nombre de la cadena a eliminar.

Por ejemplo, para borrar todas las reglas en la cadena INPUT, ejecute este comando:

sudo iptables -F INPUT

Eliminar todas las cadenas

Para eliminar todas las cadenas, lo que borrará todas las reglas de firewall, puede utilizar la opción -F o su equivalente --flush sin incluir ningún otro parámetro:

sudo iptables -F

Eliminar todas las reglas, borrar todas las cadenas y aceptar todas las conexiones

Esta sección demostrará cómo eliminar todas sus reglas de firewall, tablas y cadenas, admitiendo todo el tráfico en la red.

Nota: Esto deshabilitará completamente su firewall. Solo debe seguir los pasos de esta sección si usted desea volver a comenzar la configuración de su firewall desde el inicio.

Primero, establezca las políticas por defecto para cada una de las cadenas integradas en ACCEPT. La razón principal para hacer esto es asegurarse de que no será bloqueado a sí mismo a través de SSH:

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

Luego elimine las tablas nat y mangle, elimine todas las cadenas (-F) y borre todas las cadenas que no se utilizan por defecto (-X):

sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X

Ahora su firewall permitirá todo el tráfico en la red. Si usted enumera las reglas ahora, podrá ver que no hay ninguna, y solo verá que quedan tres cadenas por defecto (INPUT, FORWARD y OUTPUT).

Recursos adicionales

Después de seguir este tutorial, debe haberse familiarizado con la forma en que se enumeran y eliminan las reglas de firewall en iptables. Recuerde que cualquier cambio en iptables es efímero y debe ser guardado para persistir después de un reinicio del servidor.

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...