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ć ;)
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
.