xtables-addons: filtruj pakiety według kraju

xtables-addons: filtruj pakiety według kraju
Zadanie blokowania ruchu z niektórych krajów wydaje się proste, jednak pierwsze wrażenie może być mylące. Dziś powiemy Ci, jak można to wdrożyć.

prehistoria

Wyniki wyszukiwania Google na ten temat są rozczarowujące: większość rozwiązań od dawna jest „zepsuta” i czasami wydaje się, że temat ten został odłożony na półkę i zapomniany na zawsze. Przeszukaliśmy wiele starych zapisów i jesteśmy gotowi udostępnić nowoczesną wersję instrukcji.

Zalecamy przeczytanie całego artykułu przed wykonaniem tych poleceń.

Przygotowanie systemu operacyjnego

Filtrowanie zostanie skonfigurowane za pomocą narzędzia iptables, który wymaga rozszerzenia do pracy z danymi GeoIP. To rozszerzenie można znaleźć w dodatki xtables. xtables-addons instaluje rozszerzenia dla iptables jako niezależne moduły jądra, więc nie ma potrzeby ponownej kompilacji jądra systemu operacyjnego.

W chwili pisania tego tekstu aktualna wersja xtables-addons to 3.9. Jednak tylko wersję 20.04 można znaleźć w standardowych repozytoriach Ubuntu 3.8 LTS, a wersję 18.04 w repozytoriach Ubuntu 3.0. Możesz zainstalować rozszerzenie z menedżera pakietów za pomocą następującego polecenia:

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

Należy pamiętać, że istnieją małe, ale istotne różnice pomiędzy wersją 3.9 a obecnym stanem projektu, które omówimy później. Aby zbudować z kodu źródłowego, zainstaluj wszystkie niezbędne pakiety:

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

Sklonuj 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 nas interesują tylko xt_geoip. Jeśli nie chcesz przeciągać niepotrzebnych rozszerzeń do systemu, możesz wykluczyć je z kompilacji. Aby to zrobić, musisz edytować plik mkonfiguracja. Dla wszystkich żądanych modułów zainstaluj yi zaznacz wszystkie niepotrzebne n. Zbieramy:

./autogen.sh

./configure

make

I zainstaluj z uprawnieniami administratora:

make install

Podczas instalacji modułów jądra może wystąpić błąd podobny do następującego:

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

Sytuacja ta wynika z braku możliwości podpisania modułów jądra, ponieważ nic do podpisania. Możesz rozwiązać ten problem za pomocą kilku poleceń:

cd /lib/modules/(uname -r)/build/certs

cat <<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
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ł jądra jest zainstalowany, ale system go nie wykrywa. Poprośmy system o utworzenie mapy zależności uwzględniającej nowy moduł, a następnie załadujmy ją:

depmod -a

modprobe xt_geoip

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

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

Dodatkowo upewnij się, że rozszerzenie jest załadowane do iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Jesteśmy ze wszystkiego zadowoleni i pozostaje tylko dodać nazwę modułu / etc / modulestak, aby moduł działał po ponownym uruchomieniu systemu operacyjnego. Od tej chwili iptables rozumie polecenia geoip, ale nie ma wystarczającej ilości danych do pracy. Zacznijmy ładować bazę 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ą z kodu źródłowego a wersją z menedżera pakietów. Najbardziej zauważalną różnicą jest zmiana dostawcy bazy danych i skryptu xt_geoip_dl, który pobiera najnowsze dane.

Wersja menedżera pakietów

Skrypt znajduje się w ścieżce /usr/lib/xtables-addons, ale przy próbie jego uruchomienia pojawi się niezbyt informacyjny błąd:

# ./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 baza danych wykorzystywany był produkt GeoLite, obecnie znany jako GeoLite Legacy, dystrybuowany na licencji Creative Commons ASA 4.0 spółka MaxMind. Z tym produktem wydarzyły się jednocześnie dwa zdarzenia, które „zerwały” kompatybilność z rozszerzeniem iptables.

Po pierwsze, w styczniu 2018 r ogłosił o zakończeniu wsparcia dla produktu, a z dniem 2019 stycznia 2 roku z oficjalnej strony internetowej usunięto wszystkie linki umożliwiające pobranie starej wersji bazy danych. Nowym użytkownikom zaleca się korzystanie z produktu GeoLite2 lub jego płatnej wersji GeoIPXNUMX.

Po drugie, od grudnia 2019 r. MaxMind oświadczył o istotnej zmianie w dostępie do swoich baz danych. Aby zachować zgodność z kalifornijską ustawą o ochronie prywatności konsumentów, firma MaxMind zdecydowała się „objąć” dystrybucję GeoLite2 rejestracją.

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

