xtables-addons: filtrujeme balíčky podle zemí

xtables-addons: filtrujeme balíčky podle zemí
Úkol blokování provozu z určitých zemí se zdá být jednoduchý, ale první dojem klame. Dnes vám ukážeme, jak to lze realizovat.

Pozadí

Výsledky vyhledávání Google na toto téma jsou zklamáním: většina řešení je dávno „prohnilých“ a někdy se zdá, že bylo toto téma odloženo na dlouhou dobu a navždy zapomenuto. My jsme však „prozkoumali“ mnoho starých záznamů a jsme připraveni sdílet moderní verzi pokynů.

Doporučujeme si přečíst článek celý, než provedete uvedené příkazy.

Příprava operačního systému

Filtrace bude nastavena pomocí nástroje iptables, který vyžaduje rozšíření pro práci s GeoIP daty. Takové rozšíření lze najít v xtables-addons. xtables-addons instaluje rozšíření pro iptables formou samostatných modulů jádra, díky čemuž není třeba překompilovat jádro OS.

K datu psaní článku je aktuální verze xtables-addons — 3.9. Nicméně ve standardních repozitářích Ubuntu 20.04 LTS lze najít pouze 3.8 a v repozitářích Ubuntu 18.04 — 3.0. Nainstalovat rozšíření z balíčkového manažera lze následujícím příkazem:

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

Všimněte si, že mezi verzí 3.9 a aktuálním stavem projektu existují drobné, ale důležité rozdíly, o kterých budeme hovořit později. Pro sestavení z pracovníků kódu nainstalujeme všechny potřebné balíčky:

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

Klódujeme repozitář:

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

cd xtables-addons-xtables-addons

xtables-addons obsahuje mnoho rozšíření, ale nás zajímá pouze xt_geoip. Pokud se vám nechce tahat do systému zbytečná rozšíření, můžete je vyloučit ze sestavy. K tomu je třeba upravit soubor mconfig. Pro všechny požadované moduly nastavte y, a všechny nepotřebné označte n. Sestavujeme:

./autogen.sh

./configure

make

A instalujeme se superuživatelskými právy:

make install

Při instalaci modulů jádra se může objevit chyba přibližně tohoto znění:

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

Taková situace nastává kvůli nemožnosti podepsat moduly jádra, protože není čím podepsat. Tuto problematiku lze vyřešit několika příkazy:

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 = Moduly

