Filtrar países con IPTables

Una de las cosas que más nos llama la atención a los administradores de sistemas, especialmente si tenéis acceso a equipos de Firewall es siempre la cantidad de ataques que se están recibiendo. Es cierto que la red no es un lugar cómodo ni pacífico. A los 5 minutos de conectar un equipo a una IP pública, éste ya comienza a recibir ataques. Nos guste o no, tenga lógica o no, la mayoría de los ataques a los equipos provienen de determinados países, llamémosle conflictivos, como puedes ser China, Rusia, etc. Por suerte para nosotros, GNU/Linux tiene un sistema de Firewall modular que permite añadir pequeñas mejoras. Hoy vamos a ver cómo filtrar los paquetes de determinados países gracias a xtables_addons.
xtables_addons es un sistema modular para el kernel que permite añadir funcionalidades sin parchear éste, gracias a la creación de módulos dinámicos (dkms), lo que evita tener que compilar y reiniciar el sistema. En determinadas distribuciones (Ubuntu y derivados) está disponible ya para instalación, mientras que en otras hay que compilarlos desde las fuentes. Puesto que el funcionamiento una vez instalado es el mismo, vamos a partir de una Ubuntu desde la que podamos simplificar la instalación.
shell> apt-get install xtables-addons-dkms
La instalación de este paquete llevará un poco de tiempo, puesto que crea los módulos para la versión del kernel que tengamos instalada. Gracias a dkms, si se actualiza el kernel, los módulos se volverán a reconstruir automáticamente. Una vez instalado xtables_addons, debemos instalar el paquete que simplifica la forma de procesar los paquetes de rangos de IPs de los países. Para ello,
shell> apt-get install libtext-csv-xs-perl
Ahora ya estamos listos para comenzar a trabajar y filtrar las conexiones entrantes o salientes de IPTables a determinados países. Lo primero será descargar las bases de datos de rangos IP de cada país. Para ello,
shell> cd /tmp
shell> /usr/lib/xtables-addons/xt_geoip_dl
Esto nos descargará dos ficheros, GeoIPv6.csv.gz y GeoIPCountryCSV.zip, que los procesará y dejará en el directorio actual un fichero más llamado GeoIPCountryWhois.csv, que es el que realmente nos va a interesar. Ahora tenemos que procesar este fichero .cvs para darle el formato adecuado y que xtables_addons e IPTables lo entiendan. Para hacer esto,
shell> mkdir -p /usr/share/xt_geoip/
shell> /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip/ \
       GeoIPCountryWhois.csv
91027 entries total
    0 IPv6 ranges for A1 Anonymous Proxy
  102 IPv4 ranges for A1 Anonymous Proxy
    0 IPv6 ranges for A2 Satellite Provider
  425 IPv4 ranges for A2 Satellite Provider
    0 IPv6 ranges for AD Andorra
    8 IPv4 ranges for AD Andorra
    0 IPv6 ranges for AE United Arab Emirates
      ...
  485 IPv4 ranges for ZA South Africa
    0 IPv6 ranges for ZM Zambia
   43 IPv4 ranges for ZM Zambia
    0 IPv6 ranges for ZW Zimbabwe
   47 IPv4 ranges for ZW Zimbabwe
Llegados a este punto ya estamos listos para emplear el filtrado por países en IPTables. Lo único que debemos de hacer es emplear "-m geoip" y "--src-cc XX", siendo XX el código ISO del país (código ISO en Wikipedia).
Por ejemplo, para bloquear las conexiones entrantes desde IPs del rango de China (ISO CN), tendríamos que hacer algo como,
shell> iptables -A INPUT -m geoip --src-cc CN -j DROP
También se puede emplear este truco de geoip con las opciones habituales de IPTables,
shell> iptables -A INPUT \
       -p tcp -m tcp -m multiport --dports 80,443 \
       -m geoip --src-cc CN \
       -j DROP
Tras ello, podemos ver cómo quedaría nuestro Firewall configurado,
shell> iptables -L -n -v
Chain INPUT (policy ACCEPT 1644 packets, 2796K bytes)
pkts B target prot opt in out source    destination         
0    0 DROP   all  --  *  *   0.0.0.0/0 0.0.0.0/0 -m geoip --source-country CN
0    0 DROP   tcp  --  *  *   0.0.0.0/0 0.0.0.0/0 tcp multiport dports 80,443 -m ...

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

Chain OUTPUT (policy ACCEPT 1423 packets, 221K bytes)
pkts B target prot opt in out source destination



2 comentarios :

  1. Hola, casi listo, pero al final, cuando utilicé el comando:

    iptables -A INPUT -m geoip --src-cc CN -j DROP


    me regresó este mensaje:

    iptables: No chain/target/match by that name.

    ResponderEliminar
  2. A my me paso igual me tira ese mismo error
    iptables: No chain/target/match by that name.

    ResponderEliminar

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios