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
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
En primeiro lugar, en xaneiro de 2018
En segundo lugar, desde decembro de 2019 MaxMind
Xa que queremos utilizar o seu produto, rexistrarémonos nesta páxina.
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.
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:
- reinado 20_converter_xeolita2;
- reinado xt_geoip_build.
No primeiro 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
Teña en conta que o autor
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
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.
Só os usuarios rexistrados poden participar na enquisa.
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