Geoblokada Chin na podstawie skryptu SystemZ

Tagi: #<Tag:0x00007f8df51406d8> #<Tag:0x00007f8df5140610>

W tym króciutkim poradniku zaprezentuję jak zainstalować skrypt blokujący połączenia od przyjaciół z Dalekiego Wschodu autorstwa @SystemZ.

Dla uproszczenia wszystkie polecenia wykonujemy z ROOTa.

Poradnik zakłada minimum samodzielnego rozumowania.
Może kolidować z obecnym firewallem.

1. Pobieramy zależności

Musimy zainstalować ipset.
Jeśli działamy systemie debianopodobnym:

# apt-get install ipset

W innym wypadku musimy sobie sami poradzić. (Nie powinno być to trudne)

2. Pobieramy skrypt

# wget -O - https://gist.githubusercontent.com/SystemZ/0d599505069b5a01f227/raw > /usr/local/bin/banhammer-china

3. Ustawiamy uprawnienia

chmod 755 /usr/local/bin/banhammer-china

4. Instalujemy usługę systemd

# wget -O https://gist.githubusercontent.com/Lumpiasty/0574157fe79f17a6f337c107982297ab/raw > /etc/systemd/system/banhammer-china.service

5. Przeładowujemy systemd

# systemctl daemon-reload

6-. Startujemy usługę

# systemctl enable --now banhammer-china.service

Cieszymy się spokojem

To tyle! Od teraz boty z Chin nie powinny “zawracać gitary” naszemu serwerowi Minecrafta, TSa czy CS:GO. Zwracając uwagę na to, że mało naszych rodaków znajduje się za chińską zaporą (a ci co tam są i tak korzystają z VPNów), mało prawdopodobne jest, że komukolwiek zaszkodzimy. Tymczasem bardziej dociekliwych zapraszam do lektury:

Poradnik małego hakera

Jeśli interesuje Cię co znajduje się w tajemniczych plikach, które kazałem Ci zainstalować, ta sekcja jest dla Ciebie. Objaśnię tutaj:

  • Jak to działa
  • Jak dodać własną listę
  • Jak zamienić czarną listę (blokowanie konkretnych krajów) na białą listę (dopuszczenie tylko konkretnych krajów)

Jak to działa

W punkcie 2. pobraliśmy tajemny skrypt, który wykonuje całą magię. Objaśnijmy go trochę.

#!/bin/bash

Jak widzimy jest to najprostszy skrypt w Bashu. Język to nie temat poradnika, zainteresowanych odsyłam do wyszukiwarki.

#add kernel module
modprobe -v ip_set
modprobe -v ip_set_hash_netport
#create list for IPs
ipset create geoblock hash:net

Ładujemy moduły ip_set (do tego potrzebujemy właśnie ipset instalowanego w pierwszym punkcie) i tworzymy listę geoblock zawierającą blokowane adresy.


