La tasca de bloquejar el trànsit de determinats països sembla senzilla, però les primeres impressions poden enganyar. Avui us explicarem com es pot implementar això.
prehistòria
Els resultats d'una cerca a Google sobre aquest tema són decebedors: la majoria de les solucions fa temps que estan "podrides" i de vegades sembla que aquest tema s'ha deixat de banda i s'ha oblidat per sempre. Hem revisat molts registres antics i estem preparats per compartir una versió moderna de les instruccions.
Us recomanem que llegiu l'article sencer abans d'executar aquestes ordres.
Preparació del sistema operatiu
El filtratge es configurarà mitjançant la utilitat iptables, que requereix una extensió per treballar amb dades GeoIP. Aquesta extensió es pot trobar a
En el moment d'escriure, la versió actual de xtables-addons és la 3.9. Tanmateix, només es pot trobar 20.04 als dipòsits estàndard d'Ubuntu 3.8 LTS i 18.04 als dipòsits Ubuntu 3.0. Podeu instal·lar l'extensió des del gestor de paquets amb l'ordre següent:
apt install xtables-addons-common libtext-csv-xs-perl
Tingueu en compte que hi ha diferències petites però importants entre la versió 3.9 i l'estat actual del projecte, que parlarem més endavant. Per crear a partir del codi font, instal·leu tots els paquets necessaris:
apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl
Clonar el repositori:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addons
xtables-addons conté moltes extensions, però només ens interessen xt_geoip. Si no voleu arrossegar extensions innecessàries al sistema, podeu excloure-les de la compilació. Per fer-ho, cal editar el fitxer mconfig. Per a tots els mòduls desitjats, instal·leu y, i marca tots els innecessaris n. Recollim:
./autogen.sh
./configure
make
I instal·leu amb drets de superusuari:
make install
Durant la instal·lació dels mòduls del nucli, es pot produir un error semblant al següent:
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
Aquesta situació sorgeix a causa de la impossibilitat de signar mòduls del nucli, perquè res a signar. Podeu resoldre aquest problema amb un parell d'ordres:
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òdul del nucli compilat està instal·lat, però el sistema no el detecta. Demanem al sistema que creï un mapa de dependències tenint en compte el nou mòdul, i després el carreguem:
depmod -a
modprobe xt_geoip
Assegurem-nos que xt_geoip es carregui al sistema:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tables
A més, assegureu-vos que l'extensió es carregui a iptables:
# cat /proc/net/ip_tables_matches
geoip
icmp
Estem contents amb tot i només queda afegir-hi el nom del mòdul / Etc / modulesperquè el mòdul funcioni després de reiniciar el sistema operatiu. A partir d'ara, iptables entén les ordres geoip, però no té prou dades per treballar-hi. Comencem a carregar la base de dades geoip.
Obtenció de la base de dades GeoIP
Creem un directori en el qual s'emmagatzemarà informació comprensible per a l'extensió iptables:
mkdir /usr/share/xt_geoip
Al principi de l'article, vam esmentar que hi ha diferències entre la versió del codi font i la versió del gestor de paquets. La diferència més notable és el canvi en el proveïdor de la base de dades i l'script xt_geoip_dl, que baixa les dades més recents.
Versió del gestor de paquets
L'script es troba al camí /usr/lib/xtables-addons, però quan intenteu executar-lo, veureu un error poc informatiu:
# ./xt_geoip_dl
unzip: cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.
Anteriorment, el producte GeoLite, ara conegut com GeoLite Legacy, distribuït sota llicència, s'utilitzava com a base de dades
En primer lloc, el gener de 2018
En segon lloc, des de desembre de 2019 MaxMind
Com que volem utilitzar el seu producte, ens registrarem en aquesta pàgina.
Aleshores rebreu un correu electrònic que us demanarà que establiu una contrasenya. Ara que hem creat un compte, hem de crear una clau de llicència. Al teu compte personal trobem l'article Les meves claus de llicència, i després feu clic al botó Genera una nova clau de llicència.
A l'hora de crear una clau, només se'ns farà una pregunta: utilitzarem aquesta clau al programa d'actualització de GeoIP? Contestem negativament i premem el botó Confirmar. La clau es mostrarà en una finestra emergent. Deseu aquesta clau en un lloc segur, ja que un cop tanqueu la finestra emergent, ja no podreu veure la clau sencera.
Tenim la possibilitat de descarregar les bases de dades GeoLite2 manualment, però el seu format no és compatible amb el format esperat per l'script xt_geoip_build. Aquí és on els scripts de GeoLite2xtables vénen al rescat. Per executar scripts, instal·leu el mòdul 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ó, clonem el dipòsit amb scripts i escrivim la clau de llicència obtinguda prèviament en un fitxer:
git clone https://github.com/mschmitt/GeoLite2xtables.git
cd GeoLite2xtables
echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license
Executem els 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 imposa un límit de 2000 descàrregues per dia i, amb un gran nombre de servidors, ofereix la memòria cau de l'actualització en un servidor intermediari.
Tingueu en compte que el fitxer de sortida s'ha de cridar dbip-country-lite.csv... Malauradament, 20_convertir_geolita2 no produeix un fitxer perfecte. Guió xt_geoip_build espera tres columnes:
- inici de l'interval d'adreces;
- final de l'interval d'adreces;
- codi de país a iso-3166-alpha2.
I el fitxer de sortida conté sis columnes:
- inici de l'interval d'adreces (representació de cadena);
- final de l'interval d'adreces (representació de cadena);
- inici de l'interval d'adreces (representació numèrica);
- final de l'interval d'adreces (representació numèrica);
- codi de país;
- el nom del país.
Aquesta discrepància és crítica i es pot corregir de dues maneres:
- regnar 20_convertir_geolita2;
- regnar xt_geoip_build.
En el primer cas reduïm
/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
Tingueu en compte que l'autor
Versió font
Quan instal·leu des de scripts de codi font xt_geoip_* es troben al catàleg /usr/local/libexec/xtables-addons. Aquesta versió de l'script utilitza una base de dades
cd /usr/share/xt_geoip/
/usr/local/libexec/xtables-addons/xt_geoip_dl
/usr/local/libexec/xtables-addons/xt_geoip_build
Després d'aquests passos, iptables està llest per funcionar.
Utilitzant geoip a iptables
Mòdul xt_geoip afegeix només dues claus:
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.
Els mètodes per crear regles per a iptables, en general, romanen sense canvis. Per utilitzar claus de mòduls addicionals, heu d'especificar explícitament el nom del mòdul amb el commutador -m. Per exemple, una regla per bloquejar les connexions TCP entrants al port 443 no des dels EUA a totes les interfícies:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP
Els fitxers creats per xt_geoip_build només s'utilitzen quan es creen regles, però no es tenen en compte a l'hora de filtrar. Així, per actualitzar correctament la base de dades geoip, primer heu d'actualitzar els fitxers iv*, i després recrear totes les regles que utilitzen geoip a iptables.
Conclusió
Filtrar paquets per països és una estratègia una mica oblidada pel temps. Malgrat això, s'estan desenvolupant eines de programari per a aquest filtratge i, potser, aviat apareixerà una nova versió de xt_geoip amb un nou proveïdor de dades geoip als gestors de paquets, cosa que simplificarà molt la vida dels administradors del sistema.
Només els usuaris registrats poden participar en l'enquesta.
Heu utilitzat mai el filtratge per país?
-
59,1%Sí 13
-
40,9%No9
Han votat 22 usuaris. 3 usuaris es van abstenir.
Font: www.habr.com