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