xtables-addons: filtruj pakiety według kraju
Następnie otrzymasz wiadomość e-mail z prośbą o ustawienie hasła. Teraz, gdy utworzyliśmy konto, musimy utworzyć klucz licencyjny. Na Twoim koncie osobistym znajdziemy przedmiot Moje klucze licencyjne, a następnie kliknij przycisk Wygeneruj nowy klucz licencyjny.

Podczas tworzenia klucza zostanie nam zadane tylko jedno pytanie: czy będziemy używać tego klucza w programie GeoIP Update? Odpowiadamy negatywnie i wciskamy przycisk Potwierdzać. Klucz zostanie wyświetlony w wyskakującym oknie. Zapisz ten klucz w bezpiecznym miejscu, ponieważ po zamknięciu wyskakującego okna nie będziesz już mógł zobaczyć całego klucza.

xtables-addons: filtruj pakiety według kraju
Mamy możliwość ręcznego pobierania baz danych GeoLite2, jednak ich format nie jest zgodny z formatem oczekiwanym przez skrypt xt_geoip_build. Tutaj na ratunek przychodzą skrypty GeoLite2xtables. Aby uruchamiać skrypty, zainstaluj moduł NetAddr::IP perl:

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 uzyskany wcześniej klucz licencyjny zapisujemy do pliku:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Uruchommy 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 limit 2000 pobrań dziennie i przy dużej liczbie serwerów oferuje buforowanie aktualizacji na serwerze proxy.

Należy pamiętać, że plik wyjściowy musi zostać wywołany dbip-country-lite.csv... Niestety, 20_convert_geolit2 nie tworzy idealnego pliku. Scenariusz xt_geoip_build oczekuje trzech kolumn:

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

Plik wyjściowy zawiera sześć kolumn:

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

Ta rozbieżność jest krytyczna i można ją skorygować na jeden z dwóch sposobów:

  1. edytować 20_convert_geolit2;
  2. edytować xt_geoip_build.

W pierwszym przypadku zmniejszamy printf do wymaganego formatu, a w drugim - zmieniamy przypisanie do zmiennej $cc na $wiersz->[4]. Następnie możesz zbudować:

/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 ZW

Zauważ, że autor Tabele GeoLite2x nie uważa swoich scenariuszy za gotowe do produkcji i ofert tor do tworzenia oryginalnych skryptów xt_geoip_*. Przejdźmy zatem do montażu z kodów źródłowych, w których te skrypty zostały już zaktualizowane.

Wersja źródłowa

Podczas instalacji ze skryptów kodu źródłowego xt_geoip_* znajdują się w katalogu /usr/local/libexec/xtables-addons. Ta wersja skryptu korzysta z bazy danych IP do kraju Lite. Licencja to Creative Commons Uznanie autorstwa i z dostępnych danych wynikają bardzo potrzebne trzy kolumny. Pobierz i zmontuj bazę danych:

cd /usr/share/xt_geoip/

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

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

Po wykonaniu tych kroków iptables jest gotowy do pracy.

Używanie geoip w iptables

Moduł xt_geoip dodaje tylko dwa klucze:

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.

Ogólnie rzecz biorąc, metody tworzenia reguł dla iptables pozostają niezmienione. Aby użyć kluczy z dodatkowych modułów, należy jawnie określić nazwę modułu za pomocą przełącznika -m. Przykładowo reguła blokująca przychodzące połączenia TCP na porcie 443 nie z 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 wykorzystywane są jedynie przy tworzeniu reguł, ale nie są brane pod uwagę przy filtrowaniu. Zatem, aby poprawnie zaktualizować bazę danych geoip, należy najpierw zaktualizować pliki iv*, a następnie odtworzyć wszystkie reguły korzystające z geoip w iptables.

wniosek

Filtrowanie pakietów na podstawie krajów to strategia nieco zapomniana przez czas. Mimo to opracowywane są narzędzia programowe do takiego filtrowania i być może wkrótce w menedżerach pakietów pojawi się nowa wersja xt_geoip z nowym dostawcą danych geoip, co znacznie uprości życie administratorom systemu.

xtables-addons: filtruj pakiety według kraju

W ankiecie mogą brać udział tylko zarejestrowani użytkownicy. Zaloguj się, Proszę.

Czy kiedykolwiek korzystałeś z filtrowania według kraju?

  • 59,1%Tak13

  • 40,9%Nie9

Głosowało 22 użytkowników. 3 użytkowników wstrzymało się od głosu.

Źródło: www.habr.com

Dodaj komentarz