
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 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-perlZauważ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-perlKlona repozytorium:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addonsxtables-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./configuremakeI instalujemy z uprawnieniami superużytkownika:
make installPodczas 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 kataloguTaka 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/certscat < 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.pemSkompilowany 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 -amodprobe xt_geoipUpewnijmy się, że xt_geoip został załadowany do systemu:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tablesDodatkowo upewnijmy się, że rozszerzenie załadowało się w iptables:
# cat /proc/net/ip_tables_matches
geoip
icmpWszystko 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_geoipNa 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 firmy . Z tym produktem miały miejsce dwa wydarzenia, które "zepsuły" kompatybilność z rozszerzeniem dla iptables.
Po pierwsze, w styczniu 2018 roku 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 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.

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.

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.gztar xvf NetAddr-IP-4.079.tar.gzcd NetAddr-IP-4.079perl Makefile.PLmakemake installNastępnie klonujemy repozytorium ze skryptami i zapisujemy w pliku wcześniej uzyskany klucz licencyjny:
git clone https://github.com/mschmitt/GeoLite2xtables.gitcd GeoLite2xtablesecho YOUR_LICENSE_KEY=’123ertyui123' > geolite2.licenseUruchamiamy 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.csvMaxMind 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:
- zmieniając 20_convert_geolite2;
- zmieniając xt_geoip_build.
W pierwszym przypadku redukujemy 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 ZWZauważmy, że autor nie uważa swoich skryptów za gotowe do produkcji i proponuje 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 . 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_buildPo 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 DROPPliki 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.
Tylko zarejestrowani użytkownicy mogą brać udział w ankiecie. , 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
