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:
- editar 20_convert_geolite2 ;
- 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.