¿Qué es IPTABLES? Guía de uso y comandos esenciales

IPTABLES es una herramienta esencial para tener el control total del tráfico de red en un sistema Linux.

Esta poderosa herramienta permite configurar políticas de filtrado de tráfico de red en el kernel, estableciendo reglas para aceptar, rechazar o redirigir paquetes en la red.

Usualmente se utiliza para la configuración de reglas de firewall, gestión de tráfico de red, y la aplicación de políticas de seguridad en servidores.

A continuación, se presentan los conceptos clave y los comandos esenciales de IPTABLES.

¿Cómo funciona IPTABLES?

IPTABLES funciona basándose en un conjunto de reglas que se aplican a los paquetes de red que entran y salen del sistema.

Cada regla define condiciones específicas, como la dirección IP de origen, el puerto de destino o el protocolo, y luego establece una acción a tomar cuando un paquete cumple con esas condiciones.

Estas reglas se organizan dentro de tablas, cada una con un propósito particular. Las tablas más comunes incluyen

  • filter: que es la tabla predeterminada para el filtrado de paquetes

  • nat: para la traducción de direcciones de red y redirección de puertos

  • mangle: para la modificación de encabezados de los paquetes

  • raw: usada principalmente para excepciones en el seguimiento de conexiones.

Dentro de cada tabla, las reglas se agrupan en cadenas, que especifican cuándo deben evaluarse las reglas según el trayecto del paquete (entrada, salida o reenvío).

Las reglas se evalúan en el orden en que fueron añadidas, y una vez que un paquete coincide con una regla, se toma la acción definida, por lo que el orden de las reglas y la elección de la tabla correcta son cruciales para el comportamiento adecuado de la red.

1. Comprobación de Reglas Actuales

Para visualizar las reglas actualmente configuradas en iptables, podemos usar los siguientes comandos:

  • iptables -L: Lista todas las reglas en las cadenas de la tabla filter por defecto. Esta opción proporciona una visión general básica de las reglas aplicadas. Puedes listar todas las reglas de otra tabla con iptables -L <tabla>.

  • iptables -L -v -n: Lista las reglas con más detalle (-v para mostrar más información) y con direcciones IP en formato numérico (-n), lo cual es útil para evitar la resolución DNS, agilizando la consulta.

  • iptables -S: Muestra las reglas de manera que puedan ser reutilizadas en scripts, útil si necesitas exportar o replicar la configuración.

2. Eliminar Reglas

Para limpiar o eliminar reglas en iptables, podemos usar los comandos siguientes:

  • iptables -F: Limpia todas las reglas en las cadenas de la tabla filter.

  • iptables -F <cadena>: Limpia solo las reglas de una cadena específica, como INPUT o FORWARD.

3. Definir Políticas por Defecto

Establecer las políticas por defecto en iptables define cómo se comportará el sistema si no hay reglas específicas que coincidan con el tráfico entrante o saliente:

  • iptables -P INPUT ACCEPT: Define la política predeterminada para la cadena INPUT como aceptar todo el tráfico entrante.

  • iptables -P FORWARD ACCEPT: Define la política por defecto para la cadena FORWARD, que controla el tráfico que pasa por el sistema (utilizado en el enrutamiento).

  • iptables -P OUTPUT ACCEPT: Establece que todo el tráfico saliente será permitido.

Las opciones -P establecen la política predeterminada (policies) para cada cadena.

4. Creación y Trabajo con Cadenas

Podemos crear cadenas personalizadas en iptables para agrupar reglas según nuestras necesidades:

  • iptables -N <nombre_cadena>: Crea una nueva cadena de reglas personalizada.

  • iptables -X <nombre_cadena>: Elimina una cadena personalizada previamente creada (siempre y cuando no esté en uso por ninguna regla).

  • iptables -A INPUT -j <nombre_cadena>: Reenvía el tráfico de red a una cadena definida por el usuario desde la cadena INPUT.

5. Permitir o Denegar Tráfico con Condiciones

Podemos usar iptables para permitir o denegar tráfico basado en varias condiciones:

  • Permitir tráfico de una IP específica a un puerto específico:

iptables -A INPUT -p tcp -s <IP> --dport <puerto> -j ACCEPT

Este comando permite el tráfico TCP entrante (-p tcp) desde una IP específica (-s <IP>) a un puerto determinado (--dport <puerto>), y la acción -j ACCEPT especifica que el tráfico debe ser aceptado.

  • Denegar tráfico de una IP específica a un puerto específico:

iptables -A INPUT -p tcp -s <IP> --dport <puerto> -j DROP

Similar al comando anterior, pero la acción -j DROP indica que el tráfico debe ser descartado.

6. Eliminar Reglas Específicas

Si necesitamos eliminar reglas específicas, podemos hacerlo de la siguiente manera:

  • Eliminar una regla usando su número:

iptables -D INPUT <número_de_regla>

Aquí, <número_de_regla> indica la posición de la regla en la cadena. Se puede ver el número de regla utilizando el comando iptables -L --line-numbers.

7. Guardado, Restauración y Log de Reglas

Es esencial poder guardar y restaurar las reglas de iptables para evitar que se pierdan tras un reinicio del sistema:

  • Guardar reglas:

iptables-save > /ruta/archivo

Guarda todas las reglas actuales en un archivo que puede restaurarse posteriormente.

  • Restaurar reglas:

iptables-restore < /ruta/archivo

Restaura las reglas desde el archivo guardado.

  • Registrar paquetes descartados: 

iptables -A INPUT -p tcp --dport <puerto> -j LOG --log-prefix "IPTables-Dropped: " --log-level 4

Este comando registra los paquetes descartados para poder analizarlos más tarde en los archivos de log del sistema.

8. Redireccionamiento de NAT y Reenvío de Puertos

Para configurar el reenvío de puertos o redireccionamiento de NAT, iptables ofrece poderosas herramientas:

  • Habilitar NAT en una interfaz:

iptables -t nat -A POSTROUTING -o <interfaz> -j MASQUERADE

Este comando habilita la traducción de direcciones en una interfaz de red específica.

  • Reenviar tráfico de un puerto a otro:

iptables -t nat -A PREROUTING -p tcp --dport <puerto_fuente> -j DNAT --to-destination <IP_destino>:<puerto_destino>

Aquí, redirigimos el tráfico entrante desde el puerto_fuente hacia otro puerto y dirección IP, lo que es útil en configuraciones de servidores con múltiples servicios.

Ejemplo Práctico Completo:

Supongamos que queremos permitir el acceso SSH (puerto 22) solo desde una IP específica (por ejemplo, 192.168.1.100), denegar todo el acceso a dicho puerto para otras IPs, y registrar cualquier intento de acceso fallido.

  1. Permitir acceso SSH desde la IP 192.168.1.100:

iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
  1. Denegar el acceso SSH desde otras IPs:

iptables -A INPUT -p tcp --dport 22 -j DROP
  1. Registrar los intentos de acceso fallidos:

iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-Denied: " --log-level 4

Con esta configuración, estamos protegiendo el servidor SSH permitiendo solo el acceso desde una IP de confianza, bloqueando otras conexiones y registrando cualquier intento no autorizado.

En resumen, iptables es una herramienta robusta para gestionar la seguridad de la red en sistemas Linux.

Su flexibilidad y capacidad para crear reglas personalizadas nos permiten adaptarnos a las necesidades de cada escenario en una red.