Firewall con IPTABLES con DROP como política por defecto

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.

fw.jpg

 

## 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

Escrito en Personal, Tecnología.

21 comentarios para “Firewall con IPTABLES con DROP como política por defecto”

  1. Nuna Dice:

    A mí Accept me gusta ;P MMmmmmm, creo que entiendo mejor los jeroglífivos egípcios…. Muchos chus!!!!

  2. crucible Dice:

    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

  3. Nuna Dice:

    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?

  4. blue Dice:

    Facilisimo¡¡

  5. crucible Dice:

    Vaya con la usuaria avanzada… ;-)

  6. Maxi Dice:

    Muchas Felicidades por el script!

    Tiene muy buena pinta!!

    Voy a intentar pelearme con el iptables tb! :)

  7. wecito Dice:

    muy bueno el script, lo veo fabuloso debido a que se abre lo que realmente se necesita.

  8. kanek Dice:

    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 . .

  9. César Dice:

    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

  10. crucible Dice:

    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.

  11. jako Dice:

    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 . .

  12. crucible Dice:

    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…

  13. Will Dice:

    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

  14. crucible Dice:

    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.

  15. will Dice:

    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

  16. SKY Dice:

    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…

  17. crucible Dice:

    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.

  18. Cezzare Dice:

    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.

  19. josue507 Dice:

    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…

  20. JAQUI Dice:

    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

  21. JAQUI Dice:

    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

Escribe un comentario