xtables-addons: filtrar paquetes por país

xtables-addons: filtrar paquetes por país
La tarea de bloquear el tráfico procedente de determinados países parece sencilla, pero las primeras impresiones pueden engañar. Hoy te contamos cómo se puede implementar esto.

Prehistoria

Los resultados de una búsqueda en Google sobre este tema son decepcionantes: la mayoría de las soluciones llevan mucho tiempo "podridas" y, a veces, parece que este tema ha sido archivado y olvidado para siempre. Hemos revisado muchos registros antiguos y estamos listos para compartir una versión moderna de las instrucciones.

Le recomendamos que lea el artículo completo antes de ejecutar estos comandos.

Preparación del sistema operativo

El filtrado se configurará mediante la utilidad. iptables, que requiere una extensión para funcionar con datos GeoIP. Esta extensión se puede encontrar en complementos-xtables. xtables-addons instala extensiones para iptables como módulos de kernel independientes, por lo que no es necesario volver a compilar el kernel del sistema operativo.

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

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

Tenga en cuenta que existen diferencias pequeñas pero importantes entre la versión 3.9 y el estado actual del proyecto, que discutiremos más adelante. Para compilar desde el código fuente, instale 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

Clonar 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 desea arrastrar extensiones innecesarias al sistema, puede excluirlas de la compilación. Para hacer esto necesitas editar el archivo. mconfig. Para todos los módulos deseados, instale yy marque todos los innecesarios n. Nosotros coleccionamos:

./autogen.sh

./configure

make

E instalar con derechos de superusuario:

make install

Durante la instalación de los módulos del kernel, puede ocurrir un error similar al siguiente:

INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- SSL error:02001002:system library:fopen:No such file or directory: ../crypto/bio/bss_file.c:72
- SSL error:2006D080:BIO routines: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 surge debido a la imposibilidad de firmar los módulos del kernel, porque nada que firmar. Puedes resolver este problema con un par de comandos:

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

cat <<EOF > x509.genkey

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

[ req_distinguished_name ]
CN = Modules

[ 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 kernel compilado está instalado, pero el sistema no lo detecta. Pidamos al sistema que cree un mapa de dependencias teniendo en cuenta el nuevo módulo y luego lo carguemos:

depmod -a

modprobe xt_geoip

Asegurémonos de 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, asegúrese de que la extensión esté cargada en iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Estamos contentos con todo y solo queda agregar el nombre del módulo a /etc/modulospara que el módulo funcione después de reiniciar el sistema operativo. De ahora en adelante, iptables entiende los comandos geoip, pero no tiene suficientes datos para trabajar. Comencemos a cargar la base de datos geoip.

Obtener la base de datos GeoIP

Creamos un directorio en el que se almacenará información comprensible para la extensión iptables:

mkdir /usr/share/xt_geoip

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

Versión del administrador de paquetes

El script se encuentra en la ruta /usr/lib/xtables-addons, pero cuando intentes ejecutarlo, verás un error no muy informativo:

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

Anteriormente se utilizaba como base de datos el producto GeoLite, ahora conocido como GeoLite Legacy, distribuido bajo licencia. Creative Commons ASA 4.0 empresa MaxMind. Ocurrieron dos eventos con este producto a la vez que "rompieron" la compatibilidad con la extensión iptables.

Primero, en enero de 2018. ellos proclamaron sobre la terminación del soporte para el producto, y el 2019 de enero de 2, todos los enlaces para descargar la versión anterior de la base de datos se eliminaron del sitio web oficial. Se recomienda a los nuevos usuarios que utilicen el producto GeoLite2 o su versión paga GeoIPXNUMX.

En segundo lugar, desde diciembre de 2019 MaxMind dicho sobre un cambio significativo en el acceso a sus bases de datos. Para cumplir con la Ley de Privacidad del Consumidor de California, MaxMind decidió "cubrir" la distribución de GeoLite2 con el registro.

Como queremos utilizar su producto, nos registraremos en esta página.

xtables-addons: filtrar paquetes por país
Luego recibirá un correo electrónico pidiéndole que establezca una contraseña. Ahora que hemos creado una cuenta, necesitamos crear una clave de licencia. En su cuenta personal encontramos el artículo. Mis claves de licenciay luego haga clic en el botón Generar nueva clave de licencia.

Al crear una clave, solo se nos hará una pregunta: ¿usaremos esta clave en el programa GeoIP Update? Respondemos negativamente y pulsamos el botón. Confirmar. La clave se mostrará en una ventana emergente. Guarde esta clave en un lugar seguro, ya que una vez que cierre la ventana emergente, ya no podrá ver la clave completa.

xtables-addons: filtrar paquetes por país
Tenemos la capacidad de descargar bases de datos GeoLite2 manualmente, pero su formato no es compatible con el formato esperado por el script xt_geoip_build. Aquí es donde los scripts de GeoLite2xtables vienen al rescate. Para ejecutar scripts, instale 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

A continuación, clonamos el repositorio con scripts y escribimos la clave de licencia obtenida previamente en un archivo:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Ejecutemos 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, con una gran cantidad de servidores, ofrece almacenar en caché la actualización en un servidor proxy.

Tenga en cuenta que el archivo de salida debe llamarse dbip-country-lite.csv... Desafortunadamente, 20_convert_geolite2 no produce un archivo perfecto. Guion xt_geoip_build espera tres columnas:

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

Y el archivo de salida contiene seis columnas:

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

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

  1. править 20_convert_geolite2;
  2. править 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 $fila->[4]. Después de esto puedes construir:

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

. . .
 2239 IPv4 ranges for ZA
  348 IPv6 ranges for ZA
   56 IPv4 ranges for ZM
   12 IPv6 ranges for ZM
   56 IPv4 ranges for ZW
   15 IPv6 ranges for ZW

Tenga en cuenta que el autor GeoLite2xmesas no considera sus guiones listos para producción y ofrece seguir para el desarrollo de scripts xt_geoip_* originales. Por tanto, pasemos al montaje de los códigos fuente, en el que estos scripts ya han sido actualizados.

Versión fuente

Al instalar desde scripts de código fuente xt_geoip_* se encuentran en el catalogo /usr/local/libexec/xtables-addons. Esta versión del script utiliza una base de datos. IP al país Lite. La licencia es Creative Commons Attribution License, y de los datos disponibles aparecen las tres columnas muy necesarias. Descargue y monte la base de datos:

cd /usr/share/xt_geoip/

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

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

Después de estos pasos, iptables está listo para funcionar.

Usando geoip en iptables

Módulo xt_geoip agrega solo dos claves:

geoip match options:
[!] --src-cc, --source-country country[,country...]
	Match packet coming from (one of) the specified country(ies)
[!] --dst-cc, --destination-country country[,country...]
	Match packet going to (one of) the specified country(ies)

NOTE: The country is inputed by its ISO3166 code.

Los métodos para crear reglas para iptables, en general, permanecen sin cambios. Para utilizar claves de módulos adicionales, debe especificar explícitamente el nombre del módulo con el modificador -m. Por ejemplo, una regla para bloquear conexiones TCP entrantes en el puerto 443 que no sea 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 de datos geoip, primero debe actualizar los archivos iv* y luego recrear todas las reglas que usan geoip en iptables.

Conclusión

Filtrar paquetes según países es una estrategia un tanto olvidada por el tiempo. A pesar de esto, se están desarrollando herramientas de software para dicho filtrado y, quizás, pronto aparecerá en los administradores de paquetes una nueva versión de xt_geoip con un nuevo proveedor de datos geoip, lo que simplificará enormemente la vida de los administradores del sistema.

xtables-addons: filtrar paquetes por país

Solo los usuarios registrados pueden participar en la encuesta. Registrarsepor favor

¿Has utilizado alguna vez el filtrado por país?

  • 59,1%Sí13

  • 40,9%No9

22 usuarios votaron. 3 usuarios se abstuvieron.

Fuente: habr.com

Añadir un comentario