[ 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

Sestavený jádrový modul je nainstalován, ale systém ho neidentifikuje. Požádáme systém o vytvoření závislostí se zohledněním nového modulu a poté ho načteme:

depmod -a

modprobe xt_geoip

Ujistíme se, že xt_geoip byl načten do systému:

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

Dále se ujistíme, že rozšíření bylo načteno v iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Všechno nám vyhovuje a zbývá jen přidat název modulu do /etc/modules, aby modul fungoval po restartu OS. Od této chvíle iptables rozumí příkazům geoip, ale chybí mu data k fungování. Přistupujeme k načtení databáze geoip.

Získání databáze GeoIP

Vytvoříme adresář, ve kterém bude uložena informace srozumitelná rozšíření iptables:

mkdir /usr/share/xt_geoip

Na začátku článku jsme zmínili, že mezi verzí z původního kódu a verzí z balíčkového manažera jsou rozdíly. Nejdůležitějším rozdílem je změna poskytovatele databáze a skriptu xt_geoip_dl, který stahuje aktuální data.

Verze z balíčkového manažera

Skript se nachází na cestě /usr/lib/xtables-addons, ale při pokusu o spuštění lze vidět ne zcela informativní chybu:

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

Dříve byla databáze používána produkt GeoLite, nyní známý jako GeoLite Legacy, šířený pod licencí Creative Commons ASA 4.0 firmou MaxMind. S tímto produktem došlo k dvěma událostem, které "rozbily" kompatibilitu s rozšířením pro iptables.

Za prvé, v lednu 2018 oznámili bylo oznámeno ukončení podpory produktu, a druhého ledna 2019 byly z oficiálních stránek odstraněny všechny odkazy na stažení staré verze databáze. Novým uživatelům se doporučuje používat produkt GeoLite2 nebo jeho placenou verzi GeoIP2.

Za druhé, v prosinci 2019 firma MaxMind prohlásila o významné změně v přístupu k jejich databázím. Aby vyhověli kalifornskému zákonu na ochranu práv spotřebitelů, společnost MaxMind se rozhodla "zastavit" distribuci GeoLite2 registrací.

Protože chceme využít jejich produkt, zaregistrujeme se na této stránce.

xtables-addons: filtrujeme balíčky podle zemí
Po vytvoření účtu vám na email přijde zpráva s žádostí o nastavení hesla. Nyní, když jsme si založili účet, je třeba vytvořit licenční klíč. V osobním kabinetu najdeme položku Moje licenční klíče, a poté klikneme na tlačítko Generovat nový licenční klíč.

Při vytváření klíče se nás zeptají pouze na jednu věc: budeme tento klíč používat v programu GeoIP Update? Odpovídáme záporně a klikáme na tlačítko Potvrdit. Vyskakovací okno zobrazí klíč. Uložte tento klíč na bezpečné místo, protože po zavření vyskakovacího okna již nebudete moci klíč znovu zobrazit.

xtables-addons: filtrujeme balíčky podle zemí
Máme možnost stahovat databáze GeoLite2 manuálně, ale jejich formát není kompatibilní s formátem, který očekává skript xt_geoip_build. Zde přicházejí na pomoc skripty GeoLite2xtables. Pro zprovoznění skriptů nainstalujeme 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

Dále klonujeme repozitář se skripty a zapíšeme do souboru dříve získaný licenční klíč:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY='123ertyui123' > geolite2.license

Spustíme skripty:

# Скачиваем данные 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 omezuje počet stažení na 2000 za den a v případě velkého počtu serverů doporučuje kešovat aktualizaci na proxy serveru.

Všimněte si, že výstupní soubor musí mít název dbip-country-lite.csv. Bohužel, 20_convert_geolite2 nevytváří ideální soubor. Skript xt_geoip_build očekává tři sloupce:

  • začátek rozsahu adres;
  • konec rozsahu adres;
  • kód země v iso-3166-alpha2.

Výstupní soubor však obsahuje šest sloupců:

  • začátek rozsahu adres (řetězcová reprezentace);
  • konec rozsahu adres (řetězcová reprezentace);
  • začátek rozsahu adres (číselná reprezentace);
  • konec rozsahu adres (číselná reprezentace);
  • kód země;
  • název země.

Toto nesoulad je kritický a může být opraven jedním ze dvou způsobů:

  1. opravit 20_convert_geolite2;
  2. opravit xt_geoip_build.

V prvním případě zkrátíme printf na požadovaný formát, a ve druhém - změníme přiřazení proměnné $cc na $row->[4]. Poté můžeme provést sestavení:

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

. . .
 2239 IPv4 rozsahů pro ZA
  348 IPv6 rozsahů pro ZA
   56 IPv4 rozsahů pro ZM
   12 IPv6 rozsahů pro ZM
   56 IPv4 rozsahů pro ZW
   15 IPv6 rozsahů pro ZW

Upozorňujeme, že autor GeoLite2xtables není přesvědčen, že jeho skripty jsou připraveny na produkci a doporučuje sledovat vyvíjení originálních skriptů xt_geoip_*. Proto přejdeme ke kompilaci ze zdrojových kódů, ve kterých byly tyto skripty již aktualizovány.

Verze ze zdrojových kódů

Při instalaci ze zdrojových kódů skripty xt_geoip_* se nachází v adresáři /usr/local/libexec/xtables-addons. V této verzi skriptu se používá databáze IP to Country Lite. Licence — Creative Commons Attribution License, a z dostupných dat jsou ty tři potřebné sloupce. Stáhněte a sestavte databázi:

cd /usr/share/xt_geoip/

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

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

Po těchto krocích je iptables připraven k práci.

Používáme geoip v iptables

Modul xt_geoip přidává pouze dvě volby:

geoip match options:
[!] --src-cc, --source-country country[,country...]
	Zápas s paketem přicházejícím z (jedné z) určených zemí
[!] --dst-cc, --destination-country country[,country...]
	Zápas s paketem směřujícím do (jedné z) určených zemí

POZNÁMKA: Země je zadána pomocí jejího ISO3166 kódu.

Způsoby vytváření pravidel pro iptables zůstávají v zásadě nezměněny. Pro použití voleb z přídavných modulů je nutné jasně určit název modulu s volbou -m. Například pravidlo pro blokaci příchozích TCP spojení na portu 443 nepocházejících z USA na všech rozhraních:

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

Soubor vytvořený xt_geoip_build se používá pouze při vytváření pravidel, ale není zohledněn při filtrování. Takže pro správnou aktualizaci databáze geoip je nejprve nutné aktualizovat iv*-soubory a poté znovu vytvořit všechna pravidla, která používají geoip v iptables.

Závěr

Filtrování paketů dle zemí je několik let opomíjená strategie. Přesto programové prostředky pro takové filtrování se vyvíjejí a možná brzy se v balíčkových manažerech objeví nová verze xt_geoip s novým poskytovatelem geoip dat, což výrazně usnadní život systémovým administrátorům.

xtables-addons: filtrujeme balíčky podle zemí

Pouze registrovaní uživatelé se mohou účastnit ankety. Přihlaste se, prosím.

Použili jste někdy filtrování podle zemí?

  • 59,1%Ano13

  • 40,9%Ne9

Hlasovalo 22 uživatelů. Zdrželo se 3 uživatelů.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster