Siguiendo estas simples reglas, tendremos nuestro Debian (y la lan interna detras de este) un poco mas seguro, si bien un firewall no es mas que uno de los muchos escalones hacia un sistema realmente impenetrable.
Este es un ejemplo de configuracion basica que no intenta de ningun modo ser definitivo. Se recomienda profundizar en este tema y aprender a montar un firewall mas completo y adecuado a tus propias necesidades, leyendo los muchos manuales disponibles en http://www.netfilter.org.
NOTA: Este manual se basa, con algunas modificaciones y adiciones del autor, en el manual de Beyond Linux From Scratch .
Primero algo de proteccion general:
Habilitar proteccion de eco broadcast
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
Habilitar proteccion de cookie TCP SYN
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
Deshabilitar redireccion ICMP
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
Registrar paquetes con direcciones imposibles
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
Mensajes detallados para los que usan IP dinamicas
echo 2 > /proc/sys/net/ipv4/ip_dynaddr
Configura politicas
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
Vaciamos las reglas
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
Permitimos conexiones desde y hacia localhost
iptables -A INPUT -i lo -j ACCEPT
Permitimos paquetes nuevos input si vienen desde la red interna y si vienen desde el exterior, solo establecidos y relacionados
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ! ppp+ -m state –state NEW -j ACCEPT
Permitimos paquetes nuevos forward si vienen desde la red interna y si vienen desde el exterior, solo establecidos y relacionados
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ! ppp+ -m state –state NEW -j ACCEPT
Registrar los paquetes entrantes invalidos
iptables -I INPUT -p tcp -m state –state INVALID -j LOG –log-prefix “Paquete invalido: “
Dropear los paquetes entrantes invalidos
iptables -I INPUT -p tcp -m state –state INVALID -j DROP
Redirigir los paquetes que no vengan desde el exterior (por ende, que vengan de la red interna) al puerto 80 (HTTP) al puerto 3128 (que es el proxy). De esta manera logramos un proxy transparente.
iptables -t nat -A PREROUTING -i ! ppp+ -p tcp –dport 80 -j REDIRECT –to 3128
Los paquetes entrantes del exterior no deben tener IP privada. Esto es comun en ataques de IP-Spoofing, asi que los rechazamos.
iptables -A INPUT -i ppp+ -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i ppp+ -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i ppp+ -s 192.168.0.0/16 -j DROP
Si usamos cliente DHCP, debemos incluir esta regla.
iptables -A INPUT -i ppp0 -p udp -s 0.0.0.0 –sport 67 -d 255.255.255.255 –dport 68 -j ACCEPT
Habilitamos enmascaramiento para que la red interna salga a internet con nuestra IP publica.
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE
Registramos todo para futuras depuraciones.
iptables -A INPUT -j LOG –log-prefix “Paquete INPUT: “
iptables -A FORWARD -j LOG –log-prefix “Paquete FORWARD: “
iptables -A OUTPUT -j LOG –log-prefix “Paquete OUTPUT: “
Habilitamos IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
NOTA: Hay que notar que la politica OUTPUT esta en ACCEPT, esto es porque se asume que la maquina usada de cortafuegos en la red casera, es usada tambien como PC de escritorio (caso tipico en redes caseras). Si no es asi, se ruega investigar en internet sobre configuraciones con politicas OUTPUT DROP.
Se recomienda, asimismo, no utilizar servicios de cara al exterior en la maquina cortafuegos. Idealmente, esta maquina solo deberia servir de cortafuegos, ubicando los servidores necesarios en otras maquinas de la red interna (si el acceso es solo interno) o en una DMZ (si se requiere acceso desde el exterior).
En el caso de que no se pudiera contar con una maquina para usarla exclusivamente de cortafuegos, se ruega enlazar contra la interfaz interna los servicios que se necesiten correr, para evitar de esta forma el acceso desde el exterior.
Copyright (c) 2005 Martin Castiglia.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found in http://www.gnu.org/copyleft/fdl.html.
