DDoS 기초 방어: SYN Flood와 HTTP Flood 대응
DDoS(Distributed Denial of Service) 공격은 대량의 트래픽으로 서버를 마비시킵니다. 웹 서버 레벨에서의 기초 방어 설정과 OS 레벨 튜닝으로 소규모~중규모 공격을 방어합니다.
DDoS 공격 유형별 방어 전략
| 공격 유형 | 계층 | 방어 방법 |
|---|---|---|
| SYN Flood | L4 (TCP) | OS SYN Cookie, 방화벽 |
| UDP Flood | L4 (UDP) | 방화벽, 속도 제한 |
| HTTP Flood | L7 (HTTP) | Rate Limiting, WAF |
| Slowloris | L7 (HTTP) | 타임아웃 설정, 연결 제한 |
| DNS Amplification | L3/L4 | 업스트림 필터링 |
OS 레벨 SYN Flood 방어
# /etc/sysctl.conf 에 추가
# SYN Cookie 활성화 (SYN Flood 방어 핵심)
# 반만 열린 연결에 쿠키를 발급해 메모리 고갈 방지
net.ipv4.tcp_syncookies = 1
# SYN-ACK 재전송 횟수 줄이기 (기본 5 → 3)
net.ipv4.tcp_synack_retries = 3
# SYN 백로그 큐 크기 증가
net.ipv4.tcp_max_syn_backlog = 4096
# TIME_WAIT 소켓 재사용
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# ICMP 요청 속도 제한 (ICMP Flood 방어)
net.ipv4.icmp_ratelimit = 100
net.ipv4.icmp_ratemask = 88089
# 연결 추적 테이블 크기 증가
net.netfilter.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_tcp_timeout_established = 600
sudo sysctl -p # 즉시 적용
iptables로 SYN Flood 방어
# SYN 패킷 속도 제한 (초당 500개 초과 시 차단)
iptables -A INPUT -p tcp --syn -m limit --limit 500/s --limit-burst 1000 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 잘못된 패킷 차단 (INVALID 상태)
iptables -A INPUT -m state --state INVALID -j DROP
# null 패킷 차단
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# XMAS 패킷 차단
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# 포트 스캔 방어 (짧은 시간에 많은 포트 접근)
iptables -N portscan
iptables -A portscan -m recent --name portscan --set -j LOG --log-prefix "Portscan: "
iptables -A portscan -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j portscan
# 설정 저장
sudo iptables-save > /etc/iptables/rules.v4
Nginx Slowloris 공격 방어
Slowloris는 연결을 열어놓고 헤더를 매우 천천히 전송해 서버 연결 풀을 고갈시킵니다.
http {
# 클라이언트 타임아웃 설정 (Slowloris 방어 핵심)
# 헤더 전체를 수신하는 최대 시간 (기본: 60s → 10s로 단축)
client_header_timeout 10s;
# 요청 바디를 수신하는 최대 시간
client_body_timeout 10s;
# 응답 전송 완료 대기 시간
send_timeout 10s;
# keepalive 유지 시간 (짧게)
keepalive_timeout 65s;
# 동시 연결 수 제한 (IP당)
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
# IP당 최대 20개 동시 연결
limit_conn conn_limit 20;
# 요청 헤더 최대 크기 제한 (대용량 헤더 공격 방어)
large_client_header_buffers 4 16k;
client_header_buffer_size 1k;
# 요청 바디 최대 크기 (10MB)
client_max_body_size 10m;
}
}
Nginx HTTP Flood 방어
http {
# IP당 요청 속도 제한
limit_req_zone $binary_remote_addr zone=http_flood:10m rate=20r/s;
# 봇 User-Agent 차단
map $http_user_agent $bad_bot {
default 0;
~*malicious_bot 1;
~*scrapy 1;
~*python-requests 1;
"" 1; # User-Agent 없는 요청 차단
}
server {
# HTTP Flood 방어
location / {
limit_req zone=http_flood burst=40 nodelay;
# 봇 차단
if ($bad_bot) {
return 403;
}
proxy_pass http://backend;
}
# 로그인 페이지는 더 엄격하게
location /login {
limit_req zone=http_flood burst=5 nodelay;
proxy_pass http://backend;
}
}
}
공격 탐지 및 자동 차단 (fail2ban)
sudo apt install fail2ban
# /etc/fail2ban/jail.local
[DEFAULT]
# 차단 유지 시간 (10분)
bantime = 10m
# 탐지 기간
findtime = 10m
# 허용 실패 횟수
maxretry = 5
# Nginx HTTP 인증 실패 차단
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
# Nginx 과도한 요청 차단 (429 응답)
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
logpath = /var/log/nginx/error.log
maxretry = 10
bantime = 1h
# SSH 무차별 대입 공격 방어
[sshd]
enabled = true
maxretry = 5
bantime = 1h
# nginx-req-limit 필터 작성
cat > /etc/fail2ban/filter.d/nginx-req-limit.conf << 'EOF'
[Definition]
failregex = limiting requests, excess:.* by zone.*client: <HOST>
ignoreregex =
EOF
# fail2ban 재시작 및 상태 확인
sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-req-limit
공격 발생 시 대응 절차
# 1. 공격 중인 IP 파악
grep " 4[0-9][0-9] \| 5[0-9][0-9] " /var/log/nginx/access.log | \
awk '{print $1}' | sort | uniq -c | sort -rn | head -20
# 2. 네트워크 연결 상태 확인
ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
# 3. 공격 IP 즉시 차단
sudo iptables -I INPUT -s <공격_IP> -j DROP
# 또는 Nginx deny
echo "deny <공격_IP>;" | sudo tee -a /etc/nginx/blocklist.conf
sudo nginx -s reload
# 4. 차단 목록 Nginx에서 include
# /etc/nginx/nginx.conf
include /etc/nginx/blocklist.conf;
# 5. 업스트림 ISP/CDN에 신고
# Cloudflare, AWS Shield 등 사용 시 대시보드에서 차단
CDN/클라우드 DDoS 방어 통합
소규모 공격 (< 1 Gbps):
Nginx 자체 rate limiting + fail2ban + iptables
중규모 공격 (1~10 Gbps):
Cloudflare Free/Pro → DDoS 자동 완화
대규모 공격 (> 10 Gbps):
Cloudflare Enterprise / AWS Shield Advanced
(웹 서버 레벨에서는 막을 수 없음)