nginx ddos 방지 설정 방법

Nginx에서 rate limiting(속도 제한)을 설정하는 것은 서버에 대한 과도한 요청을 방지하고, 서비스의 안정성을 유지하는 데 유용합니다. Nginx에서 rate limiting을 설정해서 nginx ddos 방지 설정 하는 방법을 알아보겠습니다.

nginx ddos 방지 기본 개념

Nginx의 rate limiting은 주로 두 가지 모듈을 사용하여 구현됩니다:

  • limit_req 모듈: 요청의 속도를 제한합니다.
  • limit_conn 모듈: 동시에 처리할 수 있는 연결 수를 제한합니다.

nginx 설정 파일 수정

Nginx 설정 파일(일반적으로 /etc/nginx/nginx.conf 또는 각 사이트의 설정 파일)에 다음과 같은 설정을 추가합니다.

요청 속도 제한 (limit_req)

http 블록에 limit_req_zone 정의:

http {
    # zone 이름은 'one'이고, 메모리 크기는 10MB, 키는 클라이언트의 IP 주소
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    }

$binary_remote_addr : 클라이언트 IP 주소를 이진 표현하는 nginx 변수로 IP 주소를 키값으로 요청 속도를 제한합니다.

rate=10r/s : 최대 요청 속도를 설정합니다. 다음과 같이 설정하면 초당 10개의 요청을 초과할 수 없습니다.

주의해야할 점은 버스트 설정을 하지 않은 경우 10초에 5개의 요청이 와도 nginx는 100ms 단위로 요청을 추적하기 때문에 100ms 이내에 한꺼번에 5개 요청이 오면 1개만 받고 나머지는 거부된다는 점입니다.

server 또는 location 블록에 limit_req 적용:

server {
    location / {
        limit_req zone=one burst=5 nodelay;
        # burst: 허용된 요청 수를 초과할 수 있는 최대 요청 수
        # nodelay: burst 요청이 즉시 처리되도록 설정
        limit_req_status 429:
        # 요청한계를 초과할 경우 에러반환
    }
}

위에서 설명했듯이 100ms안에 많은 요청이 오거나, 1초에 10개가 넘는 요청이 오게되면 에러 코드를 보냅니다. 의도적인 공격이 아닌 경우에도 요청 딜레이가 너무 짧아서 에러가 나는 상황이 있습니다.

버스트 처리는 초과요청에 대해 대기열에 쌓아 두고서 순차적으로 처리하도록 서비스를 제공합니다. 위의 코드에서는 5개의 추가적인 요청을 담을 수 있습니다.

버스트 처리만 할 경우 설정에 따라 서버가 요청을 처리하는데 시간이 걸리면서 사이트가 느리게 작동할 수 있습니다. 이 상황을 해결하기 위해 nodelay를 추가해줍니다.

nodelay를 적용하면 초과 요청이 버스트에 쌓이지만 서버로의 전달은 즉시 처리하게됩니다. 즉 서버로 모든 요청을 전달해놓고, 버퍼를 채워놓아 100ms 마다 버퍼에 있는 요청을 삭제합니다. 따라서 버퍼에 쌓은 요청은 즉시 처리하면서 요청속도 제한을 적용할 수 있습니다.

연결 수 제한 (limit_conn)

다음 코드를 통해서 IP주소를 키값으로 동시에 허용할 최대 연결 수를 지정할 수 있습니다.

http 블록에 limit_conn_zone 정의:

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;
}

server 또는 location 블록에 limit_conn 적용:

server {
    location / {
        limit_conn addr 10;
        # addr zone에 대해 동시에 허용할 최대 연결 수
    }
}

nginx ddos 방지 설정 적용

설정을 완료한 후, Nginx 설정 파일에 오류가 없는지 확인하고, Nginx를 재시작하여 변경 사항을 적용합니다.

# 설정 파일 문법 검사
nginx -t

# Nginx 재시작
sudo systemctl restart nginx

추가 옵션

nginx_ddos_방지_처리
출처 : pixabay
  • 로그 설정: 속도 제한에 걸린 요청을 로그에 기록할 수 있습니다.
  • 다양한 키 사용: $binary_remote_addr 외에도 $request_uri, $http_user_agent 등을 키로 사용할 수 있습니다.

이러한 설정을 통해 Nginx에서 클라이언트의 요청 속도와 연결 수를 효과적으로 제한할 수 있습니다. 이 설정은 nginx ddos 방지 기본 설정방법입니다. 추가로 fail2ban 서비스와 연계해서 ddos공격을 방어할 수 있습니다. 세부적인 설정은 서버의 요구 사항에 맞게 조정해야 합니다.

여기까지 nginx에서 요청속도 제한을 설정하고 nginx ddos 방지 할 수 있는 방법에 대해서 알아봤습니다.

  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
  • Share on kakaotalk