Hace unos días me tocó estar peleándome con IPTABLES para montar un pequeño firewall en una máquina Linux con tres interfaces de red para las tres zonas a filtrar (LAN, DMZ y WAN). Quería implementarlo con política por defecto DROP para todas las cadenas y buscando por internet algún ejemplo en el que basarme, me di cuenta de que no abundan, sino que, la gran mayoría de los scripts que encontré, tienen ACCEPT como política por defecto. Por éso, se me ha ocurrido publicar aquí el script que preparé. No es que sea muy complejo y seguro que no está todo lo optimizado que podría, pero a lo mejor le puede servir a alguien para hacerse un idea, caso de que necesite algo de ayuda y esté buscando por la web algún ejemplo con política DROP. Por lo menos a mí, me hubiera venido bien encontrar algo así en su día, así que aquí dejo el script junto con su esquema de red correspondiente.

## 1. Seguridad del equipo FW
# FLUSH de reglas (limpia todas las cadenas,
# borra cadenas vacías y pone a 0 los
# contadores de paquetes y bytes)
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
# Poner por defecto la regla “Denegar todo”.
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t nat -P PREROUTING DROP
iptables -t nat -P POSTROUTING DROP
# Permitir el tráfico de entrada hacia el FW
# por la interfaz eth0 (LAN)
iptables -t nat -A PREROUTING -i eth0 -j ACCEPT
# Permitir el acceso al FW desde el equipo del administrador
# (10.0.0.1) por Telnet (puerto 23).
# Al haberse establecido que la política por defecto sea DROP,
# hay que permitir el tráfico en los dos sentidos.
iptables -A INPUT -s 10.0.0.1 -p tcp –dport 23 -j ACCEPT
iptables -A OUTPUT -d 10.0.0.1 -p tcp –sport 23 -j ACCEPT
# Evitar intentos de IP Spoofing
# El spoof vendría de la red externa (WAN) a través de la
# interfaz eth1, por eso se rechaza todo el tráfico que
# entre por la eth1 con una ip de origen de la red interna
# (192.168.100.0/24 y 10.0.0.0/24), que sería una ip falseada.
iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/24 -j DROP
## 2. Conexiones LAN-DMZ
# IMPORTANTE:
# Activación del BIT de FORWARDING, para permitir hacer
# FORWARD de paquetes en el firewall.
echo “1″ > /proc/sys/net/ipv4/ip_forward
# Permitir el tráfico de salida por eth2 (DMZ)
iptables -t nat -A POSTROUTING -o eth2 -j ACCEPT
# Permitir a todos los equipos de la LAN hacer consultas
# UDP al servidor DNS de la DMZ.
iptables -A FORWARD -s 10.0.0.0/24 -d 192.168.100.1 -p udp –dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.100.1 -d 10.0.0.0/24 -p udp –sport 53 -j ACCEPT
# Permitir hacer PING a los equipos de la DMZ desde la LAN.
iptables -A FORWARD -s 10.0.0.0/24 -d 192.168.100.0/24 -p icmp -j ACCEPT
iptables -A FORWARD -s 192.168.100.0/24 -d 10.0.0.0/24 -p icmp -j ACCEPT
# Permitir al equipo del administrador acceso total a la DMZ.
iptables -A FORWARD -s 10.0.0.1 -d 192.168.100.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.100.0/24 -d 10.0.0.1 -j ACCEPT
## 3. Conexiones WAN-DMZ
# Aplicar NAT a los servidores de la DMZ 192.168.100.2
# (HTTP y HTTPS) y 192.168.100.1 (DNS) para ocultar su IP interna.
# Así los paquetes que lleguen con destino a la DMZ y esos puertos,
# se encaminarán a esos servidores.
iptables -t NAT -A PREROUTING -i eth1 -p tcp –dport 80 -j DNAT –to-destination 192.168.100.2:80
iptables -t NAT -A PREROUTING -i eth1 -p tcp –dport 443 -j DNAT –to-destination 192.168.100.2:443
iptables -t NAT -A PREROUTING -i eth1 -p udp –dport 53 -j DNAT –to-destination 192.168.100.1:53
# Permitir la conexión al servidor WWW de la DMZ
# desde la WAN por HTTP (puerto 80).
iptables -A FORWARD -p tcp –dport 80 -i eth1 -o eth2 -j ACCEPT
iptables -A FORWARD -p tcp –sport 80 -i eth2 -o eth1 -j ACCEPT
# Permitir la conexión al servidor WWW de la DMZ
# desde la WAN por HTTPS (puerto 443).
iptables -A FORWARD -p tcp –dport 443 -i eth1 -o eth2 -j ACCEPT
iptables -A FORWARD -p tcp –sport 443 -i eth2 -o eth1 -j ACCEPT
# Permitir la conexión al servidor DNS de la DMZ
# desde la WAN por el puerto 53 (udp).
iptables -A FORWARD -p udp –dport 53 -i eth1 -o eth2 -j ACCEPT
iptables -A FORWARD -p udp –sport 53 -i eth2 -o eth1 -j ACCEPT
## 4. Conexiones WAN-LAN
# Por tener la política por defecto en DROP, no se puede acceder
# a la LAN desde la WAN ni viceversa. Si desde la LAN se debiera
# poder acceder a algún servicio en la WAN, añadiríamos las líneas
# que vienen a continuación. En este ejemplo, para salir a la WAN
# por HTTP y HTTPS. En primer lugar se enmascaran las IPs de la
# LAN al salir a la WAN y después se habilita el tráfico en los
# dos sentidos para el puerto 80 y el 443.
# Enmascarar la IP de los equipos de la LAN
# a la hora de salir hacia la WAN.
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE
# Se permite el acceso hacia el exterior (WAN) para
# navegación web (HTTP y HTTPS).
# El resto de las conexiones desde el exterior (WAN)
# hacia la red interna (LAN) (las que no proceden de los
# puertos 80 y 443) no están permitidas por haber establecido
# por defecto la regla “denegar todo” (DROP).
iptables -A FORWARD -p tcp -i eth0 -o eth1 -m state –state NEW,ESTABLISHED,RELATED –dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -i eth1 -o eth0 -m state –state ESTABLISHED,RELATED –sport 80 -j ACCEPT
iptables -A FORWARD -p tcp -i eth0 -o eth1 -m state –state NEW,ESTABLISHED,RELATED –dport 443 -j ACCEPT
iptables -A FORWARD -p tcp -i eth1 -o eth0 -m state –state ESTABLISHED,RELATED –sport 443 -j ACCEPT









