Nginx

동일 IP 중복 요청 제어

·2014년 3월 18일·조회 18,896

어쩌다보니 보안 관련 설정만 올리고 있는 거 같은 느낌이 드네요..

 

동일한 ip에서 여러 요청이 동시에 들어올 경우 nginx에서는 해당 요청을 제한할 수 있습니다.

1. 먼저 들어온 요청이 처리되는 동안 들어오는 요청 수 제한


limit_conn_zone $binary_remote_addr zone=addr:10m; server { location /download/ { limit_conn addr 1; }

 

위와 같이 설정할 경우 /download 로는 동일한 IP에서 1회만 동시에 요청을 보낼 수 있습니다.

이 때의 '동시'는 해당 요청이 서버에서 처리되고 있는 동안을 의미하구요.

 

실제로 테스트 서버에서 사이즈가 큰 파일을 위 값을 1을 주고 요청했을 때, 두번째로 요청한 인터넷 창에서는 모래시계만 실행되는 것을 확인할 수 있었습니다.

이 경우 기본적으로는 503을 return한다고 하는데요. 아래 설정을 이용해서 return code를 지정해 줄 수 있습니다.

limit_conn_status 404;

 

 

2. 요청 처리 비율 지정

 

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    location / {
        limit_req zone=one burst=5;
    }

위 설정은 단일 IP에서 들어오는 요청이 1초에 1회만 처리될 수 있음을 의미합니다. (request/minute도 가능 r/m)

5개 까지는 queue에서 보관하고, 요청이 burst 수를 넘어갈 경우 503 에러를 반환받게 됩니다.

limit_conn과 마찬가지로 에러 코드는 지정할 수 있습니다.

 

테스트 환경에서는 1r/m으로 지정하고 요청하였는데, burst에 할당된 개수까지는 처리가 되고 그 이후부터는 처리가 안되는 모습을 보였습니다.

 

3. ddos 막기

http {
  limit_conn_zone $binary_remote_addr zone=ddos_conn:10m;
  limit_req_zone $binary_remote_addr zone=ddos_req:10m rate=5r/s;

  server {
    limit_conn ddos_conn 10;
    limit_req zone=ddos_req burst=10 nodelay;
  }
}

위 두 가지 옵션을 사용해서 위와 같이 ddos 공격을 막도록 설정할 수 있습니다.

 

위에서 zone의 shared memory size를 모두 10MB로 설정하였는데요.

사이트 규모에 따라 적절한 사이즈는 달라질 수 있을 것 같습니다. 일단 용량이 모자랄 경우 503 에러를 return하게 되고, 로그에 기록이 남는다고 합니다.

댓글 6

로그인 후 댓글을 남길 수 있습니다.

  • 맑· 2014년 3월 18일
    왜 첫번째 예시에만 박스가 둘러졌을까요. .....
  • 몽상가몽상가· 2014년 3월 19일
    요즘 보안이 대세인데 맑님을 통해서 대세에 편승하는 것 같아 좋네요~ 근데 아파치에는 저런 기능이 없는 걸까요 아니면 제가 모르고 있는 걸까요? ^^
  • 맑· 2014년 3월 20일
    아파치에도 유사한 기능이 있다고 합니다. 기본 모듈에 들어있는 기능은 아니구요. 별도 벤더?에서 개발한 것 같습니다. 모듈이름은 mod_limitipconn 입니다. ^^
  • 몽상가몽상가· 2014년 3월 20일
    오늘 아파치 ddos 취약점 관련하여 2.4.9 미만의 버전은 몽땅 업글(실은 재설치 및 재설정) 하라는 권고가 떴던데 카모리님이 말씀하신 걸로 어떻게 안될까나....
  • 열린기술자열린기술자· 2014년 3월 21일
    아파치 ddos 취약점 관련된 버전 업그레이드 권고에 대하여 좀 더 자세히 알 수 있을까요?
  • 몽상가몽상가· 2014년 3월 22일
    osstech님, 댓글이 이제야 봤네요. 관련내용 공유합니다. Apache HTTP Server에 DDos 취약점을 해결한 보안 업데이트를 발표 했으니 2.2.X / 2.0.X 버전을 포함하여 2.4.8 이하의 모든 버전을 2.4.9로 업그레이드 하라고 해서 놀라 호들갑을 떨었는데... 다시 자세히 보니 통상적인 업데이트 권고인 것 같습니다. 추가 내용은 아래 링크 참고하세요. o http://httpd.apache.org/security/vulnerabilities_24.html Fixed in Apache httpd 2.4.9 low: mod_log_config crash CVE-2014-0098 A flaw was found in mod_log_config. A remote attacker could send a specific truncated cookie causing a crash. This crash would only be a denial of service if using a threaded MPM.