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 ipsetW 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-china3. Ustawiamy uprawnienia
# chmod 755 /usr/local/bin/banhammer-china4. Instalujemy usługę systemd
# wget -O - https://gist.githubusercontent.com/Lumpiasty/0574157fe79f17a6f337c107982297ab/raw > /etc/systemd/system/banhammer-china.service5. Przeładowujemy systemd
# systemctl daemon-reload6-. Startujemy usługę
# systemctl enable --now banhammer-china.serviceCieszymy 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/bashJak 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-2Dodajemy do stworzonej odrobinę wyżej listy adresy z listy ipdeny.com
iptables -I INPUT -m set --set geoblock src -j DROPDodajemy 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-2Wprowadź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-2Jak 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 | lessJak 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/24Jak 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
doneJak 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ć ;)
Podmieniamy
iptables -I INPUT -m set --set geoblock src -j DROPna
iptables -N countryfilter
iptables -A INPUT -j countryfilter
iptables -A countryfilter -m set --set geoblock src -j RETURN
iptables -A countryfilter -j DROPWszystko fajnie, tylko jak to właściwie działa? Objaśnijmy sobie:
iptables -N countryfilterTworzymy tabelę countryfilter
iptables -A INPUT -j countryfilterWpuszczamy cały ruch z INPUT do tabeli countryfilter
iptables -A countryfilter -m set --set geoblock src -j RETURNDodajemy do tabeli countryfilter filtr wyrzucający pakiety z tabeli
iptables -A countryfilter -j DROPOdrzucamy, 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.comuznał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.dTeraz 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
doneKilka 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 DROPJeśli korzystasz z białej listy:
iptables -I DOCKER-USER -j countryfilterUsł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