Enumerar y eliminar reglas de firewall de iptables en Linux

Introducción

Iptables es un firewall esencial para la seguridad de la red en la mayoría de los sistemas Linux. Si bien muchos tutoriales de iptables enseñan a crear reglas de firewall para proteger el servidor , este se centra en un aspecto diferente de la administración del firewall: el listado y la eliminación de reglas.

En este tutorial, cubriremos cómo realizar las siguientes tareas de iptables:

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

Nota: Al trabajar con firewalls, tenga cuidado de no bloquear el acceso a su servidor bloqueando el tráfico SSH (puerto :22predeterminado). Si pierde el acceso debido a la configuración de su firewall, es posible que deba conectarse a él mediante una consola fuera de banda para corregirlo.

Prerrequisitos

Este tutorial asume que está utilizando un servidor Linux con el iptablescomando instalado y que su usuario tiene sudoprivilegios.

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

Reglas de listado por especificación

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

Para enumerar todas las reglas de iptables activas por especificación, ejecute el iptablescomando con la -Sopción:

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 puede ver, la salida se ve igual que los comandos usados ​​para crearlos, sin el iptablescomando anterior. Esto también se parecerá a los archivos de configuración de reglas de iptables, si alguna vez ha usado iptables-persistento iptables save.

Listado de una cadena específica

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

sudo iptables -S TCP

Output-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

Ahora echemos un vistazo a la forma alternativa de ver las reglas de iptables activas: como una tabla de reglas.

Reglas de listado como tablas

Enumerar las reglas de iptables en la vista de tabla puede ser útil para comparar diferentes reglas entre sí. Para mostrar todas las reglas de iptables activas en una tabla, ejecute el iptablescomando con la -Lopción:

sudo iptables -L

Esto mostrará todas las reglas actuales ordenadas por cadena.

Si desea limitar la salida a una cadena específica ( INPUT, OUTPUT, TCP, etc.), puede especificar el nombre de la cadena directamente después de la -Lopción.

Echemos un vistazo a una INPUTcadena de ejemplo:

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 salida indica el nombre de la cadena ( INPUTen este caso), seguido de su política predeterminada ( DROP). La siguiente línea contiene los encabezados de cada columna de la tabla y, a continuación, las reglas de la cadena. Veamos qué indica cada encabezado:

  • targetSi un paquete cumple la regla, el destino especifica qué se debe hacer con él. Por ejemplo, un paquete puede aceptarse, descartarse, registrarse o enviarse a otra cadena para compararlo con más reglas.
  • prot:El protocolo, como por ejemplo tcp, udp, icmp, oall
  • opt:Rara vez se utiliza, esta columna indica las opciones de IP
  • source:La dirección IP de origen o subred del tráfico, oanywhere
  • destination:La dirección IP de destino o subred del tráfico, oanywhere

La última columna, que no está etiquetada, indica las opciones de una regla. Esto incluye cualquier parte de la regla que no se indique en las columnas anteriores. Puede incluir desde los puertos de origen y destino hasta el estado de conexión del paquete.

Visualización de recuentos de paquetes y tamaño agregado

Al listar las reglas de iptables, también es posible mostrar el número de paquetes y su tamaño total en bytes que coincidieron con cada regla. Esto suele ser útil para obtener una idea aproximada de qué reglas coinciden con los paquetes. Para ello, utilice las opciones -Ly -vjuntas.

Por ejemplo, veamos la INPUTcadena nuevamente, con la -vopción:

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 el listado ahora tiene dos columnas adicionales, pktsy bytes.

Ahora que sabe cómo enumerar las reglas de firewall activas de diferentes maneras, veamos cómo puede restablecer los contadores de paquetes y bytes.

Restablecimiento del recuento de paquetes y del tamaño agregado

Si desea borrar o poner a cero los contadores de paquetes y bytes de sus reglas, utilice esta -Zopción. También se reinician al reiniciar. Esto es útil si desea comprobar si su servidor recibe tráfico nuevo que coincida con sus reglas existentes.

Para borrar los contadores de todas las cadenas y reglas, utilice la -Zopción por sí sola:

sudo iptables -Z

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

sudo iptables -Z INPUT

Si desea borrar los contadores de una regla específica, especifique el nombre de la cadena y el número de regla. Por ejemplo, para poner a cero los contadores de la primera regla de la INPUTcadena, ejecute lo siguiente:

sudo iptables -Z INPUT 1

Ahora que sabe cómo restablecer los contadores de paquetes y bytes de iptables, veamos los dos métodos que se pueden utilizar para eliminarlos.

Eliminación de reglas por especificación

Una forma de eliminar reglas de iptables es mediante la especificación de la regla. Para ello, puede ejecutar el iptablescomando con la -Dopción seguida de la especificación de la regla. Si desea eliminar reglas con este método, puede usar la salida de la lista de reglas iptables -Spara obtener ayuda.

Por ejemplo, si desea eliminar la regla que descarta los paquetes entrantes no válidos ( -A INPUT -m conntrack --ctstate INVALID -j DROP), puede ejecutar este comando:

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

