Cómo listar y eliminar reglas de firewall de Iptables

Introducción

Iptables es un firewall que tiene una función esencial en la seguridad de la red para la mayoría de los sistemas Linux. Aunque muchos tutoriales de iptables enseñan cómo crear reglas de firewall para proteger el servidor, este se centrará en un aspecto diferente de la administración de firewall: cómo listar y eliminar reglas.

En este tutorial, explicaremos cómo hacer las siguientes tareas de iptables:

  • Listar reglas
  • Borrar contadores de paquetes y bytes
  • Eliminar reglas
  • Vaciar cadenas (eliminar todas las reglas de una cadena)
  • Vaciar todas las cadenas y tablas, eliminar todas las cadenas y aceptar todo el tráfico

Nota: Cuando trabaje con firewalls, tenga precaución de no bloquearse a sí mismo de su propio servidor al bloquear el tráfico SSH (puerto 22, de forma predeterminada). Si pierde acceso debido a la configuración del firewall, es posible que deba conectarse a este mediante una consola fuera de banda para solucionar su problema de acceso.

Requisitos previos

En este tutorial, se asume que está usando un servidor Linux con el comando iptables instalado y que el usuario tiene privilegios sudo.

Si necesita ayuda para esta configuración inicial, consulte nuestra guía Configuración inicial del servidor con Ubuntu 20.04. También está disponible para Debian y CentOS

Veamos primero cómo enumerar reglas. Hay dos formas diferentes de ver las reglas de iptables activas: en una tabla o como una lista de especificaciones de reglas. Ambos métodos proporcionan aproximadamente la misma información en diferentes formatos.

Cómo listar reglas mediante especificación

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

  • sudo iptables -S
Output-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N ICMP -N TCP -N UDP -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate INVALID -j DROP -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable -A TCP -p tcp -m tcp --dport 22 -j ACCEPT 

Como se puede ver, el resultado se parece a los comandos que se utilizaron para crearlas, sin el comando iptables anterior. Esto también tendrá un aspecto similar a los archivos de configuración de reglas de iptables, si alguna vez se utilizó iptables-persistent o iptables save.

Cómo enumerar una cadena específica