#Sorry China, too much attacks and spam from you, please be careful and responsive to abuses next time :(
for IP in $(wget -O - http://ipdeny.com/ipblocks/data/countries/cn.zone)
do
  sudo ipset add geoblock $IP
done

#Think about adding more countries like ru,vn,ng
#https://en.wikipedia.org/wiki/ISO_3166-2

Dodajemy do stworzonej odrobinę wyżej listy adresy z listy ipdeny.com

iptables -I INPUT -m set --set geoblock src -j DROP

Dodajemy utworoną listę geoblock do naszej zapory iptables.

Gdzie zatem dodać więcej?

Załóżmy, że na serwerze trzymamy memy z Vladimirem Putinem. Zatem nie chcemy, aby Rosjanie je zobaczyli, ponieważ zapewne spróbują obalić nasz mały serwerek. Więc gdzie zablokować połączenia z Rosji? Mamy nawet małą podpowiedź:

#Think about adding more countries like ru,vn,ng
#https://en.wikipedia.org/wiki/ISO_3166-2

Wprowadźmy więc przeróbkę:


#Sorry China, too much attacks and spam from you, please be careful and responsive to abuses next time :(
for IP in $(wget -O - http://ipdeny.com/ipblocks/data/countries/cn.zone)
do
  sudo ipset add geoblock $IP
done

#I dont want any Russian to see my memes
for IP in $(wget -O - http://ipdeny.com/ipblocks/data/countries/ru.zone)
do
  sudo ipset add geoblock $IP
done

#Think about adding more countries like vn,ng
#https://en.wikipedia.org/wiki/ISO_3166-2

Jak widzisz, skopiowaliśmy pętlę i zmieniliśmy kod kraju z cn - Chiny na ru - Rosję.
Takie to proste!

Więc co, jeśli chcemy, dodać własną czarną listę?
Sprawdźmy co się kryje pod tajemną listą adresów, którą wprowadzamy do ipset
Spróbuj

$ wget -O - http://ipdeny.com/ipblocks/data/countries/cn.zone | less

Jak możesz zauważyć otrzymujemy adresy sieci w notacji CIDR.

Przykładowe dane

1.1.0.0/24
1.1.2.0/23
1.1.4.0/22
1.1.8.0/24
1.1.9.0/24

Jak to działa i dlaczgo jest tak zapisywane to nie jest temat poradnika, zapraszam do samodzielnej lektury.

Stwórzmy swoją listę!

Zapiszmy więc identyczną listę wypełnioną naszymi danymi gdzieś na serwerze.
Utwórzmy plik /etc/banhammer
Przykładowa zawartośc:

192.168.0.1/32
192.168.0.2/31
192.168.0.4/30
192.168.0.8/31
192.168.0.10/32

Dla ułatwienia życia możesz się wspomóc kalkulatorem.

Dodajmy więc naszą nową listę do skryptu blokującego

#My cool custom friends list 
for IP in $(cat /etc/banhammer)
do
  sudo ipset add geoblock $IP
done

Jak możesz zauważyć jedyna różnica to, że zamiast pobierać listę z internetu wczytujemy ją z naszego pliku.

Gotowe!

Whitelista

Dzięki @aggankx za pomysł

Powyższe sposoby na zabezpieczenie serwera przed botami z Chin czy Rosji oraz wybranymi szkodnikami najczęściej w zupełności wystarczą. Jednak czasami zdarzają się przypadki, gdzie zniszczyć nasz serwer próbują boty z mniej (USA, Meksyk) lub bardziej egzotycznych krajów (Republika Konga czy Mozambik). Rozwiązaniem może być wpuszczenie na serwer tylko wąskiej, określonej liczby krajów.

Zacznij od zmiany list na kraje i zakresy, z których chcesz się móc łączyć.
Tutaj musisz być znacznie ostrożniejszy bo jeśli zapomnisz czegoś, możesz sam siebie zablokować :wink:

Podmieniamy

iptables -I INPUT -m set --set geoblock src -j DROP

na

iptables -N countryfilter
iptables -A INPUT -j countryfilter
iptables -A countryfilter -m set --set geoblock src -j RETURN
iptables -A countryfilter -j DROP

Wszystko fajnie, tylko jak to właściwie działa? Objaśnijmy sobie:

iptables -N countryfilter

Tworzymy tabelę countryfilter

iptables -A INPUT -j countryfilter

Wpuszczamy cały ruch z INPUT do tabeli countryfilter

iptables -A countryfilter -m set --set geoblock src -j RETURN

Dodajemy do tabeli countryfilter filtr wyrzucający pakiety z tabeli

iptables -A countryfilter -j DROP

Odrzucamy, nie odpowiadamy

Jeśli wygląda to skomplikowanie, przygotowałem małą wizualizację:

Ale…

Whitelista jest jednak odpowiedzialną rzeczą. Oprócz zablokowania naszych użytkowników czy siebie samego możesz się pozbawić również dostępu do wewnętrznych usług. Jak temu zaradzić?

Co warto dodać?

  • Zakresy lokalne
192.168.0.0/16
176.16.0.0/12
10.0.0.0/8
  • Zakres pętli zwrotnej
127.0.0.0/8
  • Serwery DNS
  • Serwery, do których łączą się zainstalowane aplikacje, np. serwer minecraft, teamspeak, albo chociażby serwer ipdeny.com
  • Jeśli mamy stały to swój adres IP (na wypadek jakby lista od ipdeny.com uznała, że zmieniliśmy kraj)
  • Monitoring hostingu, np od OVH

Pobranie list lokalnie

Przy zabawie z listami możesz napotkać problem, gdy skrypt nie chce pobrać list blokujących. W wypadku blacklisty po prostu serwer nie będzie nic blokował, jednak przy whiteliście zablokujemy wszystko czego ręcznie nie wpisaliśmy. Powodem może być, że przy uruchamianiu systemu, serwer mógł się nie połączyć jeszcze z siecią (albo, z jakiegoś powodu ipdeny.com przestanie działać).
Rozwiązać ten problem możemy pobierając listy na nasz serwer.
Wadą takiego rozwiązania będzie to, że listy nie będą się same aktualizowały (Chociaż i to można zautomatyzować)

Zacznijmy od utworzenia folderu, gdzie będziemy przechowywać nasze listy.

mkdir /etc/banhammer.d

Teraz pobierzmy wszystkie listy do tego folderu:

wget -P /etc/banhammer.d/ http://ipdeny.com/ipblocks/data/countries/pl.zone

(Podmień kod kraju z pl)

Zaletą posiadania list lokalnie jest to, że możemy znacznie skrócić nasz skrypt. Zamiast dodawać każdy kraj oddzielnie możemy jedną regułką dodać wszystkie kraje.

Usuń wszystkie listy ze skryptu, a zamiast nich dodaj jeden blok:
na

for IP in $(cat /etc/banhammer /etc/banhammer.d/*.zone)
do
  sudo ipset add geoblock $IP
done

Kilka słów o Dockerze

Jeśli korzystasz z aplikacji w Dockerze (jak np. panel Pterodactyl), możesz zauważyć, że skrypt po prostu nie działa (tzn. nic nie blokuje). Winą jest to, że Docker nie korzysta z domyślnych tabel w iptables, a zamiast tego ma swoją. Musimy więc się po prostu do niej dopisać. Jeśli korzystasz z czarnej listy, na koniec skryptu dodaj:

iptables -I DOCKER-USER -m set --set geoblock src -j DROP

Jeśli korzystasz z białej listy:

iptables -I DOCKER-USER -j countryfilter

Usługa

W 3. punkcie pobieraliśmy plik z usługą systemd.
Uruchamia ona automatycznie skrypt przy włączaniu serwera.
Nie widzę tutaj głębszego sensu hackowania czegokolwiek poza bardzo specyficznymi konfiguracjami.
Objaśnienia całej zawartości znajdują się w manualu systemd.service.

Poradnik miesiąca: listopad 2019

9lajków