Nuestro esquema de red:
1- Empecemos permitiendo salir a internet a nuestra red con NAT:
# iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE
En castellano esta regla dice, cambiar la direccion de origen de todo los paquetes que salen por la interface ppp0, por la dirección IP pública asociada a dicha interface. Cuando los paquetes de respuesta regresen, poner la dirección IP privada en lugar de la dirección IP pública que tendran como destino.
En esta regla no se esta haciendo ningun tipo de filtrado, solo se esta aplicando el NAT a los paquetes que coinciden con los criterios expresados en la regla (-o ppp0 -s 192.168.1.0/24, paquetes que salen por ppp0 y vienen de la red 192.168.1.0)
2- Filtremos un poco el tráfico que pasa por le firewall:
# iptables -A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT
Para aceptar todos los paquetes de conexiones ya establecidas o relacionadas con alguna conexiones (mas adelante extenderemos esto).
# iptables -A FORWARD -i eth0 -s 192.168.1.0/24 -m state –state NEW -j ACCEPT
Acepto todo lo que entra por eth0, que sea de la red 192.168.1.0/25 y que afecte solo a paquetes que inician conexiones (tambien lo hablaremos despues).
# iptables -P FORWARD DROP
Pongamos la política en DROP, todo lo que no coincida con las reglas que pusimos arriba sera descartado.
2- Filtremos el tráfico que este destinado al firewall:
# iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
Para aceptar paquetes que sean de conexiones ya establecidas y que vayan hacia el firewall (me refiero a que la direccion IP de destino sea la del firwall, por eso INPUT y no FORWARD, FORWARD es solo para paquetes cuya IP destino NO sea la del firewall).
# iptables -A INPUT -i eth0 -s 192.168.1.0/24 -m state –state NEW -j ACCEPT
Igual que en el caso de FORWARD, pero para lo que vaya destinado al firewall.
# iptables -A INPUT -i lo -j ACCEPT
Para dejar pasar el trafico por la interface de loopback (lo).
Que es eso de -m state?
iptables (llamado netfilter cuando se habla del código en el kernel) tiene una funcionalidad conocida como “conntrack”, cuya función es mantener una tabla de estado de las conexiones que pasan por el firewall (sean del tipo INPUT o FORWARD). Por ejemplo, si alguien establece una conexión desde la red internet hacia un equipo de internet, esa conexión se registrará en la tabla. Los paquetes, cuando estan relacionados a una conexión, puede tener 3 estados: NEW, ESTABLISHED y RELATED.
NEW, son todos los paquetes que inician una nueva conexión, ESTABLISHED corresponde a todos los paquetes que pertenecen a una ya establecida y RELATED son paquetes que estan relacionados a una conexión establecida (por ejemplo, una conexión de datos FTP o un mensaje ICMP de error).
Por ejemplo, en una conexión TCP el primer paquete que viaja con el flag SYN activado para establecer una xones es del tipo NEW, todo el resto de los paquetes es del tipo ESTABLISHED. Un ejemplo de RELATED seria cuando un paquete TCP viaja para abrir una conexión con un puerto de destino inválido, recibirá como respuesta un paquete ICMP de error, este paquete será del tipo RELATED.
En el caso de UDP es distinto, UDP no tiene concepto de conexiones. Suponganse que la máquina A envía un paquete a la máquina B, este paquete sera del tipo NEW. Todo el resto de los paquete que se intercambien A y B (siempre y cuando los puertos de origen y destino se mantengan) seran del tipo RELATED.
Hay un tercer estado llamado INVALID, en el cual caen todos los paquetes que no coinciden a los estados mencionados anteriormente. Por ejemplo, un paquete TCP que no corresponde a una conexión establecidad pero que tampoco es NEW, al no tener el flag SYN activado.
Ahora expliquemos las reglas que usan el –state
Entonces, la primer regla de INPUT y FORWARD usan ESTABLISHED y RELATED para dejar pasar a los paquetes que sean de conexiones establecidas o esten relacionados a una conexión. Esta regla siempre debe estar arriba de todo, por cuestiones de performance, si analizan un poco la mayoría de los paquetes caen en esta regla. Por último, todas las reglas que dejan pasar a cierto tráfico específico (como la que deja pasar a la red en INPUT y FORWARD) le especifico que el estado de los paquetes debe ser NEW, para evitar tráfico basura.
0 comments so far