xtables-addons: filtrăm pachetele după țări

xtables-addons: filtrăm pachetele după țări
Sarcina de a bloca traficul din anumite țări pare simplă, dar prima impresie este înșelătoare. Astăzi vom discuta despre cum poate fi realizat acest lucru.

Povestea

Rezultatele căutărilor în Google pe această temă sunt dezamăgitoare: majoritatea soluțiilor sunt deja "expirate" și uneori pare că acest subiect a fost pus deoparte pentru totdeauna. Noi am "cercetat" multe înregistrări mai vechi și suntem pregătiți să împărtășim o versiune modernizată a instrucțiunilor.

Recomandăm citirea articolului în întregime înainte de a executa comenzile indicate.

Pregătirea sistemului de operare

Filtrarea va fi configurată cu ajutorul utilitarului iptables, care necesită o extensie pentru a lucra cu datele GeoIP. O astfel de extensie poate fi găsită în xtables-addons. xtables-addons instalează extensii pentru iptables sub formă de module de kernel independente, ceea ce înseamnă că nu este nevoie să recompilați kernelul OS.

La momentul scrierii acestui articol, versiunea actuală a xtables-addons este 3.9. Cu toate acestea, în repozitoarele standard Ubuntu 20.04 LTS se poate găsi doar 3.8, iar în repozitoarele Ubuntu 18.04 doar 3.0. Extensia din managerul de pachete poate fi instalată cu următoarea comandă:

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

Menționăm că între versiunea 3.9 și starea actuală a proiectului există unele diferențe mici, dar importante, despre care vom vorbi mai târziu. Pentru a compila din cod sursă, instalăm toate pachetele necesare:

apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl

Clonăm repo-ul:

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

cd xtables-addons-xtables-addons

xtables-addons conține numeroase extensii, dar ne interesează doar xt_geoip. Dacă nu doriți să aduceți în sistem extensii inutile, acestea pot fi excluse din construcție. Pentru aceasta, trebuie să editați fișierul mconfig. Pentru toate modulele dorite, puneți Stabiliți o parolă și păstrați-o în siguranță!, iar pe cele inutile marcați n. Construim:

./autogen.sh

./configure

make

Și instalăm cu drepturi de superuser:

make install

În timpul instalării modulelor kernel, poate apărea o eroare de genul:

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

Această situație apare din cauza imposibilității de a semna modulele nucleului, deoarece nu există nimic cu ce să le semnăm. Această problemă poate fi rezolvată cu câteva comenzi:

cd /lib/modules/(uname -r)/build/certs

cat < x509.genkey

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Module

