2008-07-06

Firewall basico

Pues como instale una serie de cosas en mi PC para acceder desde afuera tenia que protegerlo de mis queridos colegas, uno nunca sabe quien se pone a jugar y ve lo que no debe, por esto decidi configurar un FW de estado con iptables para mi PC, si se que suena horriblemente técnico pero es mas fácil de lo que creen.

Lo primero que debemos hacer para facilitarnos las cosas es crear un script donde tendrás todas tus reglas y así simplemente lo colocas al arranque para que este se cargue automáticamente cuando prendas el PC. Lo primero en todo script es declarar unas variables y pues en este no es la excepción.

LOOPBACK="lo"
ETH_INTERFACE="eth0"
IP_ADDR="`/sbin/ifconfig $ETH_INTERFACE | grep 'inet dirección' | awk -F : '{print $2}' | awk '{print $1}'"
LOOP_IP_ADDR="127.0.0.1"
NET="192.168.1.0/24"
BCAST_ADDRESS="`/sbin/ifconfig $ETH_INTERFACE | grep 'inet dirección' | awk -F : '{print $3}' | awk '{print $1}'"
ANYWHERE="0/0"
LOOPBACK="127.0.0.0/8"
TABLES="/sbin/iptables"

Ya con estos datos es empezar por dar los permisos que necesitas para enrutamientos y para funcionamiento del iptables debo también cargar los modulos, esto se realiza con los siguientes comandos

/sbin/modprobe iptable_nat
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
echo "1" > /proc/sys/net/ipv4/ip_forward

Bueno ya con esto creo las políticas del sistema de corta fuegos, para nuestro caso van a ser permitida de salida (output) y negadas de entrada (input) y atravesamiento (forward) (perdón la expresión pero es la traducción mas entendible que encontre), bueno esto se logra con 3 simples lineas, así:

$TABLES -P INPUT DROP #entrada bloqueada
$TABLES -P OUTPUT ACCEPT #Salida permitida
$TABLES -P FORWARD DROP #"atravesamiento" bloqueado

Bueno teniendo definido esto, y como el iptables es un firewall de estado, es necesario indicarle al sistema que estado de conexión vas a permitir, acuerdate que hay 3, que son nuevo (new), establecido (established) y relacionado (related), con esto creamos las reglas de conexión y estado de las mismas de la siguiente forma:

Las de entrada

$TABLES -N allowed
$TABLES -A allowed -p TCP --syn -j ACCEPT
$TABLES -A allowed -p TCP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$TABLES -A allowed -p TCP -m limit --limit 1/s --limit-burst 10 -j LOG --log-level 7 --log-prefix "INPUT packet died: "
$TABLES -A INPUT -m limit --limit 1/s --limit-burst 5 -j LOG --log-level 7 --log-prefix "IPT INPUT packet died: "

Las de Salida

$TABLES -A OUTPUT -m limit --limit 1/s --limit-burst 5 -j LOG --log-level 7 --log-prefix "IPT OUTPUT packet died: "

Bueno ya se que es enredado pero hay lo que hicimos es permitir las conexiones de entrada y darles a ambas un limite de tiempo, para evitarnos lios de intrusos pegados. Ahora las politicas especificas de tráfico, obviamente este ejemplo es un caso especifico pero he intentado que existan la mayoria de ejemplos, para que les sirvan en la casa, aunque soy consiente que muchos les van a sobrar.

#Bloqueo el ICMP para que desde Internet no sepan que estoy vivo o muerto nunca por medio de ping, pero permito los tipo 3,5 y 11, para establecer relaciones con mis vecinos
$TABLES -A INPUT -p ICMP -s $ANYWHERE --icmp-type 0 -j ACCEPT
$TABLES -A INPUT -p ICMP -s $ANYWHERE --icmp-type 3 -j ACCEPT
$TABLES -A INPUT -p ICMP -s $ANYWHERE --icmp-type 5 -j ACCEPT
$TABLES -A INPUT -p ICMP -s $ANYWHERE --icmp-type 11 -j ACCEPT
#Permito los datos de DNS
$TABLES -A INPUT -p UDP -s $IP_ADDR --destination-port 53 -j ACCEPT
#Reglas especifias de tráfico, acuerdence que son secuenciales así que toca desde la especifica hasta la general, esto es fundamental para el correcto funcinamiento
#Permito tráfico ara P2P de deluge
$TABLES -A INPUT -p TCP -s $ANYWHERE -d $IP_ADDR --dport 6881:6889 -j ACCEPT
#Permito acceso a FTP de la maquina
$TABLES -A INPUT -p ALL -s $ANYWHERE -d $IP_ADDR --dport 21 -j ACCEPT
$TABLES -A INPUT -p ALL -s $ANYWHERE -d $IP_ADDR --dport 20 -j ACCEPT
#Permiso de SSH
$TABLES -A INPUT -m mac --mac-source 00:60:67:78:5D:C5 -d $IP_ADDR -p tcp --dport 22 -j ACCEPT

Bueno este es realmente muy basico, creanme con esto podemos hacer maravillas en redes muy uperiores a las que se logran con cualquier PIX o Checkpoint, pero como mi intensión, mostrar como lo hago en mi PC y hacerlo claro para la gente no me puse a colocar 50 mil cosas super enredadas, existen en la red varios libros gratis que les recomiendo si les interesa este tema, como Designing And Implementing Linux Firewalls And QoS o Firewalls Linux Guía Avanzada, en ingles y españos respectivamente.