DDoS 공격의 개념과 L4/L7 방어 전략
분산 서비스 거부(DDoS) 공격은 지리적으로 분산된 다수의 공격자가 표적 시스템에 동시에 트래픽을 전송하여 서비스를 마비시키는 공격 기법입니다. 공격자는 여러 대의 좀비 PC를 제어하여 희생자에게 동시다발적인 요청을 보냅니다.
DDoS 방어는 단일 솔루션으로 해결할 수 없는 복합적인 과제입니다. 공격은 크게 대역폭을 고갈시키는 L4(전송 계층) 트래픽 공격과 서버의 처리 능력을 한계에 도달하게 하는 L7(응용 계층) 애플리케이션 공격으로 나뉩니다. L4 공격의 방어 병목현상은 주로 네트워크 대역폭에서 발생하며, L7 공격의 경우 아키텍처의 처리량(Throughput)에서 발생합니다.
L7 애플리케이션 공격(CC 공격 등)의 경우, 웹 서버 단에서의 설정을 통해 어느 정도 방어할 수 있습니다. 예를 들어 Nginx를 프록시로 사용할 경우, http_limit_conn과 http_limit_req 모듈을 활용합니다. ngx_http_limit_conn_module은 단일 IP의 동시 연결 수를 제한하고, ngx_http_limit_req_module은 초당 요청 수를 제한하여 악성 트래픽을 효과적으로 완화할 수 있습니다.
네트워크 연결 상태 모니터링 스크립트 작성
서버로 유입되는 비정상적인 연결을 탐지하기 위해 Bash 스크립트를 작성합니다. 기존 netstat 대신 더 빠르고 현대적인 ss 명령어를 사용하여 IP별 연결 수를 집계합니다.
#!/bin/bash
# monitor_traffic.sh
# ss 명령어를 사용하여 TCP/UDP 연결 수를 IP별로 집계 및 정렬
ss -ntu state established | awk '{print $5}' | grep -oP '\d+\.\d+\.\d+\.\d+' | sort | uniq -c | sort -nr
위 스크립트에서 ss -ntu는 TCP와 UDP 연결을 조회하며, awk와 grep을 조합하여 원격 IP 주소만 추출합니다. uniq -c로 중복을 제거하고 카운팅한 뒤, sort -nr을 통해 연결 수가 많은 순서대로 정렬합니다.
트래픽 부하 테스트를 통한 공격 시뮬레이션
모니터링 스크립트의 동작을 확인하기 위해 Apache Bench(ab)를 사용하여 모의 트래픽을 발생합니다.
# Apache Bench 설치
yum -y install httpd-tools
# 모의 트래픽 발생 (총 1000개 요청, 동시 연결 50개)
ab -n 1000 -c 50 http://192.168.1.100/index.html
# 모니터링 스크립트 실행
./monitor_traffic.sh
자동 IP 차단을 통한 DDoS 방어 시스템 구현
DDoS 공격을 방어하기 위한 방법에는 대역폭 증설, CDN 활용, WAF 도입 등 다양한 방식이 있지만, 서버 내부에서 즉시 대응할 수 있는 가장 효과적인 방법 중 하나는 방화벽 규칙을 자동화하는 것입니다. 외부 유틸리티에 의존하지 않고, 직접 작성한 Bash 스크립트를 통해 임계치를 초과하는 IP를 자동으로 차단하고 해제하는 시스템을 구축할 수 있습니다.
1. 자동 차단 스크립트 작성
연결 수가 임계치를 초과하는 IP를 iptables를 통해 차단하고, 일정 시간 후 자동으로 해제하는 데몬 스크립트를 작성합니다.
#!/bin/bash
# auto_mitigation.sh
MAX_CONN=150
BAN_DURATION=600
WHITELIST="192.168.1.1 127.0.0.1"
LOG_FILE="/var/log/ddos_mitigation.log"
ss -ntu state established | awk '{print $5}' | grep -oP '\d+\.\d+\.\d+\.\d+' | sort | uniq -c | sort -nr | while read CONN_COUNT IP_ADDR; do
if [[ "$CONN_COUNT" -gt "$MAX_CONN" ]]; then
# 화이트리스트 확인
if [[ ! " $WHITELIST " =~ " $IP_ADDR " ]]; then
# 이미 차단된 IP인지 확인
if ! iptables -C INPUT -s "$IP_ADDR" -j DROP 2>/dev/null; then
iptables -A INPUT -s "$IP_ADDR" -j DROP
echo "$(date): Blocked $IP_ADDR (Connections: $CONN_COUNT)" >> "$LOG_FILE"
# 백그라운드에서 일정 시간 후 차단 해제
(sleep "$BAN_DURATION"; iptables -D INPUT -s "$IP_ADDR" -j DROP 2>/dev/null) &
fi
fi
fi
done
2. 방화벽 환경 설정
해당 스크립트는 iptables를 사용하므로, 기존 firewalld를 비활성화하고 iptables-services를 활성화해야 합니다.
# firewalld 중지 및 비활성화
systemctl stop firewalld
systemctl disable firewalld
# iptables 설치 및 활성화
yum install -y iptables-services
systemctl enable --now iptables
# 기존 규칙 초기화
iptables -F
3. Systemd 서비스로 등록
스크립트를 주기적으로 실행하기 위해 systemd 서비스 유닛 파일을 생성합니다.
# /etc/systemd/system/ddos-mitigation.service 파일 생성
cat <<EOF > /etc/systemd/system/ddos-mitigation.service
[Unit]
Description=Automated DDoS Mitigation Service
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do /usr/local/bin/auto_mitigation.sh; sleep 60; done'
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 스크립트 실행 권한 부여 및 서비스 시작
chmod +x /usr/local/bin/auto_mitigation.sh
systemctl daemon-reload
systemctl enable --now ddos-mitigation.service
이제 시스템은 60초마다 네트워크 연결 상태를 검사하여, 단일 IP의 연결 수가 150개를 초과할 경우 자동으로 해당 IP의 트래픽을 10분간 차단합니다. 화이트리스트에 등록된 IP는 차단 대상에서 제외됩니다.