[ 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

Modul nucleului a fost compilat și este instalat, dar sistemul nu îl recunoaște. Hai să cerem sistemului să creeze o hartă a dependențelor având în vedere noul modul, apoi îl vom încărca:

depmod -a

modprobe xt_geoip

Să ne asigurăm că xt_geoip este încărcat în sistem:

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

De asemenea, să ne asigurăm că extensia a fost încărcată în iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Suntem mulțumiți și rămâne doar să adăugăm numele modulului în /etc/modules, astfel încât modulul să funcționeze după repornirea sistemului de operare. De acum înainte, iptables înțelege comenzile geoip, dar îi lipsesc datele pentru a funcționa. Începem să descărcăm baza de date geoip.

Obținerea bazei de date GeoIP

Creăm un catalog în care va fi stocată informația pe care extensia iptables o poate înțelege:

mkdir /usr/share/xt_geoip

La începutul articolului, am menționat că există diferențe între versiunea din codul sursă și versiunea din managerul de pachete. Cea mai vizibilă diferență constă în schimbarea furnizorului bazei de date și a scriptului xt_geoip_dl, care descarcă datele actualizate.

Versiunea din managerul de pachete

Scriptul se află în calea /usr/lib/xtables-addons, însă încercarea de a-l rula poate duce la o eroare destul de neinformată:

# ./xt_geoip_dl 
unzip:  cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.

Anterior, ca bază de date se folosea produsul GeoLite, acum cunoscut sub numele de GeoLite Legacy, distribuit sub licența Creative Commons ASA 4.0 de compania MaxMind. Cu acest produs au avut loc două evenimente care au „stricat” compatibilitatea cu extensia pentru iptables.

În primul rând, în ianuarie 2018 au anunțat au anunțat despre întreruperea suportului pentru produs, iar pe 2 ianuarie 2019 au eliminat toate linkurile de descărcare a versiunii vechi de pe site-ul lor oficial. Utilizatorii noi sunt sfătuiți să folosească produsul GeoLite2 sau versiunea sa plătită GeoIP2.

În al doilea rând, din decembrie 2019 MaxMind a afirmat a făcut o modificare semnificativă în accesul la bazele lor. Pentru a se conforma legii din California privind protecția drepturilor consumatorilor, compania MaxMind a decis să „închidă” distribuția GeoLite2 prin înregistrare.

Deoarece dorim să folosim produsul lor, ne vom înregistra pe această pagină.

xtables-addons: filtrăm pachetele după țări
După aceea, veți primi un mesaj pe e-mail cu o solicitare de a stabili o parolă. Acum, când am creat un cont, trebuie să generăm o cheie de licență. În contul personal, găsim punctul Cheile mele de licență, apoi facem clic pe butonul Generează o nouă cheie de licență.

Când creăm cheia, ne va fi pusă o singură întrebare: vom folosi această cheie în programul GeoIP Update? Răspundem negativ și facem clic pe butonul Confirm. În fereastra pop-up va fi afișată cheia. Salvați această cheie într-un loc sigur, deoarece după închiderea ferestrei pop-up nu veți putea vizualiza cheia complet.

xtables-addons: filtrăm pachetele după țări
Avem posibilitatea de a descărca bazele GeoLite2 manual, dar formatul lor nu este compatibil cu formatul așteptat de scriptul xt_geoip_build. Aici intervine utilitatea scripturilor GeoLite2xtables. Pentru a funcționa, instalăm modulul 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

Apoi, clonăm repository-ul cu scripturile și scriem în fișier cheia de licență obținută anterior:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY='123ertyui123' > geolite2.license

Între timp, pornim scripturile:

# Скачиваем данные 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 impune o limită de 2000 descărcări pe zi și, în cazul mai multor servere, sugerează să stocăm actualizările pe un server proxy.

Vă rugăm să rețineți că fișierul de ieșire trebuie să se numească în mod obligatoriu dbip-country-lite.csv. Din păcate, 20_convert_geolite2 generează un fișier care nu este ideal. Scriptul xt_geoip_build așteaptă trei coloane:

  • începutul intervalului de adrese;
  • sfârșitul intervalului de adrese;
  • codul țării în iso-3166-alpha2.

Iar fișierul de ieșire conține șase coloane:

  • începutul intervalului de adrese (reprezentare textuală);
  • sfârșitul intervalului de adrese (reprezentare textuală);
  • începutul intervalului de adrese (reprezentare numerică);
  • sfârșitul intervalului de adrese (reprezentare numerică);
  • codul țării;
  • numele țării.

Această neconcordanță este critică și poate fi corectată în una din două modalități:

  1. corectare 20_convert_geolite2;
  2. corectare xt_geoip_build.

În prima situație, reducem printf la formatul necesar, iar în a doua — modificăm atribuirea variabilei $cc pe $row->[4]. După aceasta, se poate efectua compilarea:

/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip

. . .
 2239 intervale IPv4 pentru ZA
  348 intervale IPv6 pentru ZA
   56 intervale IPv4 pentru ZM
   12 intervale IPv6 pentru ZM
   56 intervale IPv4 pentru ZW
   15 intervale IPv6 pentru ZW

Să menționăm că autorul GeoLite2xtables nu consideră scripturile sale ca fiind gata pentru producție și le recomandă monitoriza pentru dezvoltarea scripturilor originale xt_geoip_*. Așadar, să trecem la compilarea din codul sursă, în care aceste scripturi sunt deja actualizate.

Versiunea din codul sursă

La instalarea din codul sursă, scripturile xt_geoip_* se află în directorul /usr/local/libexec/xtables-addons. În această versiune a scriptului se utilizează baza de date IP to Country Lite. Licența este Licența Creative Commons Attribution, iar dintre datele disponibile, cele trei coloane necesare. Descarcă și compilează baza:

cd /usr/share/xt_geoip/

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

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

După aceste acțiuni, iptables este gata de utilizare.

Folosim geoip în iptables

Modulul xt_geoip adaugă doar două opțiuni:

opțiuni pentru potrivirea geoip:
[!] --src-cc, --source-country country[,country...]
	Potrivește pachetul provenit din (una dintre) țările specificate
[!] --dst-cc, --destination-country country[,country...]
	Potrivește pachetul care merge către (una dintre) țările specificate

NOTĂ: Țara se introduce prin codul său ISO3166.

Metodele de creare a regulilor pentru iptables, în general, rămân neschimbate. Pentru a utiliza opțiunile din module suplimentare, este necesar să specifici clar numele modulului cu opțiunea -m. De exemplu, regula pentru blocarea conexiunilor TCP de intrare pe portul 443 din afara SUA pe toate interfețele:

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

Fișierele create de xt_geoip_build sunt utilizate doar la crearea regulilor, dar nu sunt luate în considerare la filtrare. Prin urmare, pentru a actualiza corect baza de geoip, este necesar să actualizezi mai întâi fișierele iv*- și apoi să recreezi toate regulile care utilizează geoip în iptables.

Concluzie

Filtrarea pachetelor în funcție de apartenența la țări este o strategie oarecum uitată de timp. Cu toate acestea, instrumentele software pentru această filtrare evoluează, iar poate în curând vor apărea în managerii de pachete o nouă versiune xt_geoip cu un nou furnizor de date geoip, ceea ce va simplifica semnificativ viața administratorilor de sistem.

xtables-addons: filtrăm pachetele după țări

Numai utilizatorii înregistrați pot participa la sondaj. Conectați-vă, vă rugăm.

Ați folosit filtrarea pe țări?

  • 59,1%Da13

  • 40,9%Nu9

Au votat 22 de utilizatori. S-au abținut 3 utilizatori.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster