← 블로그 목록
작성일: 2026-05-26 DDoSRate LimitingFail2Ban

웹 로그로 DDoS 공격 조기 탐지하기

DDoS(Distributed Denial of Service) 공격은 대량의 요청으로 서비스를 마비시키는 공격입니다. 웹 서버 로그를 분석하면 공격 초기 단계에서 이상 징후를 포착하고 대응할 수 있습니다.


DDoS 공격의 로그 패턴

1. HTTP Flood

단시간 내 대량의 정상 요청처럼 보이는 트래픽:

`` 203.0.113.42 - - [10/Oct/2024:14:00:01 +0000] "GET / HTTP/1.1" 200 1234 203.0.113.42 - - [10/Oct/2024:14:00:01 +0000] "GET / HTTP/1.1" 200 1234 203.0.113.42 - - [10/Oct/2024:14:00:01 +0000] "GET / HTTP/1.1" 200 1234 ... (초당 수백~수천 건) `

2. Slowloris 공격

연결을 느리게 유지하여 서버 리소스 고갈:

` 198.51.100.7 - - [10/Oct/2024:14:00:00 +0000] "GET / HTTP/1.1" 408 - 198.51.100.7 - - [10/Oct/2024:14:00:30 +0000] "GET / HTTP/1.1" 408 - `

응답 코드 408(Request Timeout)이 반복됩니다.

3. Layer 7 공격 (특정 경로 집중)

무거운 쿼리나 API 엔드포인트만 집중 공격:

` 192.0.2.100 - - [10/Oct/2024:14:00:01 +0000] "POST /api/search HTTP/1.1" 200 4821 192.0.2.100 - - [10/Oct/2024:14:00:02 +0000] "POST /api/search HTTP/1.1" 200 4821 ... (같은 경로 반복) `


초당 요청 수(RPS) 계산

`bash awk '{print $4}' /var/log/nginx/access.log | cut -d: -f1-4 | sort | uniq -c | sort -rn | head -20 `

출력 예시:

` 15432 [10/Oct/2024:14:00 1234 [10/Oct/2024:14:01 1102 [10/Oct/2024:13:59 `

평소 분당 1,000건인데 갑자기 15,000건 → DDoS 의심


분산된 공격 탐지 (봇넷)

단일 IP가 아닌 수천 개 IP에서 동시 공격:

`bash awk '{print $4}' /var/log/nginx/access.log | cut -d: -f1-4 | uniq -c | awk '$1 > 100' | wc -l `

100건 이상 요청한 분:초 단위 구간이 많으면 분산 공격입니다.


Nginx Rate Limiting으로 방어

`nginx http { limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s; limit_conn_zone $binary_remote_addr zone=addr:10m; }

server { location / { limit_req zone=general burst=20 nodelay; limit_conn addr 10; } } `

  • rate=10r/s: IP당 초당 10 요청
  • burst=20: 일시적으로 20건까지 허용
  • limit_conn addr 10: IP당 최대 10개 연결

Fail2Ban으로 자동 차단

DDoS 패턴을 감지하여 자동 차단:

/etc/fail2ban/filter.d/nginx-req-limit.conf:

`ini [Definition] failregex = limiting requests, excess: . by zone ., client: , ignoreregex = `

/etc/fail2ban/jail.local:

`ini [nginx-req-limit] enabled = true filter = nginx-req-limit logpath = /var/log/nginx/error.log maxretry = 5 findtime = 60 bantime = 3600 `


CloudFlare/CDN 로그 분석

CDN을 사용하면 로그에 CDN IP만 기록됩니다. 실제 클라이언트 IP는 CF-Connecting-IP 헤더에 있습니다.

`nginx log_format cloudflare '$http_cf_connecting_ip - $remote_user [$time_local] ...'; access_log /var/log/nginx/access.log cloudflare; ``


정리

DDoS는 초당 요청 수, 동일 IP 반복, 408 타임아웃 증가 패턴으로 탐지할 수 있습니다. Nginx Rate Limiting과 Fail2Ban을 조합하면 소규모 공격은 자동 차단 가능하지만, 대규모 봇넷 공격은 CDN/WAF 서비스 없이는 방어가 어렵습니다.