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:
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.
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.
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
.
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.
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 reglasprot
: el protocolo, como tcp
, udp
, icmp
o all
opt
: rara vez se utiliza. Esta columna indica opciones IPsource
: 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.
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.
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.
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.
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.
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.
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
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
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 (ENTRAD
A, REENVÍO
y SALIDA
).
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!