Asignar reglas dinamicas en firewall IPTABLES con un DNS Dinamico

iptables-dinamico

Si eres un administrador de sistemas debes de estar consiente que llevar a cabo buenas practicas es fundamental para que nuestros sistemas funcionen de la mejor manera, una de esas buenas practicas es la cuestión de la seguridad y yo personalmente me tomo esa parte muy enserio, ya que el hacer o no hacer bien las cosas puede salvarnos de perder literalmente todo…

Yo particularmente protejo el acceso a los servidores que no son públicos a que sean accesibles desde una sola IP, esto lo hago por medio del firewall que viene de facto en la mayoría de las distribuciones GNU / Linux : Iptables. Pero, ¿Qué ocurre cuando tenemos una IP Dinámica que cambia cada determinado tiempo?
Esto como bien sabrán es así en la mayoría de las conexiones domésticas, ya que en las empresas y grandes corporativos en general es menos problemático contratar una IP dedicada por una renta mensual, pero como yo soy un usuario doméstico no le veo razón de ser en contratar una IP dedicada cuando para lo único que la ocuparía es para acceder a mis servidores por SSH y gestionar algún otro sistema. Por lo cual me di a la tarea de buscar la forma de poder actualizar las reglas de Iptables de manera dinámica de tal manera que cuando cambiara mi IP en automático se actualizara la respectiva regla en Iptables.

Otro aspecto a considerar es que ya sea en su modem, en su servidor o en su PC tengan instalado y configurado el cliente de DNS Dinámico para que cada vez que cambie la Ip este se actualice con la nueva IP, con respecto a este tema no me gustaría alargarme ya que no es tema de este post, tan solo me limitare a decir que puedes elegir al proveedor de tu elección: dyndns.org o no-ip.com , a mí personalmente me resulta más cómodo trabajar con DynDNS por lo que empleare un dominio del tipo dominio.dyndns.org

Regresando al tema de la actualización de manera dinámica de las reglas de Iptables, me di a la tarea de navegar por la inmensidad de internet y encontré que a alguien más ya le había surgido la necesidad y lo soluciono por medio de un Script en BASH que muy amablemente compartió con toda la comunidad. Yo lo adapte a mis necesidades y a continuación procedo a describir cómo es que lo hice funcionar.

El script para actualización dinámica de Iptables es el siguiente:


#!/bin/bash
# filename: firewall-dynhosts.sh
#
# A script to update iptable records for dynamic dns hosts.
# Written by: Dave Horner (http://dave.thehorners.com)
# Released into public domain.
#
# Run this script in your cron table to update ips.
#
# You might want to put all your dynamic hosts in a sep. chain.
# That way you can easily see what dynamic hosts are trusted.
#
# create the chain in iptables.
# /sbin/iptables -N dynamichosts
# insert the chain into the input chain @ the head of the list.
# /sbin/iptables -I INPUT 1 -j dynamichosts
# flush all the rules in the chain
# /sbin/iptables -F dynamichosts

HOST=$1
HOSTFILE=”/root/dynhosts/host-$HOST”
CHAIN=”dynamichosts” # change this to whatever chain you want.
IPTABLES=”/sbin/iptables”

# check to make sure we have enough args passed.
if [ “${#@}” -ne “1” ]; then
echo “$0 hostname”
echo “You must supply a hostname to update in iptables.”
exit
fi

# lookup host name from dns tables
IP=`/usr/bin/dig +short $HOST | /usr/bin/tail -n 1`
if [ “${#IP}” = “0” ]; then
echo “Couldn’t lookup hostname for $HOST, failed.”
exit
fi

OLDIP=””
if [ -a $HOSTFILE ]; then
OLDIP=`cat $HOSTFILE`
# echo “CAT returned: $?”
fi

# has address changed?
if [ “$OLDIP” == “$IP” ]; then
echo “Old and new IP addresses match.”
exit
fi

# save off new ip.
echo $IP>$HOSTFILE

echo “Updating $HOST in iptables.”
if [ “${#OLDIP}” != “0” ]; then
echo “Removing old rule ($OLDIP)”
`$IPTABLES -D $CHAIN -s $OLDIP/32 -j ACCEPT`
fi
echo “Inserting new rule ($IP)”
`$IPTABLES -A $CHAIN -s $IP/32 -j ACCEPT`

Ahora la forma de hacerlo funcionar es relativamente fácil (si sabes lo que está haciendo). Pero primero que nada deberás de copiar y pegar ese script en un archivo y guardarlo con extensión .sh Después deberás darle permisos de ejecución por medio del comando:

chmod + x nombrescript.sh

Y con eso ya estaremos casi listos, también en la carpeta raíz donde se encuentre alojado el script deberemos crear una carpeta de nombre: “dynhosts” y dentro de ella crearemos un archivo de configuración, este archivo deberá llamarse con el nombre de nuestro DNS dinámico. En este ejemplo para el dominio: midominio.dyndns.org deberemos crear el archivo de configuración de la siguiente manera:

touch host-midominio.dyndns.org

Este comando nos creara un archivo vacío y es en ese archivo donde se guardaran las viejas direcciones IP de nuestro DNS dinámico. Ahora bien si mi memoria no me falla lo corrí en una maquina con Debian pero el Script no me funciono, ya que resulta que ocupa el comando dig para hacer la consulta DNS, y mi todopoderoso debían no lo tenía instalado, pero no se alarmen nada que no se pudiera solucionar haciendo un:

apt-get install dnsutils

Ahora bien, existe un tema a tratar en el script y es que el script recomienda que tú crees tu propia chain y esa misma la ingreses a Iptables en INPUT, en este caso para mí por practicidad, lo que hice fue ingresarlo directamente en la chain de INPUT, por lo cual se tendrá que modificar la siguiente línea:

CHAIN=”dynamichosts” # change this to whatever chain you want.

Por un

CHAIN=”INPUT”

Pero esto ya es a gusto de cada quien o de cómo es que tengan configuradas sus reglas de Iptables. Una vez realizado esto ya tendríamos todos los elementos para probar nuestro script, tan fácil como correrlo de la siguiente manera:

/root/firewall-dynhosts.sh midominio.dyndns.org

Y nos indicara que las reglas de Iptables fueron actualizadas con éxito, después de ahí solo nos restara probar que realmente se ingresó la regla en Iptables con el siguiente comando:

iptables –nL

Lo restante sería tan solo ingresar nuestro comando a que se ejecute al menos cada 5 minutos (a mí me gusta así) por medio del demonio cron, en este caso lo podemos editar el crontab con el comando:

crontab –e

y ahí a manera de ejemplo ingresaríamos lo siguiente:

*/5 * * * * /root/firewall-dynhosts.sh midmonio.dyndns.org

Esto ejecutara el script cada 5 minutos, por lo cual tendremos solucionado de esta manera la actualización de manera automática y dinámica las reglas de iptables. Y si nos ponemos guapos podemos hacer que nuestro servidor solo reciba conexiones desde ahí, cerrando todo y asegurando al máximo nuestro servidor. 🙂