xtables-addons: filtra paquetes por país

xtables-addons: filtra paquetes por país
A tarefa de bloquear o tráfico de certos países parece sinxela, pero as primeiras impresións poden ser enganosas. Hoxe contarémosche como se pode implementar isto.

prehistoria

Os resultados dunha busca en Google sobre este tema son decepcionantes: a maioría das solucións levaban moito tempo "podre" e ás veces parece que este tema foi arquivado e esquecido para sempre. Peiteamos moitos rexistros antigos e estamos preparados para compartir unha versión moderna das instrucións.

Recomendamos que leas todo o artigo antes de executar estes comandos.

Preparación do sistema operativo

O filtrado configurarase mediante a utilidade iptables, que require unha extensión para traballar con datos GeoIP. Esta extensión pódese atopar en xtables-complementos. xtables-addons instala extensións para iptables como módulos de núcleo independentes, polo que non hai necesidade de recompilar o núcleo do sistema operativo.

No momento de escribir este artigo, a versión actual de xtables-addons é a 3.9. Non obstante, só se pode atopar 20.04 nos repositorios estándar de Ubuntu 3.8 LTS e 18.04 nos repositorios Ubuntu 3.0. Podes instalar a extensión desde o xestor de paquetes co seguinte comando:

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

Teña en conta que hai pequenas pero importantes diferenzas entre a versión 3.9 e o estado actual do proxecto, que comentaremos máis adiante. Para construír a partir do código fonte, instale todos os 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 o repositorio:

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

cd xtables-addons-xtables-addons

xtables-addons contén moitas extensións, pero só nos interesan xt_geoip. Se non queres arrastrar extensións innecesarias ao sistema, podes excluílas da compilación. Para iso cómpre editar o ficheiro mconfig. Para todos os módulos desexados, instale y, e marca todos os innecesarios n. Recollemos:

./autogen.sh

./configure

make

E instalar con dereitos de superusuario:

make install

Durante a instalación dos módulos do núcleo, pode ocorrer un erro similar ao seguinte:

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 xorde debido á imposibilidade de asinar módulos do núcleo, porque nada que asinar. Podes resolver este problema cun 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

O módulo do núcleo compilado está instalado, pero o sistema non o detecta. Pedímoslle ao sistema que cree un mapa de dependencias tendo en conta o novo módulo, e despois cargueo:

depmod -a

modprobe xt_geoip

Asegurémonos de que xt_geoip estea cargado no sistema:

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

Ademais, asegúrate de que a extensión estea cargada en iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Estamos contentos con todo e só queda engadir o nome do módulo / etc / modulespara que o módulo funcione despois de reiniciar o sistema operativo. A partir de agora, iptables comprende os comandos geoip, pero non ten datos suficientes para traballar. Imos comezar a cargar a base de datos geoip.

Obtención da base de datos GeoIP

Creamos un directorio no que se almacenará información comprensible para a extensión iptables:

mkdir /usr/share/xt_geoip

Ao comezo do artigo, mencionamos que hai diferenzas entre a versión do código fonte e a versión do xestor de paquetes. A diferenza máis notable é o cambio no provedor da base de datos e no script xt_geoip_dl, que descarga os datos máis recentes.

Versión do xestor de paquetes

O script está situado na ruta /usr/lib/xtables-addons, pero cando intente executalo, verá un erro pouco 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, o produto GeoLite, agora coñecido como GeoLite Legacy, distribuído baixo licenza, utilizábase como base de datos Creative Commons ASA 4.0 empresa MaxMind. Con este produto ocorreron dous eventos á vez que "romperon" a compatibilidade coa extensión iptables.

En primeiro lugar, en xaneiro de 2018 anunciou sobre a terminación do soporte para o produto e, o 2019 de xaneiro de 2, todas as ligazóns para descargar a versión antiga da base de datos foron eliminadas do sitio web oficial. Recoméndase aos novos usuarios que utilicen o produto GeoLite2 ou a súa versión de pago GeoIPXNUMX.

En segundo lugar, desde decembro de 2019 MaxMind afirmou sobre un cambio significativo no acceso ás súas bases de datos. Para cumprir coa Lei de Privacidade do Consumidor de California, MaxMind decidiu "cubrir" a distribución de GeoLite2 con rexistro.

Xa que queremos utilizar o seu produto, rexistrarémonos nesta páxina.

xtables-addons: filtra paquetes por país
A continuación, recibirá un correo electrónico solicitándolle que estableza un contrasinal. Agora que creamos unha conta, necesitamos crear unha clave de licenza. Na túa conta persoal atopamos o elemento As miñas claves de licenza, e despois fai clic no botón Xerar nova clave de licenza.

Ao crear unha chave, só se nos fará unha pregunta: empregaremos esta chave no programa de actualización de GeoIP? Respondemos negativamente e prememos o botón Confirmar. A clave aparecerá nunha ventá emerxente. Garda esta chave nun lugar seguro, xa que unha vez que peches a ventá emerxente, xa non poderás ver a chave completa.

xtables-addons: filtra paquetes por país
Temos a posibilidade de descargar bases de datos GeoLite2 manualmente, pero o seu formato non é compatible co formato esperado polo script xt_geoip_build. Aquí é onde os scripts de GeoLite2xtables veñen ao rescate. Para executar scripts, instale o 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 o repositorio con scripts e escribimos a clave de licenza obtida previamente nun ficheiro:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Imos executar os 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 impón un límite de 2000 descargas por día e, cunha gran cantidade de servidores, ofrécese almacenar a actualización en caché nun servidor proxy.

Teña en conta que debe chamarse ao ficheiro de saída dbip-country-lite.csv... Desafortunadamente, 20_converter_xeolita2 non produce un ficheiro perfecto. Guión xt_geoip_build espera tres columnas:

  • inicio do intervalo de enderezos;
  • fin do intervalo de enderezos;
  • código de país en iso-3166-alpha2.

E o ficheiro de saída contén seis columnas:

  • inicio do intervalo de enderezos (representación de cadea);
  • fin do intervalo de enderezos (representación de cadea);
  • inicio do intervalo de enderezos (representación numérica);
  • fin do intervalo de enderezos (representación numérica);
  • código de país;
  • o nome do país.

Esta discrepancia é fundamental e pódese corrixir de dúas formas:

  1. reinado 20_converter_xeolita2;
  2. reinado xt_geoip_build.

No primeiro caso reducimos imprimirf ao formato necesario e, no segundo, cambiamos a asignación á variable $cc en $fila->[4]. Despois diso podes construír:

/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

Teña en conta que o autor GeoLite2xtables non considera os seus guións listos para a produción e as ofertas pista para o desenvolvemento de scripts xt_geoip_* orixinais. Polo tanto, pasemos á montaxe dos códigos fonte, nos que xa se actualizaron estes scripts.

Versión fonte

Ao instalar desde scripts de código fonte xt_geoip_* están localizados no catálogo /usr/local/libexec/xtables-addons. Esta versión do script usa unha base de datos IP a Country Lite. A licenza é Creative Commons Attribution License, e dos datos dispoñibles hai as tres columnas moi necesarias. Descarga e monta a base de datos:

cd /usr/share/xt_geoip/

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

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

Despois destes pasos, iptables está listo para funcionar.

Usando geoip en iptables

Módulo xt_geoip engade só dúas 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.

Os métodos para crear regras para iptables, en xeral, permanecen sen cambios. Para usar claves de módulos adicionais, debes especificar explícitamente o nome do módulo co interruptor -m. Por exemplo, unha regra para bloquear as conexións TCP entrantes no porto 443 non procedentes dos EUA en todas as interfaces:

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

Os ficheiros creados por xt_geoip_build úsanse só ao crear regras, pero non se teñen en conta ao filtrar. Así, para actualizar correctamente a base de datos geoip, primeiro debes actualizar os ficheiros iv*, e despois recrear todas as regras que usan geoip en iptables.

Conclusión

Filtrar paquetes en función dos países é unha estratexia un tanto esquecida polo tempo. A pesar diso, estase a desenvolver ferramentas de software para tal filtrado e, quizais, pronto apareza nos xestores de paquetes unha nova versión de xt_geoip cun novo provedor de datos xeoip, o que simplificará moito a vida dos administradores do sistema.

xtables-addons: filtra paquetes por país

Só os usuarios rexistrados poden participar na enquisa. Rexístrate, por favor.

Usaches algunha vez o filtrado por país?

  • 59,1%Si 13

  • 40,9%No 9

Votaron 22 usuarios. 3 usuarios abstivéronse.

Fonte: www.habr.com

Engadir un comentario