Búsqueda de sitios web

Tutorial de Iptables


Iptables es un cortafuegos de línea de comandos que filtra los paquetes según las reglas definidas. Con Iptables, los usuarios pueden aceptar, rechazar o continuar conexiones; es increíblemente versátil y ampliamente utilizado a pesar de haber sido reemplazado por nftables.

Después de leer este tutorial, comprenderá las políticas de Iptables y definirá las reglas de Iptables para proteger su red doméstica.

Nota: se agregó el comando sudo para los lectores que necesitan copiar y pegar las reglas mencionadas en este tutorial de iptables.

Glosario de iptables:

OBJETIVO: al usar iptables, un objetivo es una acción que desea que Iptables aplique cuando un paquete coincide con una regla.

CADENA: Una cadena es una lista de reglas; Las cadenas integradas disponibles son: ENTRADA, SALIDA, ADELANTE, PRE-ENRUTAMIENTO y POST-ENRUTAMIENTO.

TABLA: Las tablas son características de iptables para cada propósito. Por ejemplo, hay una tabla para tareas de enrutamiento y otra tabla para tareas de filtrado; cada tabla contiene cadenas de reglas.

Las tablas disponibles son filter, nat, raw, security y mangle. Cada tabla contiene cadenas (reglas) integradas. La siguiente lista muestra qué cadenas incluyen cada tabla:

FILTER INPUT OUTPUT FORWARD
NAT PREROUTING POSTROUTING OUTPUT
RAW PREROUTING OUTPUT
MANGLE PREROUTING POSTROUTING OUTPUT INPUT FORWARD
SECURITY INPUT OUTPUT FORWARD

Según la acción que desee que realice iptables, debe especificar una tabla con la opción -t seguida del nombre de la tabla. En este tutorial, la opción -t no se usa. Este tutorial se enfoca en el filtrado usando la tabla de filtros que se aplica de manera predeterminada cuando no se pasa la opción -t. Mientras lee este tutorial, aprenderá algunos de los conceptos mencionados anteriormente.

Cómo instalar:

Para instalar Iptables en Debian y sus distribuciones basadas en Linux, ejecute:

sudo apt install iptables -y

Antes de instalar Iptables en distribuciones de Linux basadas en RedHat, debe deshabilitar Firewalld ejecutando:

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask --now firewalld

Luego instale Iptables ejecutando:

sudo yum install iptables-services
sudo systemctl start iptables
sudo systemctl start ip6tables
sudo systemctl enable iptables
sudo systemctl enable ip6tables
sudo systemctl start ip6tables

Primeros pasos con Iptables:

Antes de comenzar, verifique las reglas anteriores instruyendo a iptables para que enumere las políticas y reglas existentes usando el parámetro -L (–list).

sudo iptables -L

El resultado anterior muestra 3 filas: Cadena de ENTRADA, Cadena ADELANTE y Cadena de SALIDA. Donde INPUT se refiere a las políticas relacionadas con el tráfico entrante, OUTPUT se refiere a las políticas aplicadas al tráfico saliente y FORWARD se refiere a las políticas de enrutamiento.

El resultado también muestra que no hay reglas definidas y se aceptan todas las políticas definidas.

Hay 3 tipos de políticas: ACEPTAR, RECHAZAR y ABANDONAR.

La política ACEPTAR permite conexiones; la política REJECT rechaza las conexiones que devuelven un error; la política DROP rechaza conexiones sin producir errores.
Al usar DROP, los paquetes UDP se eliminan y el comportamiento será el mismo que al conectarse a un puerto sin servicio. Los paquetes TCP devolverán un ACK/RST, que es la misma respuesta con la que responderá un puerto abierto sin servicio. Cuando se usa REJECT, un paquete ICMP devuelve un destino inalcanzable al host de origen.

Cuando trata con Iptables, primero debe definir las tres políticas para cada cadena; después de eso, puede agregar excepciones y especificaciones. La adición de políticas se ve así:

sudo iptables -P INPUT         <ACCEPT/DROP/REJECT>
sudo iptables -P OUTPUT     <ACCEPT/DROP/REJECT>
sudo iptables -P FORWARD <ACCEPT/DROP/REJECT>

Políticas permisivas y restrictivas de Iptables:

Puede aplicar Iptables con una política permisiva aceptando todas las conexiones entrantes excepto aquellas que descarte o rechace específicamente. En este caso, todas las conexiones están permitidas a menos que defina una regla para rechazarlas específicamente.

Por el contrario, las políticas restrictivas rechazan todas las conexiones a excepción de las que usted acepta específicamente. En este caso, se rechazan todas las conexiones a menos que defina una regla para aceptarlas.

Aplicar una política restrictiva con Iptables:

El siguiente ejemplo muestra cómo aplicar una política restrictiva con Iptables descartando todo el tráfico entrante excepto el permitido.

Bloqueo del tráfico entrante.

IMPORTANTE: la aplicación de las siguientes 3 reglas puede dejarlo sin conexión a Internet. Usando las reglas mencionadas en "Reglas de adición de Iptables y estados de Iptables", agrega las excepciones necesarias para restaurar su acceso a Internet. Puede ejecutar constantemente sudo iptables -F para vaciar las reglas.

Puede bloquear todo el tráfico entrante, permitiendo que solo el tráfico saliente navegue por la web y para las aplicaciones que necesita.

sudo iptables -P INPUT DROP

sudo iptables -P OUTPUT ACCEPT

sudo iptables -P FORWARD DROP

Dónde :

-P=Política

sudo iptables -P INPUT DROP: indica a iptables que rechace todo el tráfico entrante sin responder a la fuente.

sudo iptables -P OUTPUT ACCEPT: define una política ACCEPT para el tráfico saliente.

sudo iptables -P FORWARD DROP: indica a iptables que no ejecute tareas de enrutamiento descartando todos los paquetes destinados a un host diferente (intentando pasar a través del dispositivo con firewall) sin respuesta.

El ejemplo anterior permite navegar por la web y las conexiones iniciadas por el dispositivo local (-P OUTPUT ACCEPT), pero evitará las conexiones iniciadas por otro host (-P INPUT DROP) como ssh los intentos de acceder a su dispositivo no devuelven mensajes de error.

Cuando habilita Iptables con una política restrictiva como en el ejemplo anterior, debe agregar reglas para ajustar su configuración. Por ejemplo, si mantiene la configuración mencionada anteriormente sin agregar una excepción razonable para la interfaz loopback (lo), es posible que algunas aplicaciones no funcionen correctamente. También deberá permitir el tráfico entrante perteneciente o relacionado con una conexión iniciada por su dispositivo.

Reglas de adición de Iptables y estados de Iptables

Es fundamental entender que Iptables aplica reglas por orden. Cuando define una regla después de una regla anterior, la segunda regla reescribirá la última si un paquete coincide con la misma regla.

Me gusta el ejemplo anterior; bloqueó todo el tráfico entrante, debe agregar excepciones para la interfaz de bucle invertido; esto se puede lograr agregando el parámetro -A (Agregar).

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

El módulo  (-m) conntrack –ctstate ESTABLECIDO,RELACIONADO indica a Iptables que confirme si el estado de la conexión es ESTABLECIDO o RELACIONADO con una conexión existente antes de aplicar la política de reglas definida.

Hay 4 estados posibles que Iptables puede verificar:

Iptables state NEW: el paquete o el tráfico que permite o bloquea intenta iniciar una nueva conexión.

Estado de iptables ESTABLECIDO: el paquete o el tráfico que permite o bloquea forma parte de una conexión establecida.

Estado de iptables  RELACIONADO: el paquete o el tráfico inicia una nueva conexión pero está relacionado con una conexión existente.

Iptables state INVALID: el paquete o el tráfico son desconocidos sin el estado.

La primera línea del ejemplo anterior le indica a Iptables que acepte paquetes entrantes del tráfico que proviene o está relacionado con las conexiones iniciadas por su dispositivo. La segunda línea indica a Iptables que acepte solo tráfico saliente de conexiones ya establecidas.

Iptables Append para aceptar tráfico de loopback y definir interfaces:

La interfaz loopback es utilizada por programas que necesitan interactuar con el host local. Si no permite el tráfico de loopback, es posible que algunas aplicaciones no funcionen.

El siguiente comando permite conexiones de loopback:

sudo iptables -A INPUT -i lo -j ACCEPT

sudo iptables -A OUTPUT -o lo -j ACCEPT

Donde -i y -o se utilizan para especificar el dispositivo de red para el tráfico entrante (-i) y el tráfico saliente (-o).

Aplicando una política permisiva con Iptables:

También puede definir una política permisiva que permita todo el tráfico excepto el descartado o rechazado especificado. Puede habilitar todo excepto una IP específica o un rango de IP, o puede rechazar paquetes en función de sus encabezados, entre más posibilidades.

El siguiente ejemplo muestra cómo aplicar una política permisiva que permita todo el tráfico excepto un rango de IP bloqueado para el servicio ssh.

sudo iptables -P INPUT ACCEPT

sudo iptables -P OUTPUT ACCEPT

sudo iptables -P FORWARD DROP

sudo iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.1.100-192.168.1.110 -j REJECT

El ejemplo anterior aplica una política permisiva pero bloquea el acceso ssh a todas las IP que pertenecen al rango 192.168.1.100 y 192.168.1.110.

Donde -p especifica el protocolo, –dport (o –destination-port) el puerto de destino (22,ssh), y el módulo iprange con el argumento –src-range (rango de origen) permite definir el rango de IP. La opción -j (–jump) indica a iptables qué hacer con el paquete; en este caso, representamos REJECT.

Bloqueo de puertos con Iptables

El siguiente ejemplo muestra cómo bloquear un puerto específico para todas las conexiones, el puerto ssh.

sudo iptables -A INPUT -p tcp --destination-port 22 -j DROP

Guardando los cambios de Iptables

Las reglas de Iptables no son persistentes; después de reiniciar, las reglas no se restaurarán. Para que sus reglas sean persistentes, ejecute los siguientes comandos donde la primera línea guarda las reglas en el archivo /etc/iptables.up.rules, y la segunda línea es para crear el archivo para que iptables se inicie después de reiniciar.

sudo  iptables-save > /etc/iptables.up.rules

nano /etc/network/if-pre-up.d/iptables

Agrega lo siguiente al archivo y cierra guardando cambios (CTRL+X).

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules

Finalmente, otorgue permisos de ejecución al archivo ejecutando:

chmod +x /etc/network/if-pre-up.d/iptables

Vaciar o eliminar las reglas de Iptables:

Puede eliminar todas sus reglas de Iptables ejecutando el siguiente comando:

sudo iptables -F

Para eliminar una cadena específica como INPUT, puede ejecutar:

sudo iptables -F

Conclusión:

Iptables se encuentran entre los firewalls más sofisticados y flexibles del mercado. A pesar de ser reemplazado, se mantiene como uno de los software defensivos y de enrutamiento más difundidos.

Su implementación puede ser aprendida rápidamente por nuevos usuarios de Linux con conocimientos básicos de TCP/IP. Una vez que los usuarios entienden la sintaxis, definir reglas se convierte en una tarea fácil.

Hay muchos más módulos y opciones adicionales que no fueron cubiertos por este tutorial introductorio. Puede ver más ejemplos de iptables en Iptables para principiantes.

Espero que este tutorial de Iptables haya sido útil. Siga las sugerencias de Linux para obtener más consejos y tutoriales de Linux.