
Užduotis blokuoti srautą iš tam tikrų šalių atrodo paprasta, tačiau pirmasis įspūdis gali būti apgaulingas. Šiandien mes jums pasakysime, kaip tai galima įgyvendinti.
priešistorė
„Google“ paieškos šia tema rezultatai nuvilia: dauguma sprendimų jau seniai „supuvę“ ir kartais atrodo, kad ši tema amžiams buvo nuleista ir pamiršta. Peržiūrėjome daug senų įrašų ir esame pasirengę pasidalinti modernia instrukcijų versija.
Prieš vykdant šias komandas rekomenduojame perskaityti visą straipsnį.
Operacinės sistemos paruošimas
Filtravimas bus sukonfigūruotas naudojant paslaugų programą iptables, kuriai reikalingas plėtinys, kad jis veiktų su GeoIP duomenimis. Šį plėtinį galima rasti . xtables-addons įdiegia iptables plėtinius kaip nepriklausomus branduolio modulius, todėl nereikia perkompiliuoti OS branduolio.
Rašymo metu dabartinė xtables-addons versija yra 3.9. Tačiau tik 20.04 galima rasti standartinėse Ubuntu 3.8 LTS saugyklose, o 18.04 – Ubuntu 3.0 saugyklose. Plėtinį galite įdiegti iš paketų tvarkyklės naudodami šią komandą:
apt install xtables-addons-common libtext-csv-xs-perlAtkreipkite dėmesį, kad tarp 3.9 versijos ir dabartinės projekto būsenos yra nedideli, bet svarbūs skirtumai, kuriuos aptarsime vėliau. Norėdami sukurti iš šaltinio kodo, įdiekite visus reikiamus paketus:
apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perlKlonuoti saugyklą:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addonsxtables-addons yra daug plėtinių, bet mus domina tik xt_geoip. Jei nenorite vilkti nereikalingų plėtinių į sistemą, galite juos neįtraukti iš kūrimo. Norėdami tai padaryti, turite redaguoti failą mconfig. Įdiekite visus norimus modulius y, ir pažymėkite visus nereikalingus n. Mes renkame:
./autogen.sh./configuremakeIr įdiegti su supervartotojo teisėmis:
make installDiegiant branduolio modulius gali įvykti klaida, panaši į šią:
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 directoryTokia situacija susidaro dėl to, kad neįmanoma pasirašyti branduolio modulių, nes nėra ką pasirašyti. Šią problemą galite išspręsti naudodamiesi keliomis komandomis:
cd /lib/modules/(uname -r)/build/certscat <<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
EOFopenssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pemSukompiliuotas branduolio modulis yra įdiegtas, tačiau sistema jo neaptinka. Paprašykime sistemos sukurti priklausomybės žemėlapį, atsižvelgdami į naująjį modulį, ir įkelkime jį:
depmod -amodprobe xt_geoipĮsitikinkite, kad xt_geoip įkeltas į sistemą:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tablesBe to, įsitikinkite, kad plėtinys įkeltas į iptables:
# cat /proc/net/ip_tables_matches
geoip
icmpDžiaugiamės viskuo ir belieka pridėti modulio pavadinimą / etc / moduliaikad modulis veiktų iš naujo paleidus OS. Nuo šiol iptables supranta geoip komandas, bet neturi pakankamai duomenų darbui. Pradėkime įkelti geoip duomenų bazę.
GeoIP duomenų bazės gavimas
Sukuriame katalogą, kuriame bus saugoma iptables plėtiniui suprantama informacija:
mkdir /usr/share/xt_geoipStraipsnio pradžioje minėjome, kad yra skirtumų tarp versijos iš šaltinio kodo ir versijos iš paketų tvarkyklės. Labiausiai pastebimas skirtumas yra duomenų bazės teikėjo ir scenarijaus pasikeitimas xt_geoip_dl, kuri atsisiunčia naujausius duomenis.
Paketų tvarkyklės versija
Scenarijus yra kelyje /usr/lib/xtables-addons, bet kai bandysite jį paleisti, pamatysite ne itin informatyvią klaidą:
# ./xt_geoip_dl
unzip: cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.Anksčiau „GeoLite“ produktas, dabar žinomas kaip „GeoLite Legacy“, platinamas pagal licenciją, buvo naudojamas kaip duomenų bazė. įmonė . Su šiuo produktu vienu metu įvyko du įvykiai, kurie „nutraukė“ suderinamumą su iptables plėtiniu.
Pirma, 2018 m. sausio mėn apie produkto palaikymo nutraukimą, o 2019 m. sausio 2 d. iš oficialios svetainės buvo pašalintos visos nuorodos į senosios duomenų bazės versijos atsisiuntimą. Naujiems vartotojams rekomenduojama naudoti GeoLite2 produktą arba jo mokamą versiją GeoIPXNUMX.
Antra, nuo 2019 m. gruodžio mėn. MaxMind apie reikšmingą prieigos prie jų duomenų bazių pasikeitimą. Kad atitiktų Kalifornijos vartotojų privatumo įstatymą, „MaxMind“ nusprendė „GeoLite2“ platinimą „uždengti“ registracija.
Kadangi norime naudoti jų gaminį, užsiregistruosime šiame puslapyje.

Tada gausite el. laišką, kuriame bus prašoma nustatyti slaptažodį. Dabar, kai sukūrėme paskyrą, turime sukurti licencijos raktą. Jūsų asmeninėje paskyroje randame prekę Mano licencijos raktai, tada spustelėkite mygtuką Sukurkite naują licencijos raktą.
Kuriant raktą mums bus užduotas tik vienas klausimas: ar naudosime šį raktą GeoIP Update programoje? Atsakome neigiamai ir paspaudžiame mygtuką Patvirtinti. Raktas bus rodomas iššokančiajame lange. Išsaugokite šį raktą saugioje vietoje, nes uždarę iššokantįjį langą nebegalėsite peržiūrėti viso rakto.

Mes turime galimybę rankiniu būdu atsisiųsti GeoLite2 duomenų bazes, tačiau jų formatas nesuderinamas su formatu, kurio tikimasi pagal scenarijų xt_geoip_build. Čia į pagalbą ateina „GeoLite2xtables“ scenarijai. Norėdami paleisti scenarijus, įdiekite NetAddr::IP perl modulį:
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 installTada mes klonuojame saugyklą su scenarijais ir įrašome anksčiau gautą licencijos raktą į failą:
git clone https://github.com/mschmitt/GeoLite2xtables.gitcd GeoLite2xtablesecho YOUR_LICENSE_KEY=’123ertyui123' > geolite2.licensePaleiskite scenarijus:
# Скачиваем данные 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 nustato 2000 atsisiuntimų per dieną limitą ir, esant dideliam serverių skaičiui, siūlo talpyklą saugoti naujinimą tarpiniame serveryje.
Atkreipkite dėmesį, kad išvesties failas turi būti iškviestas dbip-country-lite.csv... Deja, 20_convert_geolite2 nesukuria tobulo failo. Scenarijus xt_geoip_build laukia trys stulpeliai:
- adresų diapazono pradžia;
- adresų diapazono pabaiga;
- šalies kodas iso-3166-alpha2.
Ir išvesties faile yra šeši stulpeliai:
- adresų diapazono pradžia (eilutės atvaizdavimas);
- adresų diapazono pabaiga (eilutės atvaizdavimas);
- adresų diapazono pradžia (skaitinis vaizdavimas);
- adresų diapazono pabaiga (skaitinis vaizdavimas);
- šalies kodas;
- šalies pavadinimas.
Šis neatitikimas yra labai svarbus ir gali būti ištaisytas vienu iš dviejų būdų:
- Redaguoti 20_convert_geolite2;
- Redaguoti xt_geoip_build.
Pirmuoju atveju sumažiname į reikiamą formatą, o antrajame - keičiame priskyrimą kintamajam $cc apie $eilutė->[4]. Po to galite statyti:
/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 ZWAtkreipkite dėmesį, kad autorius nelaiko savo scenarijų paruoštais gamybai ir pasiūlymams originalių xt_geoip_* scenarijų kūrimui. Todėl pereikime prie surinkimo nuo šaltinio kodų, kuriuose šie scenarijai jau buvo atnaujinti.
Šaltinio versija
Diegiant iš šaltinio kodo scenarijus xt_geoip_* yra kataloge /usr/local/libexec/xtables-addons. Ši scenarijaus versija naudoja duomenų bazę . Licencija yra Creative Commons Attribution License, o iš turimų duomenų yra trys labai reikalingi stulpeliai. Atsisiųskite ir surinkite duomenų bazę:
cd /usr/share/xt_geoip//usr/local/libexec/xtables-addons/xt_geoip_dl/usr/local/libexec/xtables-addons/xt_geoip_buildAtlikus šiuos veiksmus, iptables yra paruoštas darbui.
Geoip naudojimas iptables
Modulis xt_geoip prideda tik du raktus:
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.Paprastai iptables taisyklių kūrimo metodai nesikeičia. Norėdami naudoti raktus iš papildomų modulių, turite aiškiai nurodyti modulio pavadinimą mygtuku -m. Pavyzdžiui, taisyklė blokuoti įeinančius TCP ryšius per 443 prievadą, o ne iš JAV visose sąsajose:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROPFailai, sukurti naudojant xt_geoip_build, naudojami tik kuriant taisykles, tačiau į juos neatsižvelgiama filtruojant. Taigi, norėdami teisingai atnaujinti geoip duomenų bazę, pirmiausia turite atnaujinti iv* failus, o tada iš naujo sukurti visas taisykles, kurios naudoja geoip iptables.
išvada
Paketų filtravimas pagal šalis yra laiko šiek tiek pamiršta strategija. Nepaisant to, programinės įrangos įrankiai tokiam filtravimui yra kuriami ir, ko gero, netrukus paketų tvarkytuvėse pasirodys nauja xt_geoip versija su nauju geoip duomenų teikėju, o tai labai supaprastins sistemos administratorių gyvenimą.
Apklausoje gali dalyvauti tik registruoti vartotojai. , Prašau.
Ar kada nors naudojote filtravimą pagal šalį?
59,1%Taip 13
40,9%Nr.9
Balsavo 22 vartotojai. 3 vartotojai susilaikė.
Šaltinis: www.habr.com
