DDOS 공격 막기

sseongeun·2025년 1월 1일
0

deploy

목록 보기
2/2

외부에서 우리 사이트를 겁나게 공격하는 바람에
DDos공격을 어떻게 하면 막을 수 있는지 엄청 고민했다..

일단, nginx의 설정으로 막을 수 있다.

우리가 찾은 방법은

요청의 속도 제한 + 동시 연결 수 제한 + 민감파일 접근 차단

: 동일한 ip가 시간당 보낼 수 있는 요청 수 를 제한하고, 동시에 유지하는 커넥션 수에 제한을 두는 방법이다.

  • [ 설정 방법 ]

    설정 파일 예시

    # 요청 속도 제한 (rate 10r/s)
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    
    #동시 연결 수 제한
    limit_conn_zone $binary_remote_addr zone=addr_limit:10m;
    
    # 위 두 설정 사항 모두 하나의 ip 에 대해 적용되는 제약사항이다.
    
    ...
    server {
        listen 443 ssl;
       
       
         # 민감 파일 접근 차단
        location ~ /\. { 
            deny all;
            access_log off;
            log_not_found off;
        }
    
        # 루트 경로 POST 요청 차단
        location = / {
            if ($request_method = POST) {
                return 405; # Method Not Allowed
            }
        }
    
        location /api {
             ...
    
             # DDoS 방어 설정 적용
             limit_conn addr_limit 10; # 동시 연결 제한
             limit_req zone=req_limit burst=20 nodelay; # 요청 속도 제한
    
            }
    
        location / {
            ...
            
            # DDoS 방어 설정 적용
            limit_conn addr_limit 10; # 동시 연결 제한
            limit_req zone=req_limit burst=20 nodelay; # 요청 속도 제한
    
                
        }
    
  • [ 예상 효과 ]

⇒ 이처럼 하나의 ip가 매우 짧은 시간 간격으로 접속하는 경우, 중간에 끊어낼수 있으므로 효과가 있다.


⛔️ 근데 갑자기 드는 의문점

우리 서비스는 우리학교 학생들을 대상으로한다.

= 학생들은 주로 학교 공용 와이파이를 사용한다.

= 하나의 ip주소로 여러 요청이 동시다발적으로 들어온다

= 요청 개수를 제한한다면 학생들의 요청도 막아버릴 수 있다

= 정상적인 사용자의 요청도 공격으로 인식하게 된다

생각1) url의 시작점으로 막는다

하지만 현재 프로젝트에서는 사용할 수 없으므로 기각

백엔드의 경우 api~로 시작했지만, 프론트는 /로 시작했으므로 이렇게되면 프론트로의 접근을 전부 막아버린다.

생각2) 한국 외 ip를 차단하자! (+ 민감파일 접근차단)

nginx로그를 열람했을때, 대부분의 ip주소는 헝가리,중국,미국 등 외국이었다.
그냥 얘네를 싹다 막자

방법은 찾아본 결과 GeoIP2를 설치하는 것이었다.

GeoIP2는 ip주소들에 대해 어떤 나라의 ip인지 정보를 가지고 있는 데이터베이스이다.
GeoIP1도 있지만, 해당 데이터베이스는 현재 정보 업데이트가 되지 않고있다.
새로 추가되는 ip에 대해서는 처리해줄 수 없다는 뜻이다.

😪 근데 여기서 또 애를 먹었다.

GeoIP2 를 사용하려면 모듈을 설치해야하는데,
현재 우리가 nginx 컨테이너에 띄우는 nginx:lastest이미지에는 해당 모듈이 설치되어있지 않으며, 버전도 맞지 않다.

그래서 nginx + GeoIP2 모듈이 설치된 커스텀 도커 이미지를 만들어 docker hub에 올리기로 결정!

먼저 nginx.Dockerfile을 생성했다.


-> 관련된 패키지를 설치한후, nginx코드를 가져오기 그 위에 geoip2 모듈을 설치한다.

이렇게 한후 만들어진 이미지를 docker hub에 push,ec2가 pull 받아 사용한다.

이제 해외 ip주소를 막아주는 지 확인하자!

nginx 컨테이너의 로그를 열람하면


-> 원래 200 을 반환해주던 로그가

-> 403 에러를 반환해주는 것을 확인할 수 있다!

profile
공부 기록...

0개의 댓글