xtables-addons: filtriramo pakete po državah

xtables-addons: filtriramo pakete po državah
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. 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-perl

Omeniti 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-perl

Kloniramo repozitorij:

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

cd xtables-addons-xtables-addons

xtables-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

./configure

make

In namestimo s pravicami superuporabnika:

make install

Med 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 directory

Takš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/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 = Moduli

[ 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

Kompajliran 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 -a

modprobe xt_geoip

Preverimo, ali je xt_geoip naložen v sistem:

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

Dodatno preverimo, ali je razširitev naložena v iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Vse 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_geoip

Na 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 Creative Commons ASA 4.0 podjetja MaxMind. S tem izdelkom sta se zgodili dve stvari, ki sta "pokvarili" združljivost z iptables razširitvijo.

Prvič, januarja 2018 so napovedali 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 izjavila 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.

xtables-addons: filtriramo pakete po državah
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.

xtables-addons: filtriramo pakete po državah
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.gz

tar xvf NetAddr-IP-4.079.tar.gz

cd NetAddr-IP-4.079

perl Makefile.PL

make

make install

Nato kloniramo repozitorij s skripti in v datoteko zapišemo prej pridobljen licenčni ključ:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Zagnamo 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.csv

MaxMind 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:

  1. urejanje 20_convert_geolite2;
  2. urejanje xt_geoip_build.

V prvem primeru skrajšamo printf 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 ZW

Opomba, da avtor GeoLite2xtables ne smatra svojih skript za pripravljene za produkcijo in predlaga slediti 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 IP to Country Lite. 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_build

Nakon 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 DROP

Fajlovi 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.

xtables-addons: filtriramo pakete po državah

Samo registrovani korisnici mogu učestvovati u anketi. Prijavite se, 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

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster