xtables-addons: filtrujemy pakiety według krajów

xtables-addons: filtrujemy pakiety według krajów
Zadanie zablokowania ruchu z określonych krajów wydaje się proste, ale pierwsze wrażenie może być mylne. Dziś opowiemy, jak można to zrealizować.

Tło

Wyniki wyszukiwania w Google na ten temat są rozczarowujące: większość rozwiązań jest już przestarzała, a czasami wydaje się, że temat został odłożony na długi czas i zapomniano o nim na zawsze. My jednak "przeszukaliśmy" wiele starych wpisów i jesteśmy gotowi podzielić się nowoczesną wersją instrukcji.

Zalecamy przeczytanie artykułu w całości, zanim wykonasz podane polecenia.

Przygotowanie systemu operacyjnego

Filtracja będzie konfigurowana za pomocą narzędzia iptables, które wymaga rozszerzenia do pracy z danymi GeoIP. Takie rozszerzenie można znaleźć w xtables-addons. xtables-addons instalują rozszerzenia dla iptables w postaci samodzielnych modułów jądra, dzięki czemu nie trzeba rekompilować jądra systemu operacyjnego.

W momencie pisania artykułu aktualna wersja xtables-addons to 3.9. Niemniej jednak, w standardowych repozytoriach Ubuntu 20.04 LTS można znaleźć tylko 3.8, a w repozytoriach Ubuntu 18.04 — 3.0. Aby zainstalować rozszerzenie z menedżera pakietów, można użyć następującej komendy:

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

Zauważmy, że między wersją 3.9 a aktualnym stanem projektu istnieją drobne, ale istotne różnice, o których opowiemy później. Aby skompilować z kodów źródłowych, instalujemy wszystkie potrzebne pakiety:

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

Klona repozytorium:

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

cd xtables-addons-xtables-addons

xtables-addons zawiera wiele rozszerzeń, ale interesuje nas tylko xt_geoip. Jeśli nie chcesz instalować niepotrzebnych rozszerzeń, można je wykluczyć z kompilacji. W tym celu należy edytować plik mconfig. Dla wszystkich pożądanych modułów należy ustawić y, a wszystkie niepotrzebne oznaczyć jako n. Kompilujemy:

./autogen.sh

./configure

make

I instalujemy z uprawnieniami superużytkownika:

make install

Podczas instalacji modułów jądra może wystąpić błąd o treści podobnej do:

INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- Błąd SSL:02001002:system library:fopen:Brak takiego pliku lub katalogu: ../crypto/bio/bss_file.c:72
- Błąd SSL:2006D080:Rutyny BIO:BIO_new_file:brak takiego pliku: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: Brak takiego pliku lub katalogu

Taka sytuacja występuje z powodu niemożności podpisania modułów jądra, ponieważ nie ma czym podpisać. Rozwiązać ten problem można za pomocą kilku poleceń:

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

