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
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
Po pierwsze, w styczniu 2018 r
Po drugie, od grudnia 2019 r. MaxMind
Ponieważ chcemy korzystać z ich produktu, zarejestrujemy się na tej stronie.
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.
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:
- edytować 20_convert_geolit2;
- edytować xt_geoip_build.
W pierwszym przypadku zmniejszamy
/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
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
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.
W ankiecie mogą brać udział tylko zarejestrowani użytkownicy.
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