Zablokuj Chiny za pomocą iptables

10

Właśnie zalogowałem się na serwerze GitLab i zauważyłem, że od czasu ostatniego sprawdzania serwera 18.974 nie udało się zalogować - prawie 5 dni. Sprawdziłem IP i wydaje się, że prawie wszystkie były z Chin i próbowałem uzyskać dostęp za pomocą SSH i Brute Force. Zacząłem blokować niektóre IP, ale potem zdałem sobie sprawę, że to ogromna strata czasu i lepszym pomysłem byłoby zablokowanie całego kraju.

Czy mogę zablokować WSZYSTKIE Chiny lub inny kraj za pomocą iptables?

Znalazłem kilka artykułów w Internecie, ale prawie wszystkie z nich to skrypty bash. Jestem nowicjuszem w Linuksie, więc tak naprawdę nie rozumiem wszystkich tych skryptów. Uważam, że iptables są naprawdę interesujące i chcę dowiedzieć się więcej na ten temat.

Jakieś pomysły ? Dziękuję Ci!

Caranfil Alegzandru
źródło
4
Ten sam problem rozwiązałem w inny sposób. Zaostrzyłem SSH na serwerze GitLab mojego klienta, wyłączając uwierzytelnianie oparte na hasłach i wyzwaniach oraz zezwalając tylko na logowanie przy użyciu kluczy SSL. Może to zadziałałoby w twojej sytuacji? Blokowanie zakresów adresów IP może zmniejszyć „szum”, ale nie zapewni rzeczywistej ochrony przed brutalnym wymuszaniem.
blendenzo,
jak dotąd nie działało. serwer gitlab wciąż działa i miałem 0 włamań. Dostęp do Ssh odbywa się tylko za pomocą kluczy ssh, a ja wyłączyłem logowanie roota. Po prostu tak bardzo chcę się nauczyć iptables ...
Caranfil Alegzandru
1
Możesz także przełączyć ssh na inny niż domyślny port w routerze. To zmniejszyło moje próby ataku bota ssh z setek dziennie na zero.
Marmur organiczny

Odpowiedzi:

7

Używając iptables do automatycznej identyfikacji, a następnie blokowania, złych facetów za ssh można zrobić za pomocą recentmodułu. Następujący segment musi znajdować się poESTABLISHED,RELATED linii ogólnej :

...
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
...
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

Teraz ostatnim (ostatnim rokiem lub dwoma) problemem związanym z Chinami jest to, że stały się bardzo sprytne i bardzo często po zablokowaniu jednego adresu IP po prostu przełączają się na inny w tej samej podsieci i kontynuują. Grozi to ryzykiem wyczerpania ostatnich pozycji w tabeli (domyślnie 200). Monitoruję to, a następnie sprawdzam rzeczywisty segment IP i trwale blokuję cały segment. W moim przypadku nie obchodzi mnie uszkodzenie dodatkowe, tj. Zablokowanie kogoś niewinnego:

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
...

Gdzie w powyższym:

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

Możesz uzyskać całą listę adresów IP dla Chin lub dowolnego kraju w formacie iptables lub innym tutaj . Lista jest jednak zaskakująco długa i dość dynamiczna. Sam postanowiłem nie blokować całej listy.

Doug Smythies
źródło
To ^! To może być najlepsza odpowiedź, jaką kiedykolwiek otrzymałem. To może być głupie pytanie, ale myślę, że wszystkie te zasady są zapisane w skrypcie bash, prawda? Nadal mam problemy ze zrozumieniem iptables, ale wydaje mi się to fascynujące.
Caranfil Alegzandru
Tak, używam skryptu bash. Niektóre i ja również użyłem bezpośredniej metody przywracania iptables, którą można szybciej załadować. Zmieniłem, ponieważ do tego samego skryptu dołączam niektóre polecenia inne niż iptables.
Doug Smythies
12

Blok Chin przy użyciu ipset

Nie możesz ręcznie dodać kilku tysięcy adresów IP do swoich iptables, a nawet robienie tego automatycznie jest złym pomysłem, ponieważ może powodować duże obciążenie procesora (a przynajmniej tak czytałem). Zamiast tego możemy użyć ipset, który jest przeznaczony do tego rodzaju rzeczy. ipset obsługuje duże listy adresów ip; po prostu utwórz listę, a następnie powiedz iptables, aby używała tej listy w regule.

Uwaga; Zakładam, że całość poniższych czynności jest wykonywana jako root. Dostosuj odpowiednio, jeśli twój system jest oparty na sudo.

apt-get install ipset

Następnie napisałem mały skrypt Bash, aby wykonać całą pracę, którą powinieneś być w stanie zrozumieć na podstawie zawartych w nim komentarzy. Utwórz plik:

nano /etc/block-china.sh

Oto, co chcesz wkleić w to:

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules

Zapisz plik. Spraw, by był wykonywalny:

chmod +x /etc/block-china.sh

To jeszcze nic nie zrobiło, ale za chwilę uruchomimy skrypt. Najpierw musimy dodać regułę do iptables, która odnosi się do tej nowej listy ipset, którą definiuje powyższy skrypt:

nano /etc/iptables.firewall.rules

Dodaj następujący wiersz:

-A INPUT -p tcp -m set --match-set china src -j DROP

Zapisz plik. Dla jasności moje pełne iptables.firewall.rules wygląda teraz tak:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

W tej chwili nic się nie zmieniło na serwerze, ponieważ nie zastosowano żadnych nowych reguł; w tym celu uruchom skrypt block-china.sh:

/etc/block-china.sh

Powinno to pokazać dane wyjściowe, ponieważ pobiera świeżą listę adresów IP opartych na Chinach, a następnie po kilku sekundach zakończy się i spowoduje powrót do wiersza polecenia.

Aby sprawdzić, czy zadziałało, uruchom:

iptables -L

Powinieneś zobaczyć nową regułę blokującą Chiny - wynik powinien wyglądać następująco:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             match-set china src
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Prawie skończone! Działa to i będzie nadal działać przy ponownym rozruchu. Ale adresy IP ulegają zmianie i lista ta z czasem staje się nieaktualna. Jeśli chcesz pobrać i zastosować zaktualizowaną listę adresów IP, możesz ponownie uruchomić skrypt block-china.sh.

Możemy również ustawić maszynę tak, aby robiła to automatycznie za pomocą zadania cron:

crontab -e

Dodaj linię taką jak ta:

* 5 * * * /etc/block-china.sh

Spowoduje to uruchomienie /etc/block-china.sh o 5 rano każdego dnia. Użytkownik uruchamiający skrypt musi być rootem lub mieć uprawnienia roota.

źródło

Surjit Sidhu
źródło
Po co ograniczać go tylko do protokołu TCP? Wydaje się, że działa bez określania protokołu. Zaproponuj użycie nowszych zagregowanych list, ponieważ są one znacznie krótsze:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies,
Nic tu nie przywraca ipset po ponownym uruchomieniu.
Doug Smythies,
4

Możesz zainstalować coś takiego, jak fail2ban, aby blokował ips przy próbie zalogowania się na serwerze i nie powiódł się.

Kyle H.
źródło
Mógłbym również użyć zapory csf i zablokować każdy kraj, który chcę z plików konfiguracyjnych. Chodzi o to, że naprawdę chcę korzystać z iptables, aby dowiedzieć się więcej na ten temat.
Caranfil Alegzandru
Musisz dowiedzieć się, jakie kraje mają przypisane im bloki adresów IP, aby dowiedzieć się, kogo zablokować. Nie jestem jednak pewien, czy byłoby to bardzo dokładne, czy nie. Możesz użyć iptables -L, aby wyświetlić bieżące reguły iptables, iptables-save, aby pokazać, jakie polecenia zostały uruchomione, aby utworzyć wspomniane reguły, a następnie zaprojektować własne reguły i przetestować na testowych maszynach, aby się o tym dowiedzieć. Tak się nauczyłem.
Kyle H
0

Możesz użyć modułu geoip dla iptables: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

Kiedy nasz system zostanie zaktualizowany i zależności zostaną zainstalowane, teraz zainstalujemy dodatki xtables na naszym komputerze. Aby to zrobić, pobierzemy najnowszy plik archiwalny z oficjalnej strony projektu xtables-addons za pomocą wget. Po pobraniu wyodrębnimy archiwum, a następnie skompilujemy i zainstalujemy na naszym komputerze.

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

Następnie uruchomimy moduł o nazwie xt_geoip, który jest dostarczany z rozszerzeniem xtables-addons, które pobiera bazę danych GeoIP z MaxMind i konwertuje ją do postaci binarnej rozpoznawanej przez xt_geoip. Po pobraniu zbudujemy go i przeniesiemy na wymaganą xt_geoipścieżkę, tj /usr/share/xt_geoip.

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

Oto podstawowa składnia używania iptables z modułem geoip w celu blokowania ruchu pochodzącego lub kierowanego do kraju. Tutaj musimy użyć dwuliterowego kodu ISO3166 zamiast kraju, np. USA dla Stanów Zjednoczonych, IE dla Irlandii, IN dla Indii, CN dla Chin i tak dalej.

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]
Markus Lenger
źródło
0

Użyć do IP2Location List Firewall wygenerować iptables dla Chin.

Plik ma następujący format. Uruchom go w powłoce i powinieneś blokować wszystkie chińskie adresy IP.

iptables -A INPUT -s 8.8.8.8/24 -j DROP
Michael C.
źródło