← 블로그 목록
작성일: 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) 계산

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에서 동시 공격:

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

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


Nginx Rate Limiting으로 방어

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:

[Definition]
failregex = limiting requests, excess: .* by zone .*, client: <HOST>,
ignoreregex =

/etc/fail2ban/jail.local:

[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 헤더에 있습니다.

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 서비스 없이는 방어가 어렵습니다.