Miércoles, 3 Octubre, 2007. 17:39 a las 17:39
A mí Accept me gusta ;P MMmmmmm, creo que entiendo mejor los jeroglífivos egípcios…. Muchos chus!!!!
Viernes, 5 Octubre, 2007. 18:10 a las 18:10
Vaaaya… ¿entiendes los jeroglífivos? El otro día oí hablar sobre ellos, decían que eran como los jeroglíficos pero con acento catalán. Qué cosas, ¿eh? ;-P
Viernes, 5 Octubre, 2007. 20:06 a las 20:06
Con todos los respetos, señor Crucible…. serás GILIPOLLAS!!!! Que se me fue un dedito… Creo que ahora mismo se me está yendo otro, el corazón, así, para arriba… qué cosas, eh?
Domingo, 7 Octubre, 2007. 11:20 a las 11:20
Facilisimo¡¡
Domingo, 7 Octubre, 2007. 19:37 a las 19:37
Vaya con la usuaria avanzada…
Domingo, 25 Noviembre, 2007. 19:03 a las 19:03
Muchas Felicidades por el script!
Tiene muy buena pinta!!
Voy a intentar pelearme con el iptables tb!
Martes, 27 Noviembre, 2007. 20:35 a las 20:35
muy bueno el script, lo veo fabuloso debido a que se abre lo que realmente se necesita.
Viernes, 22 Febrero, 2008. 6:41 a las 6:41
q tal muy bueno tu script man . .
yo utilizo un squid y solo tengo en drop el forward . .
me gustaria dejar en drop el input pero el proxy me bloquea el servicio de internet para la lan . .
Lunes, 17 Marzo, 2008. 19:58 a las 19:58
Excelente script …. pregunta … estas reglas para qué son (que pena la ignorancia)??
iptables -A FORWARD -p tcp -i eth0 -o eth1 -m state –state NEW,ESTABLISHED,RELATED –dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -i eth1 -o eth0 -m state –state ESTABLISHED,RELATED –sport 80 -j ACCEPT
iptables -A FORWARD -p tcp -i eth0 -o eth1 -m state –state NEW,ESTABLISHED,RELATED –dport 443 -j ACCEPT
iptables -A FORWARD -p tcp -i eth1 -o eth0 -m state –state ESTABLISHED,RELATED –sport 443 -j ACCEPT
Lunes, 17 Marzo, 2008. 20:41 a las 20:41
Son para permitir la salida desde la LAN hacia el exterior por los puertos 80 y 443.
Se usa el STATE para hacer seguimiento de conexiones (connection tracker). Permite sólo la entrada desde el exterior de paquetes ESTABLISHED y RELATED con respecto a conexiones creadas en primer lugar desde la LAN. Con ello, permites la entrada a la LAN de paquetes pero únicamente aquellos que corresponden a una conexión establecida desde la LAN o los relacionadas con ella. Si son paquetes que no tienen que ver con una conexión iniciada desde la LAN, serán rechazados. El NEW es para poder crear una conexión, fíjate que sólo están en las reglas de salida.
No sé si lo he explicado bien.
Domingo, 6 Abril, 2008. 3:15 a las 3:15
gracias por dar a conocer tu manual. .
he tenido problemas para dar servicio ssh sobre una red en especifica. .
(esta me funcionava bien, pero ya no me ha dado resultado)
iptables -A INPUT -p tcp -j ACCEPT -s 192.168.0.0 -d \192.168.121.128 -m state –state NEW,ESTABLISHED,RELATED –dport 22
Acceso SSH (no he ha dado resultado solo me acepta las reglas pero nada)
iptables -A FORWARD -s 192.168.0.0 -d 192.168.121.128 -p tcp –dport 22 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0 -d 192.168.121.128 -p tcp –sport 22 -j ACCEPT
(hasta ahorita solo ocupo esta pero esta abriendo el puerto en general)
iptables -A INPUT -d 192.168.121.128 -p tcp –dport 22 -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT
me podrian iluminar??? de antemano gracias . .
Martes, 8 Abril, 2008. 21:34 a las 21:34
En esas dos reglas estás poniendo el “source” y el “destiny” iguales. En la segunda ya que estás indicando -sport 22, tras -s deberías poner lo que tienes en -d de la regla anterior. Así a simple vista…
Viernes, 11 Abril, 2008. 4:08 a las 4:08
Hola, esta muy bueno el script, una pregunta: como hago si tengo squid en la misma pc donde tengo el fw y quiero redireccionar el trafico web a squid, en que parte del scritp deberia ir
Viernes, 11 Abril, 2008. 8:33 a las 8:33
Si lo que quieres es que el tráfico web de los PCs de la LAN pase por el squid, sería cuestión de enrutamiento. Puedes utilizar el equipo que contiene el Squid y el FW como puerta de enlace y de él enrutar el tráfico hacia el router de salida. Con indicar en la configuración de red de los PCs que la puerta de enlace es este equipo, podría ser suficiente.
Sábado, 12 Abril, 2008. 1:44 a las 1:44
Bueno yo hice esto: iptables -t nat -A PREROUTING -i eth0 -s 192.168.4.0/24 -p tcp –dport 80 -j REDIRECT –to-port 3128
y bueno si me envia el trafico de mis usuarios a squid, mi pregunta es: tengo un tomcat corriendo en el puerto 8520, es necesario hacerlo pasar por squid, osea haria lo anterio asi:
iptables -t nat -A PREROUTING -i eth0 -s 192.168.4.0/24 -p tcp –dport 8520 -j REDIRECT –to-port 3128.
gracias de antemano
Martes, 22 Abril, 2008. 20:41 a las 20:41
Hola a todos… todo esto esta muy bueno, pero yo estoy aqui porque estoy buscando la manera de enlazar 2 redes diferentes… este script esta bueno pero a mi no me sirve…
Yo necesito hacer lo siguiente ej:
(LAN1) (SERVIDOR) (Router) (Router) (SERVIDOR) (LAN2)
Ven… es logar dar ping desde LAN1 a la ip de la LAN2……
El que este en buenas condiciones en iptables y me pueda ayudar en esto… me seria de gran utilidad…OK…
Gracias por la atencion…
Martes, 22 Abril, 2008. 21:34 a las 21:34
Sky, a ver si ésto te vale, que no sé si te he entendido
iptables -A FORWARD -s LAN1 -d LAN2 -p icmp -j ACCEPT
iptables -A FORWARD -s LAN2 -d LAN1 -p icmp -j ACCEPT
Con éso pasarían los paquetes ICMP del ping y sus respuestas. No sé si es lo que buscas.
Miércoles, 30 Abril, 2008. 23:00 a las 23:00
Este script está de maravilla, me ha servido mucho respecto a una duda que tuve sobre enmascaramiento de una sola IP (una tontería para muchos), pero igual a mi se me complicaba bastante entender el funcionamiento de IPTABLES, sin embargo es una herramienta imprescindible desde mi perspectiva.
Viernes, 2 Mayo, 2008. 4:23 a las 4:23
Hola que tal! muy bueno el script; tengo una duda interesante; estoy implementando un portal cautivo con wifidog, ya tengo todo instalado (AUTH, GATEWAY)… el problema es que requiero que cuando los clientes de mi red traten de acceder a internet estos primero sean redirijidos al servidor de autenticacion que actua como webserver (webserver esta en eth2-DMZ); sin embargo aun no consigo nada.
La arquitectura es como sigue:
eth0->WAN eth1->LAN eth2->DMZ
Como deberia ser mi script de iptables y en que orden deberian ir las reglas…. Gracias estoy anuente a sugerencias…
Jueves, 22 Mayo, 2008. 19:11 a las 19:11
hola espero que me puedan ayudar la verdad es que recien estoy en esto del iptables y no lo entiendo mucho tengo el siguiente scrip con drop cuando lo ejecuto no sale ningun error ,mis maquinas enlazadas a mi servidor salen a internet y todo,pero el problema esta en mi maquina que es la servidora donde ejecuto el firewall no sale a internet he intentado de todo t¡y nada quisiera su ayuda gracias
IFLOCAL=”lo”
IFEXTERNA=”eth1″
IFINTERNA=”eth2″
IPEXTERNA=”10.2.2.239″
IPINTERNA=”192.168.1.100″
REDEXTERNA=”10.2.0.0/16″
REDINTERNA=”192.168.1.0/24″
echo “**********************************************”
echo “Activamos el reenvío para que FORWARD funcione”
echo “**********************************************”
echo “1″ > /proc/sys/net/ipv4/ip_forward
echo “**********************************************”
echo “FLUSH de reglas”
echo “**********************************************”
iptables -F
iptables -X
iptables -t nat -F
echo “**********************************************”
echo “Establecemos politica por defecto”
echo “**********************************************”
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
echo “**********************************************”
echo “Nota: eth0 es el interfaz conectado a internet”
echo ” y eth1 a la LAN”
echo “**********************************************”
echo “**********************************************”
echo “Permitimos acceso interno a localhost”
echo “**********************************************”
iptables -A INPUT -i $IFLOCAL -j ACCEPT
iptables -A OUTPUT -o $IFLOCAL -j ACCEPT
echo “**********************************************”
echo “Al firewall tenemos acceso desde la red local”
echo “**********************************************”
iptables -A INPUT -s $REDINTERNA -i $IFINTERNA -j ACCEPT
iptables -A OUTPUT -d $REDINTERNA -o $IFINTERNA -j ACCEPT
echo “**********************************************”
echo “Permitimos la salida hacia la red externa”
echo “**********************************************”
iptables -A OUTPUT -d $REDEXTERNA -o $IFEXTERNA -j ACCEPT
iptables -A OUTPUT -o $IFEXTERNA -j ACCEPT
echo “**********************************************”
echo “Ahora hacemos enmascaramiento de la red local”
echo “**********************************************”
iptables -t nat -A POSTROUTING -s $REDINTERNA -o $IFEXTERNA -j MASQUERADE
Jueves, 22 Mayo, 2008. 19:14 a las 19:14
discuelpen por lo ultimo es :
ptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT