¿Cómo mostrar y eliminar reglas de firewall en iptables?
Actualizado el 26 de Julio, 2016. Por Hosty.
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.