본문으로 건너뛰기

DDoS 기초 방어: SYN Flood와 HTTP Flood 대응

DDoS(Distributed Denial of Service) 공격은 대량의 트래픽으로 서버를 마비시킵니다. 웹 서버 레벨에서의 기초 방어 설정과 OS 레벨 튜닝으로 소규모~중규모 공격을 방어합니다.


DDoS 공격 유형별 방어 전략

DDoS Protection Flow

공격 유형계층방어 방법
SYN FloodL4 (TCP)OS SYN Cookie, 방화벽
UDP FloodL4 (UDP)방화벽, 속도 제한
HTTP FloodL7 (HTTP)Rate Limiting, WAF
SlowlorisL7 (HTTP)타임아웃 설정, 연결 제한
DNS AmplificationL3/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
(웹 서버 레벨에서는 막을 수 없음)