Jak mogę zaimplementować ograniczanie szybkości w Apache? (żądania na sekundę)

84

Jakie techniki i / lub moduły są dostępne do implementacji solidnego ograniczania szybkości (żądania | bajty / ip / czas jednostki) w Apache?

bd808
źródło
Używam tc Linuksa na serwerze WWW, ponieważ Red Hat 6 ma tylko Apache 2.2.
ceving

Odpowiedzi:

55

Najlepsze

i reszta

Vinko Vrsalovic
źródło
10
Nie mogłem znaleźć niczego, co ograniczałoby połączenia dziennie według adresu IP. Spędziłem całą noc szukając, a szkoda.
Greg,
1
Czy ktoś wie, czy istnieje sposób, aby mod_evasive spojrzał na nagłówek zamiast adresu IP, gdy działa za odwrotnym proxy?
Stavros Korokithakis
6
Czy 4 lata później mod_evasive nadal jest „najlepszy”?
Zac Thompson,
6
Utwórz kopię zapasową swojego roszczenia. Dlaczego _evasive i _cband są najlepsze?
Reed
4
mod_evasivedostaje wiele rekomendacji online, ale od połowy 2017 roku wydaje się, że został porzucony przez jego autora, Jonathana Zdziarskiego, który dziwnie usunął wszystkie odniesienia do niego ze swojego bloga - chociaż kod źródłowy jest nadal dostępny jako upload . Żaden z pozostałych projektów nie był aktualizowany w ciągu ostatnich 6 lat (lub 15 lat w przypadku mod_limitipconn).
Anthony Geoghegan,
19

Jak stwierdzono w tym poście na blogu , wydaje się, że możliwe jest użycie mod_security do wprowadzenia ograniczenia szybkości na sekundę.

Konfiguracja wygląda mniej więcej tak:

SecRuleEngine On

<LocationMatch "^/somepath">
  SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog
  SecAction "phase:5,deprecatevar:ip.somepathcounter=1/1,pass,nolog"
  SecRule IP:SOMEPATHCOUNTER "@gt 60" "phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog"
  SecAction "phase:2,pass,setvar:ip.somepathcounter=+1,nolog"
  Header always set Retry-After "10" env=RATELIMITED
</LocationMatch>

ErrorDocument 509 "Rate Limit Exceeded"
Diego Fernández Durán
źródło
3
To było dla mnie idealne, ponieważ modsec2 już działał. Wystarczyło dodać identyfikatory do reguł, aby pasowały do ​​wersji modsec, na przykład: <LocationMatch "^ / somepath"> SecAction initcol: ip =% {REMOTE_ADDR}, pass, nolog, id: 10000001 SecAction "phase: 5, deprecatevar: ip.somepathcounter = 1/1, pass, nolog, id: 10000002 "SecRule IP: SOMEPATHCOUNTER" @gt 60 "" phase: 2, pause: 300, deny, status: 509, setenv: RATELIMITED, skip: 1, nolog, id: 10000003 "SecAction" faza: 2, pass, setvar: ip.somepathcounter = + 1, nolog, id: 10000004 "Nagłówek zawsze ustawiany Ponów po" 10 "env = RATELIMITED </LocationMatch>
Nathan Stretch
2
Zauważ również, że możesz zmienić liczbę dozwolonych początkowych żądań serii, edytując parametr „@gt 60”, a także szybkość „doładowywania” limitu, edytując wartość ip.somepathcounter = 1/1 bit. 1/1 umożliwia jedno dodatkowe żądanie na sekundę. 1/2 pozwala na jedno dodatkowe żądanie co 2 sekundy itd.
Nathan Stretch,
3
Apache 2.4 będzie narzekał na 509 w ErrorDocument, opcja zmienia go na 429 (co oczywiście nie jest obsługiwane w Apache 2.2). Ponadto wszystkie SecAction i SecRule-s wymagają identyfikatora od mod_security 2.7.
Mrten,
1
FYI mod_securitynie jest projektem Apache.
Christopher Schultz
12

Istnieje wiele sposobów włączenia zapór sieciowych aplikacji internetowych, ale najłatwiej jest zaimplementować, jeśli używasz mod Apache.

Jednym z takich modów, które lubię polecać, jest mod_qos . Jest to darmowy moduł, który jest bardzo skuteczny przeciwko pewnym atakom typu DOS, Bruteforce i Slowloris. Spowoduje to znaczne zmniejszenie obciążenia serwera.

Jest bardzo potężny .

Obecna wersja modułu mod_qos implementuje mechanizmy kontrolne do zarządzania:

  • Maksymalna liczba jednoczesnych żądań do lokalizacji / zasobu (adresu URL) lub hosta wirtualnego.

  • Ograniczenie przepustowości, takie jak maksymalna dozwolona liczba żądań na sekundę do adresu URL lub maksymalna / minimalna liczba pobieranych bajtów na sekundę.

  • Ogranicza liczbę zdarzeń żądań na sekundę (specjalne warunki żądania).

  • Ogranicza liczbę zdarzeń żądań w określonym przedziale czasu.
  • Może również wykryć bardzo ważne osoby (VIP), które mogą uzyskać dostęp do serwera WWW bez lub z mniejszymi ograniczeniami.
  • Ogólny wiersz żądania i filtr nagłówka uniemożliwiający nieautoryzowane operacje.

  • Zażądaj ograniczenia i filtrowania danych ciała (wymaga mod_parp).

  • Ogranicza liczbę zdarzeń żądań dla klientów indywidualnych (IP).

  • Ograniczenia na poziomie połączenia TCP, np. Maksymalna liczba dozwolonych połączeń z pojedynczego adresu źródłowego IP lub dynamiczna kontrola utrzymywania aktywności.

  • Preferuje znane adresy IP, gdy na serwerze zabraknie wolnych połączeń TCP.

To jest przykładowa konfiguracja tego, do czego możesz jej użyć. Istnieją setki możliwych konfiguracji dostosowanych do Twoich potrzeb. Odwiedź witrynę, aby uzyskać więcej informacji o sterowaniu.

Sample configuration:
# minimum request rate (bytes/sec at request reading):
QS_SrvRequestRate                                 120

# limits the connections for this virtual host:
QS_SrvMaxConn                                     800

# allows keep-alive support till the server reaches 600 connections:
QS_SrvMaxConnClose                                600

# allows max 50 connections from a single ip address:
QS_SrvMaxConnPerIP                                 50

# disables connection restrictions for certain clients:
QS_SrvMaxConnExcludeIP                    172.18.3.32
QS_SrvMaxConnExcludeIP                    192.168.10.

http://opensource.adnovum.ch/mod_qos/

Panama Jack
źródło
ten działa tylko w starym Apache2.2 nie działa w Apache2.4 +, prawda?
infiniteloop
@infiniteloop strona mod_quos sourceforge mówi, że działa dobrze z apache2.4. Istnieje jednak szczegółowa dyskusja na temat kilku funkcji, które tutaj nie działają: stackoverflow.com/a/15726540/1402498
JamesHoux,
6

W Apache 2.4 jest nowy moduł magazynowy o nazwie mod_ratelimit . Aby emulować prędkości modemu, możesz użyć mod_dialup . Chociaż nie rozumiem, dlaczego po prostu nie możesz użyć mod_ratelimit do wszystkiego.

Janus Troelsen
źródło
Zauważ, że mod_dialup używa SUSPENDEDstanu asynchronicznego , nie marnując wątków na oczekiwanie, podczas gdy mod_ratelimit, od teraz, jest ściśle związany z wątkiem na połączenie. por. thread.gmane.org/gmane.comp.apache.cvs/20490
ArtemGr
6

Niestety, mod_evasivenie działa zgodnie z oczekiwaniami, gdy jest używany w konfiguracjach innych niż prefork (ostatnie konfiguracje Apache to głównie MPM)

wuzer
źródło
1

Zależy od tego, dlaczego chcesz ocenić limit.

Jeśli ma to zabezpieczyć się przed przeciążeniem serwera, warto postawić przed nim NGINX i skonfigurować tam ograniczenie szybkości . Ma to sens, ponieważ NGINX zużywa znacznie mniej zasobów, około kilku MB na dziesięć tysięcy połączeń. Tak więc, jeśli serwer zostanie zalany, NGINX wykona ograniczenie szybkości (używając niewielkiej ilości zasobów) i przekaże tylko dozwolony ruch do Apache.

Jeśli wszystko, czego szukasz, to prostota, użyj czegoś takiego jak mod_evasive.

Jak zwykle, jeśli ma to chronić przed atakami DDoS lub DoS, użyj usługi takiej jak Cloudflare, która również ma ograniczanie szybkości.

NerdOfLinux
źródło