sábado, 28 de marzo de 2009

Inicio automático de IPTables

Siempre me ha llamado la atención las enormes posibilidades que ofrece Linux, pero la configuración se complica a la par que crecen sus capacidades.

Hace unos tres años, alguien me introdujo en el maravilloso mundo de iptables, y en mis primeros pinitos, como no, lo primero que hice fue bloquear mi equipo totalmente. Más adelante me presentaron una herramienta imprescindible para todo buen administrador de sistemas Linux, Firewall Builder (http://www.fwbuilder.org/), que me ha permitido, siempre con ayuda, crear cortafuegos realmente interesantes.

Sin embargo, hay algo que falta en todos los sistemas linux que conozco. Una vez instalados los paquetes "iptables" e "ipchain", necesitamos algún procedimiento que nos permita tanto cambiar la configuración de nuestro firewall como que nuestro cortafuegos se inicie a la par que nuestro sistema.

Aunque solo son unas sencillas pinceladas, seguro que para más de uno (yo mismo incluido), resultan más que útiles.

Los organizaré en pasos:

  1. Suponemos que nuestra máquina se llama "destellos". Decidimos donde vamos a situar nuestros ficheros. Trabajaremos con dos, uno "destellos.fw" que almacenará las reglas y actuales y otro, "inactive" que nos permitirá desactivar el firewall.

    Guardaremos ambos ficheros en la ruta "/etc/local/iptables", configurando adecuadamente FWBuilder para que use dicha ruta al enviarnos el fichero de reglas.

  2. Tenemos que crear un nuevo fichero que nos permite arrancar y parar nuestro firewall a voluntad. Lo almacenaremos en "/etc/init.d", con el nombre de "iptables". El contenido será el siguiente (haciendo las modificaciones adecuadas):
    #!/bin/sh

    ruta="/etc/local/iptables"
    maquina="`uname -n`"

    case "$1" in
    start)

    # Arranca el iptables
    sh ${ruta}/${maquina}.fw
    echo " "
    echo " Iptables ACTIVADO "
    echo " "
    ;;

    stop)
    # Borramos todas las reglas:
    iptables-restore < ${ruta}/inactive
    echo " iptables DESACTIVADO "
    ;;

    save)
    iptables-save > ${ruta}/$2
    echo " Configuracion guardada en ${ruta}/$2 "
    ;;

    restart)
    iptables-restore < ${ruta}/inactive
    echo ""
    echo " iptables DESACTIVADO "
    sh ${ruta}/${maquina}.fw
    echo " Iptables ACTIVADO "
    ;;

    *)
    echo "Usage: /etc/init.d/iptables {start|stop|save NombreFichero}"
    exit 1
    ;;
    esac

    exit 0

    Este fichero tendrá que tener los permisos adecuados (-rwxr-xr-x), mediante el comando siguiente:
    chmod 755 /etc/init.d/iptables

    Ahora, mediante los comandos "start", "stop", "restart" y "save" podremos utilizar con mayor facilidad nuestro cortafuegos.

  3. Pero aun no queda algo que hacer, ya que por el momento, nuestro cortafuegos no se inicia de forma automática. Para ello, lo primero que necesitamos conocer es el nivel en el que se encuentra nuestro sistema en reposo (generalmente, será el 2). Ejecutamos lo siguiente:
    runlevel

  4. Nos dirigimos a la ruta adecuada. En caso general, iremos a "/etc/rc2.d", donde crearemos el enlace simbólico adecualdo.

    Primero, deberíamos hacer un listado "ls" de lo que contiene el directorio para ver la posición más adecuada de inicio (queda determinada por el orden ascendente de los ficheros). La verdad es que no conozco realmente la razón (la preguntaré), pero en mi trabajo siempre lo hemos colocado en las máquinas debian y ubuntu en la posición 12.

    En este caso, IPTables debería arrancar, así que nuestro enlace debería tener un nombre de tipo "S12iptables", apuntando al script que creamos antes en "/etc/init.d". En otras palabras:
    ln -s /etc/init.d/iptables S12iptables
    Como es un enlace, al hacer un "ls -la" obtendremos algo como esto:
    lrwxrwxrwx 1 root root 20 2008-02-07 16:47 S12iptables -> /etc/init.d/iptables
  5. El sieguiente paso será parar el servicio al apagar. Para eso, nos iremos al directorio "/etc/rc1.d" y, siguiendo la misma idea, haremos un enlace simbólico a "/etc/init.d" con un nombre parecido a "K12iptables":
    ln -s /etc/init.d/iptables K12iptables

Eso es todo... por el momento.