Apache로 속도 제한을 어떻게 구현할 수 있습니까? (초당 요청)


84

Apache에서 강력한 속도 제한 (requests | bytes / ip / unit time)을 구현하는 데 사용할 수있는 기술 및 / 또는 모듈은 무엇입니까?


Red Hat 6에는 Apache 2.2 만 있기 때문에 웹 서버에서 Linux의 tc 를 사용하고 있습니다.
ceving

답변:


55

최고

나머지


10
IP 주소로 일일 연결을 제한 할 수있는 것이 없습니다. 밤새도록 수색을했는데 안타깝 네요.
Greg

1
역방향 프록시 뒤에서 실행될 때 IP 대신 헤더를보기 위해 mod_evasive를 얻는 방법이 있는지 아는 사람이 있습니까?
Stavros Korokithakis 2010

6
4 년 후에도 mod_evasive는 여전히 "최고"입니까?
Zac Thompson

6
귀하의 주장을 뒷받침하십시오. _evasive 및 _cband가 최고인 이유는 무엇입니까?
리드

4
mod_evasive많은 온라인 추천을 받고 있지만, 2017 년 중반에 자신의 블로그에서 이상하게도 모든 참조를 삭제 한 작성자 인 Jonathan Zdziarski에 의해 포기 된 것으로 보입니다 . 소스 코드는 여전히 업로드 로 사용할 수 있습니다 . 다른 프로젝트는 지난 6 년 (또는의 경우 15 년) 동안 업데이트되지 않았습니다 mod_limitipconn.
Anthony Geoghegan

19

이 블로그 게시물 에서 언급했듯이 mod_security 를 사용 하여 초당 속도 제한을 구현하는 것이 가능해 보입니다 .

구성은 다음과 같습니다.

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"

3
이것은 modsec2가 이미 실행중인 저에게 완벽했습니다. 다음과 같이 modsec 버전과 일치하도록 규칙에 ID를 추가해야합니다. <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"phase : 2, pass, setvar : ip.somepathcounter = + 1, nolog, id : 10000004 "헤더는 항상 Retry-After"10 "을 설정합니다. env = RATELIMITED </ LocationMatch>
Nathan Stretch

2
또한 "@gt 60"을 편집하여 허용되는 초기 버스트 요청 수를 변경할 수 있으며 ip.somepathcounter = 1 / 1 비트를 편집하여 제한을 "재충전"하는 속도를 변경할 수 있습니다. 1/1은 초당 하나의 추가 요청을 허용합니다. 1/2은 2 초마다 하나의 추가 요청을 허용합니다.
Nathan Stretch

3
Apache 2.4는 ErrorDocument의 509에 대해 불평 할 것이며 옵션은 429로 변경합니다 (물론 Apache 2.2에서는 지원되지 않음). 또한 모든 SecAction 및 SecRule-s에는 mod_security 2.7부터 ID가 필요합니다.
Mrten

1
참고 mod_security로 Apache 프로젝트가 아닙니다.
Christopher Schultz

12

웹 애플리케이션 방화벽을 포함한 다양한 방법이 있지만 Apache 모드를 사용하는 경우 구현하기 가장 쉬운 방법입니다.

제가 추천하고 싶은 모드 중 하나는 mod_qos 입니다. certin DOS, Bruteforce 및 Slowloris 유형 공격에 대해 매우 효과적인 무료 모듈입니다. 이렇게하면 서버로드가 상당히 완화됩니다.

그것은 매우 강력 합니다.

mod_qos 모듈 의 현재 릴리스는 다음 을 관리하기위한 제어 메커니즘을 구현합니다.

  • 위치 / 리소스 (URL) 또는 가상 호스트에 대한 최대 동시 요청 수입니다.

  • URL에 대한 초당 최대 허용 요청 수 또는 다운로드 된 초당 최대 / 최소 KB와 같은 대역폭의 제한.

  • 초당 요청 이벤트 수를 제한합니다 (특수 요청 조건).

  • 정의 된 기간 내에 요청 이벤트 수를 제한합니다.
  • 또한 제한없이 또는 제한없이 웹 서버에 액세스 할 수있는 매우 중요한 사람 (VIP)을 감지 할 수 있습니다.
  • 무단 작업을 거부하는 일반 요청 라인 및 헤더 필터.

  • 본문 데이터 제한 및 필터링을 요청합니다 (mod_parp 필요).

  • 개별 클라이언트 (IP)에 대한 요청 이벤트 수를 제한합니다.

  • TCP 연결 수준에 대한 제한 (예 : 단일 IP 소스 주소 또는 동적 연결 유지 제어에서 허용되는 최대 연결 수).

  • 서버에 사용 가능한 TCP 연결이 부족할 때 알려진 IP 주소를 선호합니다.

이것은 당신이 그것을 사용할 수있는 샘플 구성입니다. 요구 사항에 맞는 수백 가지 구성이 가능합니다. 컨트롤에 대한 자세한 정보는 사이트를 방문하십시오.

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/


이것은 apache2.4 +에서 작동하지 않는 오래된 apache2.2에서만 작동합니다.
infiniteloop

@infiniteloop mod_quos sourceforge 페이지는 apache2.4에서 잘 작동한다고 말합니다. 그러나 여기에서 작동하지 않는 기능의 몇 가지에 대한 구체적인 논의가 : stackoverflow.com/a/15726540/1402498
JamesHoux

6

Apache 2.4에는 mod_ratelimit 라는 새로운 스톡 모듈이 있습니다 . 모뎀 속도를 에뮬레이션하려면 mod_dialup 을 사용할 수 있습니다 . 왜 모든 것에 mod_ratelimit를 사용할 수 없었는지 모르겠습니다.


mod_dialup은 SUSPENDED대기시 스레드를 낭비하지 않고 비동기 상태를 사용하는 반면, 현재 mod_ratelimit는 엄격하게 연결 당 스레드입니다. cf. thread.gmane.org/gmane.comp.apache.cvs/20490
ArtemGr

6

슬프게도 mod_evasive프리 포크가 아닌 구성에서 사용할 때 예상대로 작동하지 않습니다 (최근 아파치 설정은 주로 MPM 임).



1

속도 제한을 원하는 이유에 따라 다릅니다.

서버 과부하로부터 보호하려면 실제로 NGINX를 앞에 놓고 거기에 속도 제한을 구성 하는 것이 좋습니다. NGINX는 1 만 연결 당 몇 MB 정도의 리소스를 훨씬 적게 사용하기 때문에 이치에 맞습니다. 따라서 서버가 플러드되면 NGINX는 속도 제한 (미미한 양의 리소스 사용)을 수행하고 허용 된 트래픽 만 Apache로 전달합니다.

당신이 추구하는 것이 단순하다면 mod_evasive와 같은 것을 사용하십시오.

평소처럼 DDoS 또는 DoS 공격으로부터 보호하려면 속도 제한이있는 Cloudflare와 같은 서비스를 사용하세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.