Comandos iptables para configurar un firewall en Linux con ejemplos
Un firewall es un dispositivo de seguridad informática, que controla el flujo de datos entrante y saliente entre redes de datos (comunmente entre una red privada e Internet), 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. Veamos algunos comandos iptables para configurar un firewall en Linux con ejemplos.

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.
Comandos iptables para configurar un firewall en Linux – Ejemplos
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 Google (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 hacer resolución de nombres de dominio, y 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

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

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 USUARIOS INTERNOS 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
Si la navegación se realiza por medio de un Proxy server, entonces la regla que la complementarla sería así (8080 es el puerto del proxy server):
iptables -A INPUT -s 192.168.0.169 -p tcp --dport 8080 -j DROP
Para bloquear la dirección IP destino cuando la conexión se hace por medio de un Proxy:
iptables -I OUTPUT 1 -d 207.121.75.132 -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?… Mi consideración es que en un ambiente empresarial debemos tener más control de los puertos, cerrando todos los puertos 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 servidor Proxy, montado sobre este mismo firewall. El servidor Proxy recibe las conexiones por el puerto 3128 u 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í
Puedes aprender más sobre IPTABLES con el siguiente tutorial, es un poco antiguo, pero es lo más completo en sus fundamentos.
https://www.frozentux.net/iptables-tutorial/spanish/iptables-tutorial.html
Puedes ver más aplicaciones de IPTABLES en los siguientes artículos:
Valora este artículo
Excelente
Comparte esto en





Pingback: 🥇 El Modelo OSI de 7 capas ó modelo de red TCP IP
Pingback: 🥇 Optimizar el servidor Proxy - Convertir a Linux en un router
Pingback: Solucionar Problema xauth: file /root/.serverauth. does not exist en CentOS 7
Pingback: 🥇 Bloquear escaneo de puertos en Linux - Detectar y bloquear a NMAP