외부에서 우리 사이트를 겁나게 공격하는 바람에
DDos공격을 어떻게 하면 막을 수 있는지 엄청 고민했다..
일단, nginx의 설정으로 막을 수 있다.
우리가 찾은 방법은
[ 설정 방법 ]
# 요청 속도 제한 (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주소로 여러 요청이 동시다발적으로 들어온다
= 요청 개수를 제한한다면 학생들의 요청도 막아버릴 수 있다
= 정상적인 사용자의 요청도 공격으로 인식하게 된다
nginx로그를 열람했을때, 대부분의 ip주소는 헝가리,중국,미국 등 외국이었다.
그냥 얘네를 싹다 막자
GeoIP2는 ip주소들에 대해 어떤 나라의 ip인지 정보를 가지고 있는 데이터베이스이다.
GeoIP1도 있지만, 해당 데이터베이스는 현재 정보 업데이트가 되지 않고있다.
새로 추가되는 ip에 대해서는 처리해줄 수 없다는 뜻이다.
GeoIP2 를 사용하려면 모듈을 설치해야하는데,
현재 우리가 nginx 컨테이너에 띄우는 nginx:lastest이미지에는 해당 모듈이 설치되어있지 않으며, 버전도 맞지 않다.
그래서 nginx + GeoIP2 모듈이 설치된 커스텀 도커 이미지를 만들어 docker hub에 올리기로 결정!
-> 관련된 패키지를 설치한후, nginx코드를 가져오기 그 위에 geoip2 모듈을 설치한다.
-> 원래 200 을 반환해주던 로그가
-> 403 에러를 반환해주는 것을 확인할 수 있다!