Comandos iptables para configurar un firewall en Linux con ejemplos

Un firewall es un dispositivo de seguridad informática que permite o bloquea el tráfico de paquetes entre dos o más redes, en función de un conjunto de reglas definidas. Trabaja en la capa 3 y 4 del modelo OSI filtrando el tráfico de los protocolos UDP, TCP, ICMP e IP, decidiendo si los paquetes de red pasan o se descartan.  Se trata de un dispositivo muy versátil debido a que puede realizar modificaciones sobre las telecomunicaciones. En este artículo veremos el uso de los comandos iptables para configurar un firewall en Linux con ejemplos.

comandos iptables para firewall

Topología básica de un firewall

Los firewalls están presentes en todas partes; en nuestros routers de banda ancha, en las empresas, en nuestros computadores y en cualquier dispositivo con Internet.

Internet es una red bastante inhóspita por la agresividad de los atacantes informáticos.

Bueno, vamos al grano porque aprender a dominar iptables es de bastante práctica con el teclado.

Ejemplos para configurar un firewall en Linux con iptables


Si te encuentras en un ambiente empresarial, los siguientes comandos te ayudarán a desplegar un potente firewall en Linux.

Abrir puerto del servicio DNS


Ya sea que uses los DNS típicos de Gooogle (8.8.8.8), o los que te proporcine tu ISP, tu firewall debe tener el puerto 53 abierto para que la red de área local pueda navegar en Internet a la perfección:

El puerto de red conectado a Internet se llama enp6s4f1.

#Ponemos iptables desde cero (hazlo una sola vez o cuando necesites iniciar desde cero el firewall
iptables -t nat -F
iptables -t nat -X
iptables -F

#Abrimos los puertos del servicio DNS
iptables -t nat -A POSTROUTING -o enp6s4f1 -p tcp --dport 53 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp6s4f1 -p udp --dport 53 -j MASQUERADE

comandos iptables para firewall

Habilitando puertos DNS

Usamos el objetivo MASQUERADE para trabajar con conexiones telefónicas, o banda ancha tipo hogar, que obtienen direcciones IP dinamicamente con DHCP. De todas formas el objetivo MASQUERADE lo podemos usar tanto en conexiones IP asignadas dinamicamente, en las que antes de conectar con el ISP no sabemos la dirección que tendremos, como también en conexiones de Internet dedicado (con IP pública fija). Sin embargo, si tienes una conexión IP estática, también puedes usar el objetivo SNAT en su lugar.

El objetivo MASQUERADE sólo es válido en la cadena POSTROUTING de la tabla nat, igual que el objetivo SNAT.

Habilitar ICMP


Ahora, habilitamos el puerto ICMP para podamos hacer pruebas de conectividad con el comando ping hacía cualquier dominio o ip pública en Internet

# PUERTO ICMP (PARA PING)
iptables -t nat -A POSTROUTING -o enp6s4f1 -p ICMP -j MASQUERADE

 

Habilitar el servicio de correo


Reglas para habilitar la conexión a los protocolos de correo tipo SMTP, POP3, IMAP y correo seguro con SSL:

iptables -t nat -A POSTROUTING -o enp6s4f1 -p tcp --dport 25 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp6s4f1 -p tcp --dport 110 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp6s4f1 -p tcp --dport 993 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp6s4f1 -p tcp --dport 465 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp6s4f1 -p tcp --dport 587 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp6s4f1 -p tcp --dport 465 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp6s4f1 -p tcp --dport 143 -j MASQUERADE

comandos iptables para firewall

Habilitando servicios de correo

Habilitar FTP


Habilitamos el sistema con un par de módulos y configuramos el firewall para que la red pueda hacer conexiones al protocolo FTP

# Habilitamos en netfilter los modulos ftp para que se active la trasnferencia entre el un cliente y un servidor FTP
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -t nat -A POSTROUTING -o enp6s4f1 -p tcp --dport 20 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp6s4f1 -p tcp --dport 21 -j MASQUERADE

Habilitando conexión al servicio FTP

Habilitar full navegación a un computador específico ó a un rango de equipos


Creamos una regla para que el host con dirección privada 192.168.0.32 tenga navegación completa a Internet (abrimos todos los puertos específicamente para esa IP):

iptables -t nat -A POSTROUTING -o enp6s4f1 -s 192.168.0.32 -j MASQUERADE

Ahora habilitamos full navegación a un rango de direcciones IP privadas. La siguiente regla nos ayudará para que el rango de direcciones ip, desde la 192.168.0.100 hasta 192.168.0.254, tenga navegación completa:

iptables -t nat -A POSTROUTING -o enp6s4f1 -m iprange --src-range 192.168.0.100-192.168.0.254 -j MASQUERADE

Full Internet a un rango específico

Habilitar el acceso a servicios desde Internet a nuestra red


Necesitamos que un empleado se conecte desde su casa a un computador de la red privada, por Escritorio Remoto (protocolo RDP, puerto 3389):

iptables -t nat -A PREROUTING -i enp6s4f1 -p tcp --dport 3389 -j DNAT --to 192.168.0.9

Conexión desde afuera a un host

Servicio de correo interno


Tenemos un servicio de correo electrónico en la dirección ip privada 192.168.0.22, y necesitamos que los usuarios puedan usarlo desde cualquier lugar del mundo:

iptables -t nat -A PREROUTING -i enp6s4f1 -p tcp -m multiport --dports 25,110,143,465,993,995,587 -j DNAT --to 192.168.0.22

Conexión desde afuera a un servidor

