Jak automatycznie i tymczasowo zablokować adres IP, który powoduje zbyt wiele trafień na serwerze w krótkim czasie?

21

Jeden z moich serwerów LAMP został niedawno wyłączony przez jakiegoś bota skryptowego szukającego exploitów. Wygląda na to, że robił tak wiele żądań na sekundę, że przeciążał pamięć RAM na serwerze i sprowadził całą witrynę na godzinę. To „attacK” pochodziło z jednego adresu IP.

Jak więc mogę automatycznie i tymczasowo zablokować adres IP, który powoduje zbyt wiele trafień na moim serwerze LAMP w krótkim czasie? Jakie jest najlepsze narzędzie do tego zadania i czy powinienem to rozwiązywać na poziomie systemu operacyjnego czy poprzez PHP?

ProgrammerGirl
źródło

Odpowiedzi:

25

Fail2Ban . Złote standardowe / domyślne rozwiązanie tego problemu na platformie Linux.

Beznadziejny
źródło
Ciekawe dzięki. W jaki sposób radzi sobie to z robotami indeksującymi, takimi jak Google, lub na nie wpływają?
ProgrammerGirl
1
@Programmer Zależy od tego, jak skonfigurujesz tę rzecz, ale nie spodziewałbyś się, że przeszukiwacz sieci będzie wprowadzał złe hasła, szukał exploitów lub gromadził wystarczającą liczbę trafień, aby uruchomić dobrze zdefiniowany próg - więc po prostu sprawdź dzienniki, aby dowiedzieć się, w czym zdefiniować progi.
HopelessN00b
5

Powinieneś unikać prób robienia tego z PHP. Zanim PHP się zaangażuje, jest już za późno - pamięć została już przydzielona.

Możesz zablokować adresy IP na dowolnej warstwie, ale najniższym poziomem, który zużywa najmniej zasobów, jest trasa, którą chcesz wybrać. Zazwyczaj jest to zapora ogniowa. Przynajmniej iptables (firewall linux) jest tym, czego chcesz użyć. Istnieją narzędzia, o których wspominali inni, takie jak Fail2Ban, które mogą zautomatyzować to za Ciebie. Zewnętrzna zapora sieciowa byłaby lepsza.

Oprócz próby zakazania obrażania adresów IP, powinieneś spróbować lepiej wykorzystać swoje zasoby. Jeśli żądanie zajmie mniej zasobów, atak będzie trwał dłużej.

Apache wykorzystuje również dużo pamięci. Jeśli używasz mod_php, jest nawet gorzej, ponieważ PHP jest ładowane w każdym procesie potomnym Apache. Oznacza to, że nawet żądania do treści statycznych (css / js / images) ładują PHP, nawet jeśli PHP nie jest używane. Możesz rozwiązać ten problem, używając zamiast tego FastCGI. mod_fcgid to dobra opcja.

Istnieją również inne serwery WWW, które są bardziej zasobooszczędne. Nginx jest moim ulubionym. Jest też Lighttpd. Wiele osób lubi Litespeed (spadek w zamian za Apache).

Jeśli chcesz pozostać przy Apache, zastanów się nad jego optymalizacją. Rozważ wyłączenie .htaccess. Oto dobre wyjaśnienie, dlaczego .

Luke
źródło
2

Aby kontrolować lub blokować ruch HTTP, możesz użyć:

Należy jednak pamiętać, że te narzędzia mogą również blokować / spowalniać roboty internetowe, a tym samym wpływać na SEO.

Społeczność
źródło
2
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

ossec może robić tego typu rzeczy automatycznie i transparentnie na podstawie syslogs.

gmck
źródło
1
Czy możesz dokładnie wyjaśnić, co robi pierwsza linia kodu? Jak również ossec wypada w porównaniu z fail2ban? Dzięki.
ProgrammerGirl
2
To reguła iptables. Wierzę, że liczy się liczba nowych prób nawiązania połączenia i porzuca je po przekroczeniu 4 prób w ciągu 60 sekund. Zachęcam do spojrzenia man iptablesi zobaczenia, co oznacza każda flaga i jak one działają razem.
Łukasz
-3

NoooBS,

--- powódź ---

iptables -N logdrop iptables -A logdrop -m niedawna --set - nazwa czarna lista

iptables -A logdrop -m limit --limit 1 / s --limit-burst 1 -j LOG - przedrostek dziennika „Flood:”

iptables -A logdrop -j DROP

iptables -N ddos ​​iptables -A ddos ​​-m ostatnie --rcheck - nazwa czarna lista - sekundy 300 --hitcount 1 -j logdrop iptables -A ddos ​​-m ostatnie --set - nazwa ponownie iptables -A ddos ​​-m ostatnie --update - nazwa ponownie - sekundy 60 --hitcount 2 -j logdrop iptables -A ddos ​​-j POWRÓT

Igors Gorda
źródło