Tenga en cuenta que la -Aopción que se utiliza para indicar la posición de la regla en el momento de la creación debe excluirse aquí.

Eliminar reglas por cadena y número

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 una regla, enumérelas en formato de tabla y agregue la --line-numbersopción:

sudo iptables -L --line-numbers

OutputChain 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
...

Esto agrega el número de línea a cada fila de regla, indicado por el numencabezado.

Una vez que sepa qué regla desea eliminar, anote la cadena y el número de línea de la regla. Luego, ejecute el iptables -Dcomando seguido de la cadena y el número de regla.

Por ejemplo, si queremos eliminar la regla de entrada que descarta los paquetes no válidos, podemos ver que es la regla 3de la INPUTcadena. Por lo tanto, deberíamos ejecutar este comando:

sudo iptables -D INPUT 3

Ahora que sabe cómo eliminar reglas de firewall individuales, repasemos cómo puede eliminar cadenas de reglas.

Cadenas de descarga

Iptables ofrece una forma de eliminar todas las reglas de una cadena o vaciarla . Esta sección explicará las diferentes maneras de hacerlo.

Advertencia: Tenga cuidado de no bloquear el acceso a su servidor por SSH al vaciar una cadena con la política predeterminada de dropo deny. Si lo hace, podría necesitar conectarse a ella por consola para corregir el acceso.

Limpieza de una sola cadena

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

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

sudo iptables -F INPUT

Limpiando todas las cadenas

Para limpiar todas las cadenas, lo que eliminará todas las reglas del firewall, puede utilizar la opción -F, o la opción equivalente --flush, por sí sola:

sudo iptables -F

Limpiar todas las reglas, eliminar todas las cadenas y aceptar todas

Esta sección le mostrará cómo limpiar todas las reglas, tablas y cadenas de su firewall y permitir todo el tráfico de red.

Advertencia: Esto desactivará su firewall. Solo debe seguir esta sección si desea reiniciar la configuración de su firewall.

Primero, configure las políticas predeterminadas para cada cadena integrada en [nombre del servidor] ACCEPT. Esto se hace principalmente para garantizar que no se le bloquee el acceso a su servidor mediante SSH.

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

A continuación, limpie las tablas naty mangle, limpie todas las cadenas ( -F) y elimine todas las cadenas que no sean predeterminadas ( -X):

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

Su firewall ahora permitirá todo el tráfico de red. Si enumera sus reglas, verá que no hay ninguna y que solo quedan las tres cadenas predeterminadas ( INPUT, FORWARD, y ).OUTPUT

Diferencias entre iptables -D y iptables -F

OpciónDescripciónObjetivoEjemplo
-DElimina una regla específica de una cadenaSe utiliza para eliminar una sola regla de una cadena.sudo iptables -D INPUT 1
-FElimina todas las reglas de una cadenaSe utiliza para eliminar todas las reglas de una cadena.sudo iptables -F INPUT

iptables -DSe utiliza para eliminar una regla específica de una cadena. Por ejemplo, para eliminar la primera regla de la INPUTcadena, se ejecutaría “ sudo iptables -D INPUT 1.

iptables -FSe utiliza para vaciar todas las reglas de una cadena. Por ejemplo, para eliminar todas las reglas de la INPUTcadena, se ejecutaría “ sudo iptables -F INPUT.

Eliminar reglas en cadenas personalizadas

Al administrar las reglas de su firewall, es posible que necesite eliminar reglas específicas de cadenas personalizadas. Estas cadenas son definidas por el usuario y permiten configuraciones de reglas de firewall más complejas y organizadas. Para eliminar reglas de estas cadenas personalizadas, puede usar la -Dopción seguida del nombre de la cadena personalizada y el número de regla que desea eliminar.

Por ejemplo, supongamos que tiene una cadena personalizada llamada custom_chainy desea eliminar la primera regla de esta cadena. Para ello, ejecute el siguiente comando:

sudo iptables -D custom_chain 1

Este comando eliminará la primera regla de la custom_chaincadena. Asegúrate de reemplazarla custom_chaincon el nombre de tu cadena personalizada y 1el número de regla que deseas eliminar.

Tenga cuidado al eliminar reglas de la configuración de su firewall, ya que esto puede afectar la seguridad de su sistema. Verifique siempre la regla que va a eliminar para asegurarse de que sea la correcta.

Errores comunes y depuración

“iptables: No hay ninguna cadena/objetivo/coincidencia con ese nombre”

Este error ocurre cuando el nombre de la cadena, el destino o la coincidencia especificados no existe. Para solucionarlo, asegúrese de que la cadena, el destino o la coincidencia que intenta usar estén escritos correctamente y existan en la configuración de iptables. Puede listar todas las cadenas existentes con el siguiente comando:

sudo iptables -L

Esto mostrará todas las cadenas, incluidas las predeterminadas ( INPUT, FORWARD, y OUTPUT). Si la cadena que intenta usar no existe, puede crearla con la -Nopción:

sudo iptables -N <chain_name>

Reemplace <chain_name>con el nombre de la cadena que desea crear.

La regla no se elimina debido a una falta de coincidencia

