DDoS,  Firewalld,  geoip,  IPTables

Bloqueo de trafico GeoIP con Firewalld IPTables

Hace unos días, uno de nuestros clientes tenia ataques DDoS dirigidos a los servidores Web de la empresa, causando caídas del servicio. Realizando un análisis forense sobre la situación, encontramos que X empresa o persona contrato un servicio de denegación de servicios (DDoS as a service), ya que venia de servidores alojados en AWS, OVH, alibabacloud, y otros Datacenter a nivel mundial. La mayoría de los ataques vienen de países como Francia, Vietnam, China, Russia, entre otros, por lo que se saco un listado de países que se deben bloquear. Hace unos años se realizaba un método de bloqueo GeoIP con Xtables, pero MaxMind movió la URL o bloqueo la base de datos de IPs por país, por lo que fue necesario buscar otras maneras de realizar el bloqueo.

Firewalld es un administrador avanzado de IPTables, viene predeterminado en los sistemas operativos de RHAT, pero tambien se puede instalar y configurar en la familia Debian. Con la ayuda de un paquete llamado IPSET, podemos crear listas de IPs en un archivo y asociarlas en una cadena de IPTables. Vamos a ver como se realiza la configuración de GeoIP en un Centos 7. El único requisito, es que Firewalld este en la versión >= 0.4 y que este instalado IPSET en el sistema operativo, por ejemplo:

# firewall-cmd -V
0.3.75
# yum update firewalld
# yum install ipset
# firewall-cmd -V
0.5.24

Vamos a utilizar las base de datos de IPDENY. Realizamos un bloqueo por ejemplo a al país de China “Siempre se utiliza los códigos ISO-3166-1 ALPHA-2 de dos letras”.

# cd /tmp
# wget http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz
# tar -vxzf all-zones.tar.gz
# firewall-cmd --permanent --new-ipset=blacklist --type=hash:net --option=family=inet --option=hashsize=4096 --option=maxelem=200000
# firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=./cn.zone
# firewall-cmd --permanent --zone=drop --add-source=ipset:blacklist
# firewall-cmd --reload

Vamos a explicar el comando paso a paso:

  • Vamos a la carpeta TMP del SO
  • Descargamos toda la lista negra de IPDENY.
  • Extraemos la lista negra.
  • Creamos una blacklist de IPSEC en modo HASH, el cual va ha contener caracteres de subnet, por ejemplo 1.1.1.1/32.
  • Le agregamos el listado cn.zone a la lista negra.
  • Creamos una Zona llamada Drop y le agregamos la lista negra.
  • Recargamos el Firewalld CMD para que las reglas se vuelvan permanentes.

Para facilitar el proceso, creamos un Script que nos ayuda agregar varios países al mismo tiempo.

 

#!/bin/bash

 

# 20190411

# Luis Cuellar

# c1@assureit.co

 

# Requiere Firewalld >=0.4

# yum install firewalld ipset

# apt install firewalld ipset

 

if [[ “$1” == “-h” ]] || [[ “$1” == “–help” ]] ; then

        echo “Debe ejecutar el comando $0 con los paises ISOS de dos letras:

Lista de codigos: https://laendercode.net/en/2-letter-list.html”

        echo “EJEMPLO: $0 vn cn it fr cl ar”

        exit 0

fi

 

 

FOLDERBLACKLIST=/tmp

 

cd $FOLDERBLACKLIST

wget http://www.ipdeny.com/ipblocks/data/countries/all-zones.tar.gz

tar -vxzf all-zones.tar.gz

 

for var in “$@”

do

firewall-cmd –permanent –new-ipset=$var –type=hash:net –option=family=inet –option=hashsize=4096 –option=maxelem=200000

firewall-cmd –permanent –ipset=$var –add-entries-from-file=$FOLDERBLACKLIST/$var.zone

firewall-cmd –permanent –zone=drop –add-source=ipset:$var

firewall-cmd –reload

done

 

rm $FOLDERBLACKLIST/*.zone

 

exit 0

Agradecimientos:

2 Comments

  • Felipe Pinzón

    Como esto se hizo en Firewalld, lo mejor es volver a un default configuration o factory reset de Firewalld.

    Esto se hace eliminando todas las zonas de /etc/firewalld/zones así:

    $rm -rf /etc/firewalld/zones

    Y luego puedes desinstalar firewalld y volver a instalarlo y de esta forma el te deberia agregar la nueva configuración por defecto.

Deja un comentario

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