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 :22
predeterminado). 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 iptables
comando instalado y que su usuario tiene sudo
privilegios.
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 iptables
comando con la -S
opció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 iptables
comando anterior. Esto también se parecerá a los archivos de configuración de reglas de iptables, si alguna vez ha usado iptables-persistent
o 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 -S
opción. Por ejemplo, para mostrar todas las especificaciones de reglas en la TCP
cadena, 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 iptables
comando con la -L
opció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 -L
opción.
Echemos un vistazo a una INPUT
cadena 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 ( INPUT
en 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:
target
Si 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 ejemplotcp
,udp
,icmp
, oall
opt
:Rara vez se utiliza, esta columna indica las opciones de IPsource
: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 -L
y -v
juntas.
Por ejemplo, veamos la INPUT
cadena nuevamente, con la -v
opció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, pkts
y 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 -Z
opció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 -Z
opción por sí sola:
sudo iptables -Z
Para borrar los contadores de todas las reglas de una cadena específica, use la -Z
opción y especifique la cadena. Por ejemplo, para borrar los INPUT
contadores 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 INPUT
cadena, 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 iptables
comando con la -D
opció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 -S
para 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 -A
opció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-numbers
opció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 num
encabezado.
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 -D
comando 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 3
de la INPUT
cadena. 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 drop
o 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 INPUT
cadena, 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 nat
y 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ón | Descripción | Objetivo | Ejemplo |
---|---|---|---|
-D | Elimina una regla específica de una cadena | Se utiliza para eliminar una sola regla de una cadena. | sudo iptables -D INPUT 1 |
-F | Elimina todas las reglas de una cadena | Se utiliza para eliminar todas las reglas de una cadena. | sudo iptables -F INPUT |
iptables -D
Se utiliza para eliminar una regla específica de una cadena. Por ejemplo, para eliminar la primera regla de la INPUT
cadena, se ejecutaría “ sudo iptables -D INPUT 1
.
iptables -F
Se utiliza para vaciar todas las reglas de una cadena. Por ejemplo, para eliminar todas las reglas de la INPUT
cadena, 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 -D
opció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_chain
y 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_chain
cadena. Asegúrate de reemplazarla custom_chain
con el nombre de tu cadena personalizada y 1
el 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 -N
opció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 -S
opció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 -n
opció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 -D
opció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 -L
comando. 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 -S
opció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 -D
comando. Este comando eliminará una regla de una cadena específica. Por ejemplo, para eliminar una regla de la INPUT
cadena, 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 -n
opción para ver las reglas con números de línea:
sudo iptables -nL INPUT
Esto mostrará las reglas en la INPUT
cadena 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 INPUT
cadena, se usaría:
sudo iptables -F INPUT
Esto eliminará todas las reglas de la INPUT
cadena. Por otro lado, para eliminar una regla específica, INPUT
se requiere usar la -D
opció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 -F
comando. Este comando eliminará todas las reglas de una cadena. Por ejemplo, para eliminar todas las reglas de la INPUT
cadena, usaría:
sudo iptables -F INPUT
Esto eliminará todas las reglas de la INPUT
cadena. También puede usar la -n
opción para ver las reglas con números de línea antes de vaciarlas:
sudo iptables -nL INPUT
Esto mostrará las reglas en la INPUT
cadena 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 -A
comando. Este comando añadirá una regla a una cadena específica. Por ejemplo, para añadir una regla a la INPUT
cadena, 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 -n
opció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 INPUT
cadena 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 -D
y iptables -F
.
Recuerde que cualquier cambio en iptables realizado mediante el iptables
comando 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 iptables
y ufw
, lo que le permitirá crear configuraciones de firewall sólidas para sus servidores.