Este error se produce cuando la regla que intenta eliminar no coincide con la que desea eliminar. Para solucionarlo, asegúrese de que la regla que intenta eliminar coincida exactamente con la que desea eliminar. Puede listar todas las reglas de una cadena específica con la -Sopción:

sudo iptables -S <chain_name>

Esto mostrará todas las reglas de la cadena especificada. Compare el resultado con la regla que intenta eliminar para asegurarse de que coincidan exactamente. Si no coinciden, ajuste la regla que intenta eliminar para que coincida con la que desea eliminar.

Eliminar reglas incorrectas por número de línea

Al eliminar reglas por número de línea, es fácil eliminar accidentalmente la regla incorrecta. Para evitarlo, utilice la -nopción para listar las reglas con números de línea:

sudo iptables -nL <chain_name>

Esto mostrará las reglas con números de línea. Utilice la -Dopción para eliminar una regla por su número de línea:

sudo iptables -D <chain_name> <line_number>

Reemplace <chain_name>con el nombre de la cadena y <line_number>con el número de línea de la regla que desea eliminar.

Preguntas frecuentes

1. ¿Cómo puedo ver las reglas de iptables activas?

Para ver las reglas activas de iptables, puede usar el iptables -Lcomando. Este comando mostrará todas las cadenas y sus reglas. Por ejemplo:

sudo iptables -L

Esto mostrará todas las cadenas y sus reglas. Si desea ver las reglas con más detalle, puede usar la -Sopción:

sudo iptables -S

Esto mostrará las reglas en un formato más detallado, incluidos los comandos exactos utilizados para crearlas.

2. ¿Cómo elimino una regla específica de iptables?

Para eliminar una regla específica de iptables, puede usar el iptables -Dcomando. Este comando eliminará una regla de una cadena específica. Por ejemplo, para eliminar una regla de la INPUTcadena, usaría:

sudo iptables -D INPUT <rule_number>

Reemplace <rule_number>con el número real de la regla que desea eliminar. Puede usar la -nopción para ver las reglas con números de línea:

sudo iptables -nL INPUT

Esto mostrará las reglas en la INPUTcadena con números de línea, lo que facilitará la identificación de la regla que desea eliminar.

3. ¿Cuál es la diferencia entre vaciar y eliminar reglas?

Al vaciar una cadena, se eliminarán todas sus reglas. Al eliminar una regla, se eliminará una regla específica de la cadena. Por ejemplo, para vaciar todas las reglas de la INPUTcadena, se usaría:

sudo iptables -F INPUT

Esto eliminará todas las reglas de la INPUTcadena. Por otro lado, para eliminar una regla específica, INPUTse requiere usar la -Dopción descrita en la pregunta 2.

4. ¿Cómo puedo eliminar todas las reglas de una cadena?

Para eliminar todas las reglas de una cadena, puede usar el iptables -Fcomando. Este comando eliminará todas las reglas de una cadena. Por ejemplo, para eliminar todas las reglas de la INPUTcadena, usaría:

sudo iptables -F INPUT

Esto eliminará todas las reglas de la INPUTcadena. También puede usar la -nopción para ver las reglas con números de línea antes de vaciarlas:

sudo iptables -nL INPUT

Esto mostrará las reglas en la INPUTcadena con números de línea, lo que facilitará la verificación de las reglas antes de eliminarlas.

5. ¿Puedo deshacer una regla de iptables eliminada?

Sí, puedes deshacer una regla de iptables eliminada con el iptables -Acomando. Este comando añadirá una regla a una cadena específica. Por ejemplo, para añadir una regla a la INPUTcadena, usarías:

sudo iptables -A INPUT <rule_specification>

Reemplace <rule_specification>con la especificación de la regla que desea agregar. También puede usar la -nopción para ver las reglas con números de línea después de agregar una nueva regla:

sudo iptables -nL INPUT

Esto mostrará las reglas en la INPUTcadena con números de línea, lo que facilitará la verificación de la nueva regla.

Conclusión

Tras completar este tutorial, ha visto cómo listar y eliminar las reglas de su firewall de iptables. Además, ha aprendido a vaciar cadenas, eliminar todas las reglas de una cadena y comprender las diferencias entre iptables -Dy iptables -F.

Recuerde que cualquier cambio en iptables realizado mediante el iptablescomando es efímero y debe guardarse para que persista tras los reinicios del servidor. Esto se explica en la sección “Guardar reglas” del tutorial “Reglas y comandos comunes del firewall”.

Para obtener más información, le recomendamos consultar los siguientes tutoriales para mejorar sus habilidades de configuración de firewall:

  • Conceptos básicos de Iptables: reglas y comandos comunes de firewall
  • Cómo configurar un firewall de Iptables para proteger el tráfico entre sus servidores
  • Cómo implementar una plantilla básica de firewall con Iptables en Ubuntu
  • Conceptos básicos de UFW: reglas y comandos comunes de firewall

Estos tutoriales le brindarán una comprensión integral de iptablesy ufw, lo que le permitirá crear configuraciones de firewall sólidas para sus servidores.

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post