Bloquea el acceso de diferentes países a tu servidor usando iptables

Escrito por Sergio De Luz
GNU Linux

Cuando disponemos de un servidor, normalmente un servidor web con dominio, en muchas ocasiones somos víctimas de ataques de fuerza bruta contra el servidor SSH para intentar obtener acceso root. En otros casos sufrimos ataques de denegación de servicio contra el propio servidor web. Todos los ataques tienen un factor en común, la mayoría de ellos provienen de países como China, Rusia e incluso de EEUU. Hoy os vamos a enseñar cómo bloquear el acceso de diferentes países a nuestro servidor.

En esta página web podéis encontrar detalladamente todos los bloques de direcciones IPv4 que pertenecen a cada país, de esta forma podremos obtener todos los rangos de direcciones IP en formato CIDR de por ejemplo China, para posteriormente banearlo con el cortafuegos iptables de Linux o ipf de BSD. En este otro enlace tenemos disponibles los bloques de direcciones IPv6 de cada país, igual que el anterior para IPv4 también se actualiza con mucha frecuencia. Esta página web se va actualizando a medida que los bloques de direcciones IPv4 y IPv6 cambian o se incorporan más, como se puede observar la última actualización es del 20 de Abril de este año.

Como introducir cada bloque de direcciones IP nos llevaría mucho tiempo, nixCraft de www.cyberciti.biz ha creado un sencillo script para actualizar la base de datos local en nuestro equipo y para posteriormente aplicar las reglas a nuestro cortafuegos con iptables. Aquí podéis ver el script traducido al castellano para explicar qué hace.

#!/bin/bash
# El objetivo de este script es bloquear todo el tráfico de AFGHANISTAN (af) y CHINA (CN). Se puede usar la variable ISO para fijar qué países queremos bloquear.
# See url for more info - http://www.cyberciti.biz/faq/?p=3402
# Author: nixCraft <www.cyberciti.biz> under GPL v.2.0+
# -------------------------------------------------------------------------------
ISO="af cn"
 
### Variables para facilitar el uso del script que apuntan a iptables (cortafuegos), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que iptables no pueda interpretar ###
IPT=/sbin/iptables
WGET=/usr/bin/wget
EGREP=/bin/egrep
 
#Nueva tabla en iptables sobre el baneo por región
SPAMLIST="countrydrop"
#Ubicacion donde se guarda la base de datos de
ZONEROOT="/root/iptables"
#URL de la base de datos de paises
DLROOT="http://www.ipdeny.com/ipblocks/data/countries"
 
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.

cleanOldRules(){
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
}
 
#Creamos el directorio para almacenar la base de datos
[ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT
 
#Ejecutamos la funcion
cleanOldRules
 
#Creamos la nueva tabla de iptables con el nombre de la variable SPAMLIST
$IPT -N $SPAMLIST
 
for c  in $ISO
do
    # Base de datos local
    tDB=$ZONEROOT/$c.zone
 
    # Descargamos y actualizamos la base de datos
    $WGET -O $tDB $DLROOT/$c.zone
 
    # Mensaje del pais baneado que aparecerá en el log de iptables
    SPAMDROPMSG="$c Country Drop"
 
    # Filtramos la base de datos para que iptables interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
    BADIPS=$(egrep -v "^#|^$" $tDB)
    for ipblock in $BADIPS
    do
       $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
       $IPT -A $SPAMLIST -s $ipblock -j DROP
    done
done
 
# Drop todo
$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST
 
exit 0

Este script podemos programarlo con cron para que se ejecute una vez semanalmente y de esta forma podamos actualizar la base de datos de direcciones IP de esos países. Debemos advertir que China tiene un gran número de bloques de direcciones IP por lo que tardará varios minutos en aplicar todas las reglas al cortafuegos, si probamos con solo “af” es casi instantáneo.

Gracias a este script, si nuestro servicio a través de Internet sólo trabaja en España, podemos banear todos los demás países, pero debemos tener en cuenta que si un usuario de España usa un proxy o VPN de otro país, no le dejaremos acceso.

Os recomendamos acceder a www.cyberciti.biz donde encontraréis otros scripts como por ejemplo en Perl que hace esta misma función.

Fuente > Cibercity


Continúa leyendo
  • el-brujo

    Mejor usar ipset para bloquear rangos de países.

  • Pingback: Bloqueando el acceso a tu servidor desde otros paises con iptables | NOTASDESAD()

  • Luciano

    Te hago una consulta , se podría hacer lo mismo pero utilizando los puertos TCP ? Necesitaría hacer una escalonada por ejemplo 1 >2>3 , por así decirlo si no entra al 1 que no entre al 2 y por lo pronto no al 3.

    Gracias de ante mano.

    • Sí, modificas la regla para que en lugar de filtrar solo origen, filtres puertos tcp:

      -p tcp –dport o –sport y listo

  • yo

    en que parte de UBUNTU 14 coloco ese scritp como se llama el archivo a modificar la ruta donde esta el archivo.. gracias

    • Pues puedes colocarlo en el rc para que se ejecute al inicio, o simplemente ejecutarlo una vez y en el crontab ponerlo para que cada semana se ejecute

Últimos análisis

Valoración RZ
9
Valoración RZ
9
Valoración RZ
10
Valoración RZ
9
Valoración RZ
10
Valoración RZ
7
Valoración RZ
9
Valoración RZ
10
Valoración RZ
8
Valoración RZ
10