xtables-addons: filtrando paquetes por países

xtables-addons: filtrando paquetes por países
La tarea de bloquear el tráfico de ciertos países puede parecer sencilla, pero la primera impresión es engañosa. Hoy explicaremos cómo se puede realizar esto.

Antecedentes

Los resultados de búsqueda en Google sobre este tema son desalentadores: la mayoría de las soluciones están obsoletas y a veces parece que este tema se ha dejado de lado y se ha olvidado para siempre. Hemos revisado muchas entradas antiguas y estamos listos para compartir una versión moderna de las instrucciones.

Recomendamos leer el artículo completo antes de ejecutar los comandos indicados.

Preparación del sistema operativo

La filtración se configurará mediante la herramienta iptables, que requiere una extensión para trabajar con datos de GeoIP. Esta extensión se puede encontrar en xtables-addons. xtables-addons instala extensiones para iptables en forma de módulos independientes del núcleo, por lo que no es necesario recompilar el núcleo del sistema operativo.

Al momento de redactar este artículo, la versión actual de xtables-addons es 3.9. Sin embargo, en los repositorios estándar de Ubuntu 20.04 LTS solo se puede encontrar la 3.8, y en los repositorios de Ubuntu 18.04, la 3.0. Se puede instalar la extensión desde el gestor de paquetes con el siguiente comando:

apt install xtables-addons-common libtext-csv-xs-perl

Cabe destacar que entre la versión 3.9 y el estado actual del proyecto hay diferencias pequeñas, pero importantes, de las que hablaremos más adelante. Para compilar desde el código fuente, instalamos todos los paquetes necesarios:

apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl

Clonamos el repositorio:

git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons

cd xtables-addons-xtables-addons

xtables-addons contiene muchas extensiones, pero solo nos interesa xt_geoip. Si no deseas cargar en el sistema extensiones innecesarias, se pueden excluir de la compilación. Para ello, debes editar el archivo mconfig. Para todos los módulos deseados, colocar y, y marcar los innecesarios como n. Compilamos:

./autogen.sh

./configure

make

Y los instalamos con permisos de superusuario:

make install

Durante la instalación de los módulos del núcleo, puede surgir un error con un contenido similar a:

INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
En main.c:160:
- Error SSL:02001002: biblioteca del sistema: fopen: No such file or directory: ../crypto/bio/bss_file.c:72
- Error SSL:2006D080: rutinas BIO: BIO_new_file: no such file: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: No such file or directory

Esta situación ocurre debido a la imposibilidad de firmar los módulos del núcleo, ya que no hay nada con qué firmar. Para resolver este problema, puedes usar un par de comandos:

cd /lib/modules/(uname -r)/build/certs

cat < x509.genkey

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Módulos

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF

openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem

El módulo del núcleo compilado está instalado, pero el sistema no lo reconoce. Pediremos al sistema que genere un mapa de dependencias teniendo en cuenta el nuevo módulo, y luego lo cargaremos:

depmod -a

modprobe xt_geoip

Verificaremos que xt_geoip está cargado en el sistema:

# lsmod | grep xt_geoip
xt_geoip               16384  0
x_tables               40960  2 xt_geoip,ip_tables

Además, asegurémonos de que la extensión se ha cargado en iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Todo está bien y solo queda añadir el nombre del módulo en /etc/modules, para que el módulo funcione después de reiniciar el sistema operativo. A partir de este momento, iptables entiende los comandos geoip, pero le faltan los datos para funcionar. Comencemos a cargar la base de datos geoip.

Obteniendo la base de datos GeoIP

Creamos un directorio donde se almacenará la información comprensible para la extensión iptables:

mkdir /usr/share/xt_geoip

Al principio del artículo mencionamos que hay diferencias entre la versión del código fuente y la versión del gestor de paquetes. La diferencia más notable radica en el cambio de proveedor de la base de datos y el script xt_geoip_dl, que descarga datos actuales.

La versión del gestor de paquetes

El script se encuentra en /usr/lib/xtables-addons, sin embargo, al intentar ejecutarlo puede que se vea un error poco informativo:

# ./xt_geoip_dl 
unzip:  cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.

Anteriores a este producto se utilizaba la base de datos GeoLite, ahora conocida como GeoLite Legacy, distribuida bajo la licencia Creative Commons ASA 4.0 de la compañía MaxMind. Con este producto, ocurrieron dos eventos que "rompieron" la compatibilidad con la extensión para iptables.

Primero, en enero de 2018 anunciaron se anunció el cese del soporte del producto, y el segundo de enero de 2019 se eliminaron todos los enlaces de descarga de la versión anterior del sitio web oficial. A los nuevos usuarios se les recomienda usar el producto GeoLite2 o su versión de pago GeoIP2.

En segundo lugar, desde diciembre de 2019, MaxMind declaró anunció un cambio significativo en el acceso a sus bases de datos. Para cumplir con la ley de protección al consumidor de California, la empresa MaxMind decidió "cerrar" la distribución de GeoLite2 a través del registro.

Dado que queremos aprovechar su producto, nos registraremos en esta página.

xtables-addons: filtrando paquetes por países
Después, recibirás un mensaje en tu correo electrónico pidiéndote que establezcas una contraseña. Ahora que hemos creado la cuenta, necesitamos generar una clave de licencia. En el área personal, buscamos el elemento Mis Claves de Licencia, luego presionamos el botón Generar nueva clave de licencia.

Al crear la clave solo se nos hará una pregunta: ¿usaremos esta clave en el programa GeoIP Update? Respondemos negativamente y hacemos clic en el botón Confirmar. En la ventana emergente se mostrará la clave. Guarda esta clave en un lugar seguro, ya que después de cerrar la ventana emergente no podrás ver la clave completa.

xtables-addons: filtrando paquetes por países
Podemos descargar las bases de datos GeoLite2 manualmente, pero su formato no es compatible con el formato que espera el script xt_geoip_build. Aquí es donde entran en juego los scripts GeoLite2xtables. Para utilizar los scripts, instalamos el módulo Perl NetAddr::IP:

wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gz

tar xvf NetAddr-IP-4.079.tar.gz

cd NetAddr-IP-4.079

perl Makefile.PL

make

make install

Luego clonamos el repositorio de scripts y guardamos en el archivo la clave de licencia obtenida anteriormente:

git clone https://github.com/mschmitt/GeoLite2xtables.git

cd GeoLite2xtables

echo YOUR_LICENSE_KEY='123ertyui123' > geolite2.license

Ejecutamos los scripts:

# Скачиваем данные GeoLite2
./00_download_geolite2
# Скачиваем информацию о странах (для соответствия коду)
./10_download_countryinfo
# Конвертируем GeoLite2 базу в формат GeoLite Legacy 
cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |
./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/dbip-country-lite.csv

MaxMind impone un límite de 2000 descargas por día y, si hay muchos servidores, sugiere almacenar la actualización en un servidor proxy.

Ten en cuenta que el archivo de salida debe llamarse obligatoriamente dbip-country-lite.csv. Lamentablemente, 20_convert_geolite2 no genera un archivo ideal. El script xt_geoip_build espera tres columnas:

  • inicio del rango de direcciones;
  • fin del rango de direcciones;
  • código del país en iso-3166-alpha2.

Y el archivo de salida contiene seis columnas:

  • inicio del rango de direcciones (representación en cadena);
  • fin del rango de direcciones (representación en cadena);
  • inicio del rango de direcciones (representación numérica);
  • fin del rango de direcciones (representación numérica);
  • código del país;
  • nombre del país.

Esta discrepancia es crítica y puede corregirse de dos maneras:

  1. editar 20_convert_geolite2;
  2. editar xt_geoip_build.

En el primer caso, reducimos printf al formato requerido, y en el segundo, cambiamos la asignación a la variable $cc en $row->[4]. Después de esto, se puede proceder a la construcción:

/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip

. . .
 2239 rangos IPv4 para ZA
 348 rangos IPv6 para ZA
 56 rangos IPv4 para ZM
 12 rangos IPv6 para ZM
 56 rangos IPv4 para ZW
 15 rangos IPv6 para ZW

Cabe destacar que el autor GeoLite2xtables no considera que sus scripts estén listos para producción y sugiere siguiendo desarrollando scripts originales xt_geoip_*. Por lo tanto, pasemos a la compilación a partir de los códigos fuente, en la que estos scripts ya están actualizados.

Versión de los códigos fuente

Al instalar desde los códigos fuente, los scripts xt_geoip_* se encuentran en el directorio /usr/local/libexec/xtables-addons. En esta versión del script se utiliza una base de datos IP to Country Lite. La licencia es la Licencia de Atribución de Creative Commons, y de los datos disponibles son las tres columnas necesarias. Descargamos y recopilamos la base:

cd /usr/share/xt_geoip/

/usr/local/libexec/xtables-addons/xt_geoip_dl

/usr/local/libexec/xtables-addons/xt_geoip_build

Después de estas acciones, iptables está listo para funcionar.

Usamos geoip en iptables

Módulo xt_geoip agrega solo dos opciones:

opciones de coincidencia geoip:
[!] --src-cc, --source-country country[,country...]
	Coincidir paquetes provenientes de (uno de) los países especificados
[!] --dst-cc, --destination-country country[,country...]
	Coincidir paquetes que van a (uno de) los países especificados

NOTA: El país se ingresa mediante su código ISO3166.

Los métodos para formar reglas para iptables, en general, permanecen sin cambios. Para usar las opciones de módulos adicionales, es necesario especificar explícitamente el nombre del módulo con la opción -m. Por ejemplo, la regla para bloquear conexiones TCP entrantes en el puerto 443 que no provienen de EE.UU. en todas las interfaces:

iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP

Los archivos creados por xt_geoip_build se utilizan solo al crear reglas, pero no se tienen en cuenta al filtrar. Por lo tanto, para actualizar correctamente la base geoip, primero es necesario actualizar los archivos iv*-y luego recrear todas las reglas que utilizan geoip en iptables.

Conclusión

La filtración de paquetes según la pertenencia a países es una estrategia algo olvidada con el tiempo. A pesar de esto, las herramientas de software para tal filtración están en desarrollo y, posiblemente, pronto aparecerá una nueva versión de xt_geoip con un nuevo proveedor de datos geoip en los administradores de paquetes, lo que facilitará significativamente la vida de los administradores de sistemas.

xtables-addons: filtrando paquetes por países

Solo los usuarios registrados pueden participar en la encuesta. Inicie sesión, por favor.

¿Alguna vez has usado filtración por países?

  • 59,1%Sí13

  • 40,9%No9

22 usuarios votaron. 3 usuarios se abstuvieron.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster