xtables-addons: filtra los paquetes por país



La tarea de bloquear el tráfico de determinados países parece sencilla, pero la primera impresión es engañosa. Hoy te contamos cómo se puede implementar.



Antecedentes



Los resultados de búsqueda de Google sobre este tema son perturbadores: la mayoría de las soluciones han estado "podridas" durante mucho tiempo y, a veces, parece que este tema se ha dejado de lado y se ha olvidado para siempre. Hemos revisado muchos registros antiguos y estamos listos para compartir la versión moderna de las instrucciones.

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

Preparando el sistema operativo



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



En el momento de escribir este artículo, la versión actual de xtables-addons es 3.9. Sin embargo, solo 3.8 se puede encontrar en los repositorios estándar de Ubuntu 20.04 LTS y 3.0 en los repositorios de Ubuntu 18.04. 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 pequeñas pero importantes diferencias entre la versión 3.9 y el estado actual del proyecto, que discutiremos más adelante. Para construir a partir de códigos 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


Clona 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 estamos interesados ​​en xt_geoip . Si no desea arrastrar extensiones innecesarias al sistema, puede excluirlas del ensamblaje. Para hacer esto, necesita editar el archivo mconfig . Para todos los módulos deseados, coloque y , y todos los innecesarios, establezca 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 aparecer un error con el siguiente contenido:



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 se produce por la imposibilidad de firmar los módulos del kernel, ya que nada que firmar. Puede 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 basado en el nuevo módulo y luego lo cargue:



depmod -a


modprobe xt_geoip


Asegúrese 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


Todo nos conviene y lo único que nos queda es añadir el nombre del módulo a / etc / modules para que el módulo funcione después de reiniciar el SO. En este punto, iptables comprende los comandos geoip, pero carece de los datos para trabajar. Comencemos a cargar la base de datos geoip.



Obtener la base de datos GeoIP



Cree un directorio que almacenará información para la extensión iptables:



mkdir /usr/share/xt_geoip


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



Versión del administrador de paquetes



El script se encuentra en la ruta / usr / lib / xtables-addons, pero cuando intentas comenzar, es posible que veas 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, la base de datos utilizaba el producto GeoLite, ahora conocido como GeoLite Legacy, distribuido bajo la licencia Creative Commons ASA 4.0 por MaxMind . Con este producto, sucedieron dos eventos a la vez, que "rompieron" la compatibilidad con la extensión para iptables.



En primer lugar, en enero de 2018, anunciaron el fin del soporte para el producto, y el 2 de enero de 2019, se eliminaron del sitio web oficial todos los enlaces para descargar la versión anterior de la base de datos. Se recomienda a los nuevos usuarios que utilicen el producto GeoLite2 o su versión de pago GeoIP2.



En segundo lugar, desde diciembre de 2019, MaxMind anunciósobre un cambio significativo en el acceso a sus bases de datos. Para cumplir con la ley de protección al consumidor de California, MaxMind ha decidido "encubrir" la distribución de GeoLite2 mediante el registro.



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





Después de eso, llegará un mensaje al correo con una solicitud para establecer una contraseña. Ahora que hemos creado una cuenta, necesitamos crear una clave de licencia. En su cuenta personal, busque el elemento Mis claves de licencia y 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 de actualización de GeoIP? Respondemos negativamente y hacemos clic en el botón Confirmar . La clave se mostrará en la ventana emergente. Guarde esta clave en un lugar seguro, ya que después de cerrar la ventana emergente, ya no podrá ver la clave completa.





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 entran los scripts GeoLite2xtables. Para que los scripts funcionen, 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 el archivo:



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


cd GeoLite2xtables


echo YOUR_LICENSE_KEY=\’123ertyui123\' > geolite2.license


Lanzamos 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é las actualizaciones 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. El script xt_geoip_build espera tres columnas:



  • el comienzo 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 (numérico);
  • fin del rango de direcciones (numérico);
  • código del país;
  • el nombre del país.


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



  1. editar 20_convert_geolite2 ;
  2. editar xt_geoip_build .


En el primer caso, acortamos printf al formato deseado, y en el segundo, cambiamos la asignación de la variable $ cc a $ fila -> [4] . Después de eso, 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 de GeoLite2xtables no considera que sus scripts estén listos para la producción y sugiere que siga el desarrollo de los scripts xt_geoip_ * originales. Por lo tanto, pasemos a la compilación desde la fuente, en la que estos scripts ya se han actualizado.



Versión fuente



Al instalar desde la fuente, los scripts xt_geoip_ * se encuentran en el directorio / usr / local / libexec / xtables-addons . Esta versión del script utiliza la base de datos IP to Country Lite . Licencia - Licencia de atribución de Creative Commons, y de los datos disponibles, esas son las tres columnas más necesarias. Descarga y recopila 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



El 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.


La forma en que se forman las reglas de iptables permanece prácticamente sin cambios. Para utilizar conmutadores de módulos adicionales, debe especificar explícitamente el nombre del módulo con el conmutador -m. Por ejemplo, una regla para bloquear las conexiones TCP entrantes en el puerto 443 desde fuera 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 generados por xt_geoip_build se usan solo al crear reglas, pero no se consideran para el filtrado. Por lo tanto, para actualizar la base de datos geoip correctamente, primero debe actualizar los archivos iv * y luego volver a crear todas las reglas que usan geoip en iptables.

Conclusión



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






All Articles