[ 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

Skompilowany moduł kernela jest zainstalowany, ale system go nie rozpoznaje. Poprośmy system o utworzenie mapy zależności z uwzględnieniem nowego modułu, a następnie go załadujemy:

depmod -a

modprobe xt_geoip

Upewnijmy się, że xt_geoip został załadowany do systemu:

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

Dodatkowo upewnijmy się, że rozszerzenie załadowało się w iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Wszystko nam odpowiada i pozostaje tylko dodać nazwę modułu do /etc/modules, aby moduł działał po ponownym uruchomieniu systemu operacyjnego. Od tego momentu iptables rozumie polecenia geoip, ale brakuje mu danych do działania. Przechodzimy do ładowania bazy danych geoip.

Pobieranie bazy danych GeoIP

Tworzymy katalog, w którym będą przechowywane informacje zrozumiałe dla rozszerzenia iptables:

mkdir /usr/share/xt_geoip

Na początku artykułu wspomnieliśmy, że istnieją różnice pomiędzy wersją ze źródła a wersją z menedżera pakietów. Najbardziej zauważalna różnica dotyczy zmiany dostawcy bazy danych oraz skryptu xt_geoip_dl, który pobiera aktualne dane.

Wersja z menedżera pakietów

Skrypt znajduje się pod ścieżką /usr/lib/xtables-addons, jednak podczas próby uruchomienia można zobaczyć nieco nieinformacyjną wiadomość o błędzie:

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

Wcześniej jako bazę danych stosowano produkt GeoLite, obecnie znany jako GeoLite Legacy, dystrybuowany na licencji Creative Commons ASA 4.0 firmy MaxMind. Z tym produktem miały miejsce dwa wydarzenia, które "zepsuły" kompatybilność z rozszerzeniem dla iptables.

Po pierwsze, w styczniu 2018 roku ogłosili ogłoszono zakończenie wsparcia dla produktu, a drugiego stycznia 2019 roku z oficjalnej strony usunięto wszystkie linki do pobrania starszej wersji bazy. Nowym użytkownikom zaleca się korzystanie z produktu GeoLite2 lub jego płatnej wersji GeoIP2.

Po drugie, od grudnia 2019 roku MaxMind stwierdziła ogłosił istotne zmiany w dostępie do swoich baz. Aby dostosować się do kalifornijskiego prawa o ochronie praw konsumentów, firma MaxMind podjęła decyzję o "przykryciu" dystrybucji GeoLite2 rejestracją.

Ponieważ chcemy skorzystać z ich produktu, zarejestrujemy się na tej stronie.

xtables-addons: filtrujemy pakiety według krajów
Po zarejestrowaniu konta otrzymasz wiadomość e-mail z prośbą o ustawienie hasła. Teraz, gdy mamy konto, musimy stworzyć klucz licencyjny. W panelu użytkownika znajdujemy opcję Moje Klucze Licencyjne, a następnie klikamy przycisk Wygeneruj nowy klucz licencyjny.

Podczas tworzenia klucza zadane zostanie tylko jedno pytanie: czy zamierzamy używać tego klucza w programie GeoIP Update? Odpowiadamy negatywnie i klikamy przycisk Potwierdź. W oknie dialogowym wyświetli się klucz. Zachowaj ten klucz w bezpiecznym miejscu, ponieważ po zamknięciu okna dialogowego nie będziesz mógł zobaczyć klucza w całości.

xtables-addons: filtrujemy pakiety według krajów
Mamy możliwość ręcznego pobierania baz GeoLite2, ale ich format nie jest zgodny z formatem, którego oczekuje skrypt xt_geoip_build. Tutaj pomocne są skrypty GeoLite2xtables. Aby uruchomić skrypty, instalujemy moduł 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

Następnie klonujemy repozytorium ze skryptami i zapisujemy w pliku wcześniej uzyskany klucz licencyjny:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Uruchamiamy skrypty:

# Скачиваем данные 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 nakłada ograniczenie do 2000 pobrań dziennie i przy dużej liczbie serwerów sugeruje buforowanie aktualizacji na serwerze proxy.

Zauważ, że wyjściowy plik musi być nazwany dbip-country-lite.csv. Niestety, 20_convert_geolite2 generuje nieidealny plik. Skrypt xt_geoip_build oczekuje trzech kolumn:

  • początek zakresu adresów;
  • koniec zakresu adresów;
  • kod kraju w iso-3166-alpha2.

A wyjściowy plik zawiera sześć kolumn:

  • początek zakresu adresów (reprezentacja tekstowa);
  • koniec zakresu adresów (reprezentacja tekstowa);
  • początek zakresu adresów (reprezentacja numeryczna);
  • koniec zakresu adresów (reprezentacja numeryczna);
  • kod kraju;
  • nazwa kraju.

To rozbieżność jest krytyczna i może być naprawiona na dwa sposoby:

  1. zmieniając 20_convert_geolite2;
  2. zmieniając xt_geoip_build.

W pierwszym przypadku redukujemy printf do wymaganego formatu, a w drugim — zmieniamy przypisanie zmiennej $cc na $row->[4]. Po tym możemy przystąpić do kompilacji:

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

. . .
 2239 zakresów IPv4 dla ZA
  348 zakresów IPv6 dla ZA
   56 zakresów IPv4 dla ZM
   12 zakresów IPv6 dla ZM
   56 zakresów IPv4 dla ZW
   15 zakresów IPv6 dla ZW

Zauważmy, że autor GeoLite2xtables nie uważa swoich skryptów za gotowe do produkcji i proponuje nadzorować w związku z opracowaniem oryginalnych skryptów xt_geoip_*. Przejdźmy więc do kompilacji z kodów źródłowych, w których te skrypty zostały już zaktualizowane.

Wersja z kodów źródłowych

Podczas instalacji z kodów źródłowych skrypty xt_geoip_* znajdują się w katalogu /usr/local/libexec/xtables-addons. W tej wersji skryptu używana jest baza danych IP to Country Lite. Licencja — Creative Commons Attribution License, a z dostępnych danych te trzy niezbędne kolumny. Pobieramy i budujemy bazę:

cd /usr/share/xt_geoip/

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

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

Po tych czynnościach iptables jest gotowe do działania.

Używamy geoip w iptables

Moduł xt_geoip dodaje zaledwie dwa klucze:

opcje dopasowania geoip:
[!] --src-cc, --source-country country[,country...]
	Dopasuj pakiet pochodzący z (jednego z) określonych krajów
[!] --dst-cc, --destination-country country[,country...]
	Dopasuj pakiet kierowany do (jednego z) określonych krajów

UWAGA: Kraj podawany jest kodem ISO3166.

Metody tworzenia reguł dla iptables, w zasadzie, pozostają bez zmian. Aby użyć kluczy z dodatkowych modułów, należy wyraźnie określić nazwę modułu z kluczem -m. Na przykład, reguła blokująca przychodzące połączenia TCP na porcie 443 z krajów innych niż USA na wszystkich interfejsach:

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

Pliki utworzone przez xt_geoip_build są używane tylko przy tworzeniu reguł, ale nie są brane pod uwagę przy filtracji. W związku z tym, aby poprawnie zaktualizować bazę geoip, należy najpierw zaktualizować pliki iv*, a następnie na nowo stworzyć wszystkie reguły, które wykorzystują geoip w iptables.

Podsumowanie

Filtracja pakietów w zależności od przynależności do krajów to nieco zapomniana strategia. Mimo to, narzędzia programowe do tej filtracji się rozwijają i być może wkrótce w menedżerach pakietów pojawi się nowa wersja xt_geoip z nowym dostawcą danych geoip, co znacznie ułatwi życie administratorom systemów.

xtables-addons: filtrujemy pakiety według krajów

Tylko zarejestrowani użytkownicy mogą brać udział w ankiecie. Zaloguj się, proszę.

Czy kiedykolwiek używałeś filtracji według krajów?

  • 59,1%Tak13

  • 40,9%Nie9

Głosowało 22 użytkowników. Wstrzymało się 3 użytkowników.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster