Firewall en Linux (Ipfwadm, Ipchains… Iptables)

En muchas distribuciones (p.e. en Ubuntu) no vienen ningún firewall configurado y activado por defecto si no lo establecemos expresamente. Hasta Windows XP ya traía uno y aconsultaba al usuario y aconsejaba activarlo…

En linux tenémos un firewall (cortafuegos) que es una verdadera maravilla, podemos hacer de todo hoy día y no tiene nada que envidiar al más robusto sistema de protección y bloqueo de tráfico que haya en el mercado. Pero empecemos por el principio…

En un primer inicio, bajo el kernel 2.0 se utilizó un sistema rudimentario pero muy potente que era Ipfwadm. Este tenía 3 directivas básicas (INPUT, OUTPUT y FORWARD) para controlar el tráfico de entrada, salida y el “reenvío”. Potente, sencillo aunque con una sintáxis algo complicada para realiar tareas más avanzadas.

La segunda generación la tenemos en el núcleo 2.2 con Ipchains. Este trae un nuevo concepto, el de las “cadenas de reglas”, o lo que es igual, permite las pilas de reglas creadas por el usuario, o sea, podemos hacer una “cadena” de reglas que se llame WEB y que controle todo el tráfico que sea de este tipo.

Además de esto trajo consigo la numeración de reglas por lo que era posible insertar nuevas reglas a las ya existentes, no solo añadirlas.

Junto con la capacidad de filtrar cualquier protocolo (no solo TCP, UDP e ICMP) y la capacidad de usar la “negación” en las reglas le aventajaba en mucho a su antecesor.

Pero vino por fín con la versión 2.4 del kernel de linux (comenzó en realidad en la rama 2.3) Iptables. Una nueva implementación para dotar a los sistemas con kernel linux de un verdadero y potente sistema de firewall con posibilidad de bloquear y denegar tráfico, devolver tráfico de una conexión existente, realizar traslaciones de direcciones, enrutar, y dos aspectos muy importantes, implementar un sistema SPI o Stateful Packet Inspection (Inspección de Paquetes de Estado) y de QoS (Quality of Service) o Calidad del Servicio.

En el caso del SPI ahora es posible asociar el tráfico devuelto generado a partir de una regla input anterior, en Ipchains hacían falta 6 reglas para enrutar entre dos interfaces.

Además al llevar una “inteligencia” en la gestión de los paquetes mediante este SPI tiene una ventaja adicional, es que mantiene el control de sesiones de tráfico, de forma que aunque un atacante pueda fabricar paquetes que simulen paquetes de un protocolo determinado como devueltos, (Ipchains podía permitir dicho tráfico) como no existe una sesión para dichos paquetes se rechazarán.

Como únicamente la cadena FORWARD controla cualquier paquete para ser reenviado, INPUT y OUTPUT solo se aplican para entrar o salir del host, se reduce mucho el número de reglas a incluir en nuestro sistema.

La instalación de Iptables requiere la compilación del kernel si no están configuradas, pero hoy día están dentro de todos los kernels por defecto de las distribuciones así que no hay que preocuparse. Además cada distribución realiza una gestión de las reglas a su manera, pe. es de considerar la de CentOS (evidentemente también Fedora y RedHat) que se implementan de forma sencilla pero efectiva.

Como Ubuntu no trae esta bonita configuración (la de CentOS) hay que ponerse manos a la obra, lo mejor es ponerla en el rc.local si no somos muy paranóicos o crearnos un sistema de arranque/parado dentro de /etc/init.d dentro de los niveles de arranque que necesitemos y (si no usamos referencias a hosts sino solo a IPs) hacer que arranque antes de que lo hagan las interfaces de red. El primer sistema está bien para portátiles y ordenadores de escritorio pero para servidores es más que recomendable la segunda opción.

Se pueden realizar multitud de configuraciones y espero ir poniendo aquí algunas complejas que controlen no solo tráfico o enrutamiento, sino también “Throughput”, “Reliability”, etc. dentro de un sistema basado en QoS.

Por lo pronto yo uso dos en mi portátil, una para utilizarla como sistema básico de cortafuegos, hay que tener en cuenta que uso dos interfaces (bueno tres como veréis más abajo) que son la ethernet cableada y la wifi. Como soy quisquilloso con eso, activo una u otra y dejo pasar tráfico a mi sistema de una u otro como yo quiera. Además de esto utilizo los flags largos y no los cortos porque así (consejo de un amigo) se aprende uno mejor la sintáxis de los comandos. Este es por tanto mi fichero firewall_on.sh

#!/bin/sh
#
# Firewall sencillo
# fegor
#
# eth0 -> Ethernet cableada
# eth1 -> Ethernet inalámbrica
#
# Evitar ecos de ICMP, ataques SYN floods y otras medidas
# de protección
#
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
#
# Limpieza
#
iptables –delete-chain
iptables –flush
iptables –table nat –flush
#
# Permitir tráfico loopback
#
iptables –append INPUT –in-interface lo –jump ACCEPT
iptables –append OUTPUT –out-interface lo –jump ACCEPT
#
# Políticas por defecto
#
iptables –policy INPUT DROP
iptables –policy OUTPUT DROP
iptables –policy FORWARD DROP
#
# Permitir tráfico establecido de entrada e
# ilimitado de salida
#
iptables –append INPUT –match state –state ESTABLISHED,RELATED –jump ACCEPT
iptables –append OUTPUT –match state –state NEW,ESTABLISHED,RELATED –jump ACCEPT
#
# Permitir entradas selectivas (ssh, http, etc.)
#
iptables –append INPUT –in-interface eth0 –protocol tcp –syn –match state –state NEW –source 0/0 –destination 0/0 –destination-port 22 –jump ACCEPT
iptables –append INPUT –in-interface eth1 –protocol tcp –syn –match state –state NEW –source 0/0 –destination 0/0 –destination-port 22 –jump ACCEPT
# Permitir entradas EMule/AMule
iptables –append INPUT –in-interface eth0 –protocol tcp –syn –match state –state NEW –source 0/0 –destination 0/0 –destination-port 4662 –jump ACCEPT
iptables –append INPUT –in-interface eth0 –protocol udp –source 0/0 –destination 0/0 –destination-port 4672 –jump ACCEPT
#
# Rechazar finalmente el tráfico restante
#
iptables –append INPUT –jump DROP

Otro script qu utilizo es para enrutar mi USB Modem 3G y hacer que cualquier otro ordenador salga a través de mi portátil. Para ello hay que activar el enrutamiento y hacer el FORWARD pertinente. Este es mi router_on.sh

#!/bin/sh
#
# Enrutar tráfico de los demás a internet
# fegor
#
# eth0 -> Ethernet cableada
# eth1 -> Ethernet inalámbrica
# ppp0 -> Modem USB 3G
#
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables –flush
iptables –table nat –flush
iptables –table nat –append POSTROUTING –out-interface ppp0 -j MASQUERADE
iptables –append FORWARD –in-interface eth0 -j ACCEPT
iptables –append FORWARD –in-interface eth1 -j ACCEPT

Y eso es todo, no pretende ser un manual de Iptables, ni guia, ni tutorial, ni nada más que lo que habéis leído. Para saber más:

Enlaces:

http://www.netfilter.org/
http://es.wikipedia.org/wiki/Iptables
http://www.linuca.org/body.phtml?nIdNoticia=99
http://www.bulma.net/body.phtml?nIdNoticia=1522

Bibliografía:

Firewalls (Manual de referencia)
Keith E. Strasberg, Richard J. Gondek y Gary Rollie
Edit. Mc Graw Hill

Información dentro de la propia distribución linux que tengáis:

man iptables
iptables –help

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *