De sobra es conocida por todos la necesidad de disponer de un buen firewall para proteger nuestra red. No pretendo hacer un complejo manual de conexiones TCP/IP o configuración avanzada de iptables, sino que voy a poner como ejemplo un script de iptables que hice hace algún tiempo y lo voy a explicar un poco para que más o menos todo el que lea este post sea capaz de construirse su propio script de iptables en poco tiempo.

La idea general es que iptables es un sistema de filtrado de conexiones en el que nosotros podemos establecer distintas reglas, si una conexión encaja con el patrón que se ha establecido, se toma la medida indicada. Veamos esto con un ejemplo:

#!/bin/bash
#borrar todas las reglas  de todas las cadenas y reiniciar los contadores de estadísticas
iptables -F
iptables -X
iptables -Z
#Con -P se establece la política por defecto en las distintas cadenas
#la politica por defecto siempre es rechazar menos en OUTPUT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
#Con la siguiente regla permito las conexiones que ya han sido realizadas
# -A INPUT quiere decir que esta regla se concatena a la cadena INPUT
# -p ALL quiere decir que se aplica a todos los protocolos
# -i eth0 es para el interfaz de red
# -m state –state se utiliza para que haga matching con el estado de la conexión
# -j ACCEPT indica que las conexiones que cumplan la regla anterior serán aceptadas
iptables -A INPUT -p ALL -i eth0 -m state –state RELATED,ESTABLISHED -j ACCEPT
#Abro los puertos que necesito para los servicios que están corriendo en este equipo
#   que son HTTP, SSH y FTP
iptables -A INPUT -p tcp -i eth0 -m multiport –dports 20,21,22,80 -j ACCEPT
#Con la siguiente regla permito el trafico en loopback
iptables -A INPUT -i lo -j ACCEPT

Con este sencillo script, todos los puertos de vuestro ordenador aparecerán como cerrados ante un escaneo de puertos y solo se permitirán las conexiones a los puertos 20, 21, 22 y 80. La potencia de iptables es enorme, se pueden establecer reglas para redirección de puertos, establecer zonas desmilitarizadas, filtrar conexiones dependiendo de la dirección MAC o IP de origen o destino, hacer que determinados paquetes sean logueados en un fichero para su posterior análisis…

Para ejecutar el script anterior tan solo hay que copiarlo en un archivo de texto, por ejemplo, iptables.sh, darle permisos de ejecución mediante el comando chmod +x iptables.sh y ejecutarlo desde una shell con permisos de root.

Para comprobar que está funcionando se puede ejecutar el siguiente comando:

root@server:~# iptables -v -L
Chain INPUT (policy DROP 177K packets, 15M bytes)
pkts bytes target     prot opt in     out     source               destination
5580K 2411M ACCEPT     all  —  eth0   any     anywhere             anywhere            state RELATED,ESTABLISHED
15897  943K ACCEPT     tcp  —  eth0   any     anywhere             anywhere            multiport dports ftp-data,ftp,ssh,www
334M  211G ACCEPT     all  —  lo     any     anywhere             anywhere

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 338M packets, 216G bytes)
pkts bytes target     prot opt in     out     source               destination

Utilizando el modificador ‘-L’ se listan todas las reglas que están definidas. Si además se utiliza el modificador ‘-v’ o verbose, se puede ver la cantidad de tráfico que es capturado por cada regla.

Solo falta por hacer una cosa. Hacer que el script que acabamos de crear se ejecute automáticamente cada vez que se inicia el sistema operativo. Para ello habrá que utilizar el comando update-rc.d o crear un link simbólico como muestro a continuación:

root@server:~# ln -s /etc/init.d/iptables.sh /etc/rc2.d/S99iptables_alberto

¿Algunas recomendaciones extras?

  • Probar siempre de forma intensiva cada una de las reglas que estamos definiendo. Es incluso recomendable que otra persona realice las pruebas para comprobar que no nos hemos dejado ningún hueco abierto. Como siempre, nmap será la herramienta preferida…
  • Como siempre, mantener el software actualizado para estar al día de las actualizaciones de seguridad.
  • Buscar en Internet ejemplos de scripts, hay miles de ejemplos y muchos de ellos están muy bien documentados. No hay que currarse desde cero una DMZ o un sistema de nat, estos scripts ya están por ahí. Sólo hay que entenderlos y adaptarlos a nuestras necesidades (ya sabéis, la filosofía del Open Source).
  • Revisar las estadísticas que genera iptables para ver si alguna regla tiene un tráfico anómalo. También puede ser una buena política utilizar las opciones de registro de iptables para estudiar las conexiones extrañas más despacio.

Espero que os haya gustado este post. Un saludo