Aunque estos dos últimos ejemplos corresponden a una DMZ (Zona Desmilitarizada), lo mejor es hacerlo con los servidores conectados en otro puerto del firewall, aislados de la red de datos de los usuarios, así:

DMZ

Bloquear completamente la navegación


Regla para bloquear el acceso a Internet en dos dispositivos de la red privada

# BLOQUEA INTERNET PARA DOS EQUIPOS CON RESTRICCIONES
iptables -A FORWARD -s 192.168.0.169 -o enp6s4f1 -j REJECT
iptables -A FORWARD -s 192.168.0.189 -o enp6s4f1 -j DROP

Básicamente el objetivo REJECT (rechazar) funciona igual al objetivo DROP. La diferencia es que el primero devuelve un mensaje de error al host que envío el paquete. Solo es válido en las cadenas INPUT, FORWARD y OUTPUT.

¿Abrirlos todos y ajustar, o cerrarlos todos y ajustar?


Supongo que te preguntarás ¿Bueno, para qué molestarse abriendo cada puerto si podemos abrirlos todos de un solo golpe?… Bueno, en un ambiente empresarial tienes más control de la seguridad informática cerrándolos todos, y abriendo los que realmente necesitan los usuarios.

Además, notarás que en ningún momento hemos abierto el puerto 80, y eso es debido a que la mejor práctica es que los usuarios naveguen en Internet por medio de un Proxy montado sobre este mismo firewall. El servidor Proxy recibe las conexiones por el puerto 3128 ó 8080.

Restringir las actualizaciones automáticas del Windows Update en horarios específicos


Si bien es cierto que las empresas cuentan con altas velocidades en sus canales de Internet, en ocasiones no son suficientes para las desbordadas actualizaciones de Microsoft Windows, sobretodo si son más de 100 estaciones de trabajo con Windows 10. Por eso, con un poco de Cron y el siguiente paquete de reglas, podemos montar una especie de pico y placa para el Windows Update (aunque una mejor solución es montar WSUS):

iptables -A FORWARD -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "ctldl.windowsupdate.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "ctldl.windowsupdate.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "2.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "2.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "3.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "3.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "7.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "7.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "11.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "11.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "download.windowsupdate.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "download.windowsupdate.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "update.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "update.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "windowsupdate.microsoft.com" -j DROP
iptables -A FORWARD -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "windowsupdate.microsoft.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "ctldl.windowsupdate.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "ctldl.windowsupdate.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "2.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "2.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "3.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "3.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "7.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "7.tlu.dl.delivery.mp.microsoft.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "download.windowsupdate.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "download.windowsupdate.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "update.microsoft.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "update.microsoft.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "windowsupdate.microsoft.com" -j DROP
iptables -A INPUT -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "windowsupdate.microsoft.com" -j DROP

Lo que iptables hace en este caso con ayuda del algoritmo Boyer Moore (--algo bm), es evaluar si los paquetes contienen la cadena (string) “microsoft”, “windowsupdate” y similares. Si la condición se cumple, entonces procede a bloquear toda conexión con destino al Windows Update.

Guardamos el anterior paquete de reglas en un archivo bash con permisos de ejecución. Luego, lo programamos en Cron para que se ejecute en el horario pico, que casi siempre es en las mañanas cuando el personal llega a encender sus estaciones de trabajo.

Debemos armar un segundo paquete con la eliminación de esas reglas para que el firewall habilite la conexión a las actualizaciones pasada la hora pico.

Para eliminar solo debemos cambiar el -A por -D

iptables -D FORWARD -m iprange --src-range 192.168.0.2-192.168.0.254 -m string --algo bm --string "ctldl.windowsupdate.com" -j DROP
iptables -D FORWARD -m iprange --src-range 192.168.150.2-192.168.150.254 -m string --algo bm --string "ctldl.windowsupdate.com" -j DROP

Observe el reflejo de esta medida de control, donde iptables se programa para que habilite la conexión con el Windows Update a partir de la 1:00 PM (Gráfico generado con Monitorix)

Puedes leer más en este articulo sobre monitorear tráfico de red con GNU/Linux.

Habilitar solo hasta cinco conexiones a Windows Update


Si necesitamos suavizar un poco la anterior medida de control, podemos configurar iptables para permita hasta cinco conexiones simultaneas al Windows Update:

iptables -A FORWARD -p tcp --syn --dport 443 -m connlimit --connlimit-above 5 -m string --algo bm --string "ctldl.windowsupdate.com" -j REJECT --reject-with tcp-reset
iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -m string --algo bm --string "ctldl.windowsupdate.com" -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -m string --algo bm --string "ctldl.windowsupdate.com" -j REJECT --reject-with tcp-reset

Visualización de las reglas


La visualización de las reglas que hayamos creado la podemos hacer con el siguientes comandos iptables:

iptables -t nat -L
iptables -L INPUT

 

Hasta aquí un poco de iptables, sin embargo, son cientos de posibilidades con este fantástico firewall en Linux. Te recomiendo la página web de Netfilter por si quieres profundizar más sobre este genial cortafuegos.

netfilter.org/documentation/HOWTO/es/packet-filtering-HOWTO.html

Vea cómo configurar un servidor Proxy con Squid, aquí

Comandos iptables Overall rating: ★★★★★ 5 based on 1 reviews
5 1

 

Su nombre
Email
Titulo
Valoración
Opinión

 

Excelente

★★★★★
5 5 1
Muy bien, todo muy claro

 

Comparte esto en
Publicado en Seguridad Informática.