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
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.
Primero, en enero de 2018.
En segundo lugar, desde diciembre de 2019 MaxMind
Como queremos utilizar su producto, nos registraremos en esta página.
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.
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:
- править 20_convert_geolite2;
- править xt_geoip_build.
En el primer caso reducimos
/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
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.
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.
Solo los usuarios registrados pueden participar en la encuesta.
¿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