Si desea limitar el resultado a una cadena específica (ENTRADA, SALIDA, 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 TCP, debe ejecutar este comando:

  • sudo iptables -S TCP
Output-N TCP -A TCP -p tcp -m tcp --dport 22 -j ACCEPT 

Ahora vamos a echar un vistazo a la forma alternativa de ver las reglas de iptables activas, como un cuadro de reglas.

Cómo listar reglas como tablas

El listado de las reglas de iptables en la vista de tabla puede ser útil para comparar diferentes reglas entre sí.

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

  • sudo iptables -L

Esto generará todas las reglas actuales ordenadas por cadena.

Si desea limitar el resultado a una cadena específica (ENTRADA, SALIDA, TCP, etc.), puede especificar el nombre de la cadena directamente después de la opción -L.

Veamos un ejemplo de cadena ENTRADA:

  • sudo iptables -L INPUT
OutputChain INPUT (policy DROP) target     prot opt source               destination ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED ACCEPT     all  --  anywhere             anywhere DROP       all  --  anywhere             anywhere             ctstate INVALID UDP        udp  --  anywhere             anywhere             ctstate NEW TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW ICMP       icmp --  anywhere             anywhere             ctstate NEW REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable 

La primera línea de resultado indica el nombre de la cadena (ENTRADA, en este caso), seguido por su directiva predeterminada (ANULAR). La siguiente línea consiste en los encabezados de cada columna de la tabla y viene seguida de las reglas de la cadena. Veamos qué indica cada encabezado:

  • target: si un paquete coincide con la regla, el objetivo especifica qué debe hacerse con él. Por ejemplo, un paquete puede aceptar, anularse, registrarse o enviarse a otra cadena para compararse con más reglas
  • prot: el protocolo, como tcp, udp, icmp o all
  • opt: rara vez se utiliza. Esta columna indica opciones IP
  • source: la dirección IP o de subred de origen del tráfico o anywhere
  • destination: la dirección IP o de subred de destino del tráfico o anywhere

La última columna, que no está etiquetada, indica las opciones de una regla. Es decir, cualquier parte de la regla que no esté indicada mediante las columnas anteriores. Puede ser cualquier cosa, desde puertos de origen y destino hasta el estado de conexión del paquete.

Cómo mostrar recuentos de paquetes y tamaño total

Cuando se listan reglas de iptables, también es posible mostrar el número de paquetes y el tamaño total de estos en bytes, que coinciden con cada regla particular. Esto a menudo es útil cuando se trata de tener una idea aproximada de qué reglas coinciden con los paquetes. Para hacerlo, utilice la opción -L y -v juntos.

Por ejemplo, volvamos a ver la cadena INPUT, con la opción -v:

  • sudo iptables -L INPUT -v
OutputChain INPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination  284K   42M ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED     0     0 ACCEPT     all  --  lo     any     anywhere             anywhere     0     0 DROP       all  --  any    any     anywhere             anywhere             ctstate INVALID   396 63275 UDP        udp  --  any    any     anywhere             anywhere             ctstate NEW 17067 1005K TCP        tcp  --  any    any     anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW  2410  154K ICMP       icmp --  any    any     anywhere             anywhere             ctstate NEW   396 63275 REJECT     udp  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable  2916  179K REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-proto-unreachable     0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED 

Tenga en cuenta que la lista ahora tiene dos columnas adicionales, pkts y bytes.

Ahora que sabe cómo listar las reglas de firewall activas de diversas maneras, vamos a ver cómo puede restablecer los contadores de paquetes y bytes.

Cómo restablecer los recuentos de paquetes y el tamaño total

Si desea borrar, o dejar en cero, los contadores de paquetes y bytes para sus reglas, utilice la opción -Z. También se restablecen si se produce un reinicio. Esto es útil cuando desea ver si el servidor está recibiendo tráfico nuevo que coincida con las reglas existentes.

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

  • sudo iptables -Z

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

  • sudo iptables -Z INPUT

Si desea borrar los contadores de una regla determinada, especifique el nombre de la cadena y el número de la regla. Por ejemplo, para dejar en cero los contadores de la primera regla en la cadena ENTRADA, ejecute esto:

  • sudo iptables -Z INPUT 1

Ahora que aprendió a restablecer los contadores de paquetes y bytes de iptables, vamos a ver los dos métodos que pueden utilizarse para eliminarlos.

Cómo eliminar reglas mediante especificación

Una de las formas de eliminar reglas de iptables es mediante la especificación de reglas. Para hacerlo, puede ejecutar el comando iptables con la opción -D seguida de la especificación de reglas. Si desea eliminar reglas usando este método, puede utilizar el resultado de la lista de reglas, iptables -S, para obtener ayuda.

Por ejemplo, si desea borrar la regla que anula paquetes entrantes inválidos (-A INPUT -m conntrack -ctstate INVALID -j DROP), podría ejecutar este comando:

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

Tenga en cuenta que aquí debería excluirse la opción -A, que se utiliza para indicar la posición de la regla en el momento de la creación.

Cómo eliminar reglas por cadena y número

La otra forma de eliminar reglas de iptables es mediante su número de línea y cadena. Para determinar el número de línea de una regla, liste las reglas en el formato de tabla y agregue la opción --line-numbers:

  • sudo iptables -L --line-numbers
[secondary_output Output] Chain INPUT (policy DROP) num  target     prot opt source               destination 1    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED 2    ACCEPT     all  --  anywhere             anywhere 3    DROP       all  --  anywhere             anywhere             ctstate INVALID 4    UDP        udp  --  anywhere             anywhere             ctstate NEW 5    TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 6    ICMP       icmp --  anywhere             anywhere             ctstate NEW 7    REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable 8    REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset 9    REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable 10   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED ... 

Con esto se agrega el número de línea a cada fila de reglas, lo que se indica mediante el encabezado num.

Una vez que sepa qué regla desea eliminar, tome nota del número de cadena y línea de la regla. Luego, ejecute el comando iptables -D seguido por el número de cadena y regla.

Por ejemplo, si queremos eliminar la regla de entrada que anula paquetes inválidos, podemos ver que es la regla 3 de la cadena ENTRADA. Por ello, debemos ejecutar este comando:

  • sudo iptables -D INPUT 3

Ahora que sabe cómo eliminar reglas de firewall individuales, vamos a revisar cómo puede vaciar cadenas de reglas.

Cómo vaciar cadenas

Iptables ofrece una forma de eliminar todas las reglas de una cadena, o de vaciar una cadena. En esta sección se cubrirá la variedad de formas de hacer esto.

Nota: Tenga cuidado de no bloquearse de su servidor mediante SSH, al vaciar una cadena con una directiva predeterminada de anular o denegar. Si lo hace, es posible que necesite conectarse a él a través de la consola para solucionar su problema de acceso.

Cómo vaciar una cadena única

Para vaciar una cadena específica, lo que eliminará todas las reglas de la cadena, puede usar la opción -F o la opción equivalente --flush, y el nombre de la cadena para vaciar.

Por ejemplo, para eliminar todas las reglas de la ENTRADA cadena, ejecute este comando:

  • sudo iptables -F INPUT

Cómo vaciar todas las cadenas

Para vaciar todas las cadenas, lo que eliminará todas las reglas de firewall, puede usar la opción -F o la opción equivalente --flush sola:

  • sudo iptables -F

Cómo vaciar todas las reglas, eliminar todas las cadenas y aceptar todas

En esta sección, explicaremos cómo vaciar todas sus reglas, tablas y cadenas de firewall y permitir todo el tráfico de red.

Nota: Con esto se deshabilitará efectivamente el firewall. Solo debe seguir esta sección si desea volver a iniciar la configuración del firewall.

Primero, establezca las directivas predeterminadas para cada una de las cadenas incorporadas en ACEPTAR. El motivo principal para hacer esto es garantizar que no quede bloqueado del servidor mediante SSH:

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

Luego, vacíe las tablas nat y mangle, vacíe todas las cadenas (-F) y elimine todas las cadenas no predeterminadas (-X):

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

El firewall ahora permitirá todo el tráfico de red. Si lista las reglas ahora, verá que no hay ninguna, y que solo permanecerán las tres cadenas predeterminadas (ENTRADA, REENVÍO y SALIDA).

Conclusión

Después de revisar este tutorial, debería quedar familiarizado con cómo listar y eliminar las reglas de firewall de iptables.

Recuerde que cualquier cambio de iptables mediante el comando iptables es efímero y debe guardarse para que persista durante reinicios del servidor. Esto se trata en la sección Reglas de almacenamiento del tutorial Reglas y comandos comunes de firewall.