
Naloga blokiranja prometa iz določenih držav se zdi preprosta, a prvi vtis vara. Danes bomo razložili, kako to lahko uresničimo.
Pozadina
Rezultati iskanja v Googlu na to temo so razočarajoči: večina rešitev je že zdavnaj 'pokvarjena' in včasih se zdi, da so to temo odložili v predal ter pozabili nanjo. Mi pa smo 'preiskali' številne stare zapise in pripravljeni smo deliti sodobno različico navodil.
Priporočamo, da preberete članek do konca, preden izvedete zastavljene ukaze.
Priprava operacijskega sistema
Filtriranje se bo nastavljalo s pomočjo orodja iptables, za katerega je potrebno razširitev za delo z GeoIP podatki. Tako razširitev lahko najdete v . xtables-addons namestitvi razširitve za iptables v obliki samostojnih modulov jedra, kar pomeni, da ni potrebno ponovno sestavljati jedra operacijskega sistema.
Ob času pisanja članka je aktualna različica xtables-addons - 3.9. Vendar pa lahko v standardnih repozitorijih Ubuntu 20.04 LTS najdete samo 3.8, v repozitorijih Ubuntu 18.04 pa 3.0. Namestite razširitev iz upravljalnika paketov z naslednjim ukazom:
apt install xtables-addons-common libtext-csv-xs-perlOmeniti je treba, da obstajajo majhne, vendar pomembne razlike med različico 3.9 in trenutnim stanjem projekta, o katerih bomo govorili kasneje. Za sestavo iz izvorne kode namestite vse potrebne pakete:
apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perlKloniramo repozitorij:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addonsxtables-addons vsebuje številne razširitve, a nas zanima samo xt_geoip. Če nočete v sistem prenašati nepotrebnih razširitev, jih lahko izključite iz sestave. Za to morate urediti datoteko mconfig. Za vse želene module postavite y, vse nepotrebne pa označite n. Zberemo:
./autogen.sh./configuremakeIn namestimo s pravicami superuporabnika:
make installMed namestitvijo modulov jedra se lahko pojavijo napake v približno takšni vsebini:
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 directoryTakšna situacija nastane zaradi nemožnosti podpisovanja modulov jedra, ker ni česar za podpisovanje. To težavo lahko rešimo z nekaj ukazi:
cd /lib/modules/(uname -r)/build/certscat < x509.genkey[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts
[ req_distinguished_name ]
CN = Moduli
[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOFopenssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pemKompajliran modul jedra je nameščen, vendar ga sistem ne prepozna. Prosim sistem, naj ustvari zemljevid odvisnosti ob upoštevanju novega modula, nato ga naložimo:
depmod -amodprobe xt_geoipPreverimo, ali je xt_geoip naložen v sistem:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tablesDodatno preverimo, ali je razširitev naložena v iptables:
# cat /proc/net/ip_tables_matches
geoip
icmpVse nam ustreza in ostane le še, da vpišemo ime modula v /etc/modules, da bo modul deloval po ponovnem zagonu OS. Od tega trenutka iptables razume ukaze geoip, a mu manjkajo podatki za delovanje. Pričnimo z nalaganjem geoip baze podatkov.
Pridobivanje baze podatkov GeoIP
Ustvarimo imenik, v katerem bo shranjena informacija, razumljiva iptables razširitvi:
mkdir /usr/share/xt_geoipNa začetku članka smo omenili, da so razlike med različico iz izvorne kode in različico iz upravitelja paketov. Najopaznejša razlika je v spremembi dobavitelja baze podatkov in skripti xt_geoip_dl, ki prenaša aktualne podatke.
Različica iz upravitelja paketov
Skript se nahaja na poti /usr/lib/xtables-addons, vendar ob poskusu zažiga lahko vidite dokaj neinformativen error:
# ./xt_geoip_dl
unzip: cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.Prej je kot zbirka podatkov uporabljal izdelek GeoLite, sedaj znan kot GeoLite Legacy, distribucijski pod licenco podjetja . S tem izdelkom sta se zgodili dve stvari, ki sta "pokvarili" združljivost z iptables razširitvijo.
Prvič, januarja 2018 o prenehanju podpore izdelku, in drugega januarja 2019 so s uradne strani odstranili vse povezave za prenos stare različice baze. Novim uporabnikom priporočamo, da uporabljajo izdelek GeoLite2 ali njegovo plačljivo različico GeoIP2.
Drugič, od decembra 2019 je MaxMind o pomembni spremembi v dostopu do njihovih zbirk. Da bi ustregli zakonu o zaščiti potrošniških pravic v Kaliforniji, je podjetje MaxMind sprejelo odločitev, da "zapre" distribucijo GeoLite2 s registracijo.
Ker želimo koristiti njihov izdelek, registrirali se bomo na tej strani.

Po registraciji bomo na e-pošto prejeli sporočilo s prošnjo za nastavitev gesla. Zdaj, ko imamo ustvarjen račun, moramo ustvariti licenčni ključ. V svojem računu najdemo točko My License Keys, nato pa pritisnemo na gumb Generate new License Key.
Pri ustvarjanju ključa bomo dobili samo eno vprašanje: ali bomo ta ključ uporabljali v programu GeoIP Update? Odgovorimo negativno in pritisnemo gumb Confirm. V pojavnem oknu bo prikazan ključ. Shrani ta ključ na varno mesto, saj ga po zaprtju pojavnega okna ne bomo mogli več videti v celoti.

Imamo možnost ročnega prenosa baz GeoLite2, vendar njihov format ni združljiv s formatom, ki ga pričakuje skript xt_geoip_build. Tu na pomoč priskočijo skripti GeoLite2xtables. Za delovanje skriptov namestimo perl-modul NetAddr::IP:
wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gztar xvf NetAddr-IP-4.079.tar.gzcd NetAddr-IP-4.079perl Makefile.PLmakemake installNato kloniramo repozitorij s skripti in v datoteko zapišemo prej pridobljen licenčni ključ:
git clone https://github.com/mschmitt/GeoLite2xtables.gitcd GeoLite2xtablesecho YOUR_LICENSE_KEY=’123ertyui123' > geolite2.licenseZagnamo skripte:
# Скачиваем данные 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.csvMaxMind uvaja omejitev 2000 prenosov na dan in ob večjem številu strežnikov predlaga, da se posodobitve predpomnijo na proxy strežniku.
Upoštevajte, da se mora izhodna datoteka nujno imenovati dbip-country-lite.csv. Na žalost, 20_convert_geolite2 ne zagotavlja popolne datoteke. Skript xt_geoip_build pričakuje tri stolpce:
- začetek obsega naslovov;
- konec obsega naslovov;
- koda države v iso-3166-alpha2.
Izhodna datoteka vsebuje šest stolpcev:
- začetek obsega naslovov (nizovna predstavitev);
- konec obsega naslovov (nizovna predstavitev);
- začetek obsega naslovov (številska predstavitev);
- konec obsega naslovov (številska predstavitev);
- koda države;
- ime države.
To neskladje je kritično in ga je mogoče odpraviti na dva načina:
- urejanje 20_convert_geolite2;
- urejanje xt_geoip_build.
V prvem primeru skrajšamo na potreben format, v drugem pa spremenimo dodelitev spremenljivki $cc na $row->[4]. Po tem lahko začnemo sestavljanje:
/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip. . .
2239 IPv4 obsegov za ZA
348 IPv6 obsegov za ZA
56 IPv4 obsegov za ZM
12 IPv6 obsegov za ZM
56 IPv4 obsegov za ZW
15 IPv6 obsegov za ZWOpomba, da avtor ne smatra svojih skript za pripravljene za produkcijo in predlaga za razvojem originalnih skript xt_geoip_*. Zato pređimo na sastavljanje iz izvornog koda, u kojem su te skripte već ažurirane.
Verzija iz izvornog koda
Prilikom instalacije iz izvornog koda skripte xt_geoip_* nalaze se u direktorijumu /usr/local/libexec/xtables-addons. U ovoj verziji skripte se koristi baza podataka . Licenca — Creative Commons Attribution License, a od dostupnih podataka su potrebna tri stuba. Preuzimamo i sastavljamo bazu:
cd /usr/share/xt_geoip//usr/local/libexec/xtables-addons/xt_geoip_dl/usr/local/libexec/xtables-addons/xt_geoip_buildNakon ovih koraka, iptables je spreman za rad.
Koristimo geoip u iptables
Modul xt_geoip dodaje samo dve opcije:
geoip match options:
[!] --src-cc, --source-country country[,country...]
Podudara se sa paketom koji dolazi iz (jedne od) navedenih država
[!] --dst-cc, --destination-country country[,country...]
Podudara se sa paketom koji ide u (jednu od) navedenih država
NAPOMENA: Država se unosi svojim ISO3166 kodom.Načini formiranja pravila za iptables, u suštini, ostaju nepromenjeni. Za korišćenje opcija iz dodatnih modula, potrebno je izričito navesti naziv modula sa opcijom -m. Na primer, pravilo za blokiranje dolaznih TCP konekcija na portu 443 ne iz SAD-a na svim interfejsima:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROPFajlovi koje kreira xt_geoip_build koriste se samo prilikom kreiranja pravila, ali se ne uzimaju u obzir prilikom filtriranja. Tako, za ispravno ažuriranje geoip baze, prvo je potrebno ažurirati iv*-fajlove, a zatim ponovo kreirati sva pravila koja koriste geoip u iptables.
Zaključek
Filtracija paketa u zavisnosti od pripadnosti državama — pomalo zaboravljena strategija. Ipak, softverski alati za takvu filtraciju se razvijaju i, moguće, će se u skoroj budućnosti u paketnim menadžerima pojaviti nova verzija xt_geoip sa novim dobavljačem geoip podataka, što će značajno olakšati život sistemskim administratorima.
Samo registrovani korisnici mogu učestvovati u anketi. , molim vas.
Da li ste ikada koristili filtraciju po državama?
59,1%Da13
40,9%Ne9
Glasalo je 22 korisnika. Uzdržalo se 3 korisnika.
Izvor: habr.com
