Apache: Ogranicz liczbę żądań / ruchu na adres IP?

12

Chciałbym zezwolić tylko jednemu adresowi IP na wykorzystanie do, powiedzmy 1 GB, ruchu dziennie, a jeśli limit ten zostanie przekroczony, wszystkie żądania z tego adresu IP zostaną odrzucone do następnego dnia. Wystarczyłoby jednak prostsze rozwiązanie, w którym połączenie jest przerywane po określonej liczbie żądań.

Czy jest już jakiś moduł, który może to zrobić? A może mogę to osiągnąć za pomocą czegoś takiego jak iptables?

Dzięki


źródło
Wersja Apache?
pehrs
2.2 - Wypełnienie limitu postaci

Odpowiedzi:

5

Jeśli potrzebujesz czystego rozwiązania Apache bw_mod dla Apache 2.0 i mod_bandwidth dla Apache 1.3. Mogą zmniejszyć przepustowość serwera, aby ograniczyć wykorzystanie przepustowości.

Istnieje również mod_limitipconn, który uniemożliwia jednemu użytkownikowi nawiązywanie wielu połączeń z serwerem. mod_cband to kolejna opcja, ale nigdy jej nie użyłem.

Jeśli nie chcesz zadzierać z instalacją Apache, możesz umieścić serwer proxy kałamarnicy przed Apache. Daje to większą kontrolę również nad ograniczeniem przepustowości.

Jednak w większości przypadków problemem jest kilka dużych obiektów, gdy chcesz ograniczyć przepustowość na IP i chcesz przekazać rozsądny komunikat o błędzie, gdy użytkownik pobiera zbyt dużo danych i blokujesz go. W takim przypadku może być łatwiej napisać skrypt PHP i przechowywać informacje o dostępie w tymczasowej tabeli w bazie danych.

pehrs
źródło
2
Dziękuję za sugestie. Zajrzałem już do bw_mod i mod_limitipconn, ale żadne (o ile wiem) nie robi tego, co chcę. mod_limitipconn po prostu ogranicza je do jednego połączenia na raz, a bw_mod pozwala mi ograniczyć szybkość pobierania na adres IP. Chcę je zablokować po określonej ilości transferu danych / żądań. Próbuję się bronić przed niektórymi użytkownikami, którzy czują potrzebę indeksowania całej witryny i pobrania wszystkiego. Zajrzę do proxy kałamarnicy, brzmi interesująco. Jeśli to nie zadziała, myślę, że skorzystam z modyfikacji źródła bw_mod.
Czy ustawiłeś plik robots.txt, aby nie pozwalał pająkom?
pehrs
1
Problem z plikiem robots.txt polega na tym, że (podobnie jak RFC 3514) szanują go tylko ładne roboty.
Scott Pack
To prawda, ale przekonasz się, że większość osób spidujących twoją stronę korzysta ze standardowych narzędzi. I wielu z nich, jak wget, szanuje plik robots.txt. Robots.txt to także poprawny sposób informowania użytkowników, że nie chcą, aby się pająkowali.
pehrs
1
Próbowałem tego. Na początku wystarczył plik robots.txt, a następnie powiedzieli Wget, aby zignorował plik robots.txt, więc postanowiłem zablokować „nierozpoznane” programy klienckie, ale potem sfałszowali agenta użytkownika. Mają tendencję do wysyłania wielu żądań głównych, podczas gdy uzasadnione przeglądarki tego nie robią, więc mogę rozważyć ograniczenie żądań głównych lub całkowite ich wyłączenie (mniej pożądane).
5

To jest moje rozwiązanie iptables dla tego rodzaju problemów. Dostosuj --seconds --hitcountwedług potrzeb, także tabelę iptables.

iptables -A FORWARD -m state --state NEW -m recent --rcheck --seconds 600 --hitcount 5 --name ATACK --rsource -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -d 192.168.0.113/32 -o eth1 -p tcp -m tcp --dport 80 -m recent --set --name ATACK --rsource -j ACCEPT

Wyjaśnione:

  1. iptablessprawdź, czy źródłowy adres IP jest wymieniony w pliku / proc / net / ipt_recent / ATACK przez 5 lub więcej razy w odstępie 600 sekund i czy jest to NOWE żądanie. Jeśli tak, zrób odrzucenie; jeszcze

  2. iptables sprawdź, czy żądanie jest kierowane do portu 80. Jeśli tak, wydrukuj adres IP i znacznik czasu do / proc / net / ipt_recent / ATACK i przekaż pakiet.

Działa dobrze dla moich potrzeb.

Gustavo Feijo
źródło
3

Czy spojrzałeś na narzędzie takie jak fail2ban? Może to być dla ciebie trochę trudne, ale pozwoli ci to ograniczyć liczbę żądań, które są dozwolone dla danego adresu IP. Działa, patrząc na dzienniki, a Ty ustalasz reguły dotyczące liczby naruszeń w danym czasie, więc dla Ciebie mogą to być żądania dziennie. Gdy przejdą dalej, może to zrobić np. Zablokować je za pomocą ipchains.

Użyłem go do bardzo skutecznego blokowania ataków DDoS na serwer pocztowy. Może jednak zużywać znaczną ilość mocy procesora.

Peter Bagnall
źródło
obecnie; zamierzam sam to zaimplementować. Mam nadzieję, że to
zadziała
1

spróbuj mod_dosevasivelubmod_security

mod_dosevasive można skonfigurować tak, aby zablokował adres IP po określonej liczbie lub żądaniach strony do witryny w określonych ramach czasowych.

prophet.six
źródło