1. 서버가 갑자기 먹통이 됐을 때 DDoS를 의심하자
아무 이유 없이 웹사이트가 느려지고 CPU가 100%에 달하며, 새로운 접속이 아예 처리되지 않는 상황이 발생했습니다. 코드를 바꾸지도 않았고, 서버 설정도 그대로인데 이상합니다.
이럴 때 원인 중 하나로 DDoS 공격을 의심해볼 수 있습니다. 뉴스에서 자주 등장하는 단어지만 정확히 어떤 공격인지, 어떻게 대응해야 하는지 아는 분들은 많지 않습니다.
2. DoS와 DDoS – 무엇이 다른가?
**DoS(Denial of Service, 서비스 거부)**는 한 대의 컴퓨터가 서버에 대량의 요청을 보내 서비스를 마비시키는 공격입니다. 단일 공격 IP이므로 해당 IP를 차단하면 방어가 가능합니다.
**DDoS(Distributed Denial of Service, 분산 서비스 거부)**는 수천~수십만 대의 감염된 컴퓨터(봇넷)가 동시에 한 서버를 공격하는 방식입니다. 공격 IP가 전 세계에 분산되어 있어 단순 IP 차단으로는 방어가 불가능합니다.
봇넷을 구성하는 컴퓨터들은 대부분 악성코드에 감염된 일반인의 PC, IoT 기기, 카메라 등입니다. 기기 소유자는 자신의 장비가 공격에 이용되고 있다는 사실조차 모르는 경우가 많습니다.
| 구분 | DoS | DDoS |
|---|---|---|
| 공격 출처 | 단일 IP | 수천~수만 개의 분산 IP |
| 공격 규모 | 소규모 | 대규모 (Gbps 단위) |
| 방어 난이도 | 비교적 쉬움 | 매우 어려움 |
| 대응 방법 | IP 차단 | 전문 방어 서비스 필요 |
3. DDoS 공격의 세 가지 유형
볼류메트릭 공격(Volumetric Attack) 가장 흔한 유형으로, 서버의 네트워크 대역폭을 초과하는 트래픽을 쏟아붓습니다. UDP 플러드, ICMP 플러드가 대표적입니다. 파이프(네트워크 회선)에 너무 많은 물을 부어 넘치게 만드는 것과 같습니다.
프로토콜 공격(Protocol Attack) TCP/IP 프로토콜의 허점을 이용해 서버의 연결 처리 자원을 고갈시킵니다. SYN Flood가 대표적으로, TCP 연결 요청(SYN)만 대량으로 보내고 완성을 하지 않아 서버의 연결 대기 큐를 가득 채웁니다.
애플리케이션 레이어 공격(Layer 7 Attack) HTTP 요청처럼 겉보기에 정상적인 요청을 대량으로 보내 웹서버를 과부하 상태로 만듭니다. 트래픽이 적어 감지하기 어렵지만 서버 자원을 집중적으로 소모시킵니다. HTTP Flood, Slowloris가 해당됩니다.
4. DDoS 공격을 받을 때 나타나는 증상
DDoS 공격 중일 때 다음과 같은 증상이 나타납니다.
웹사이트 접속이 매우 느려지거나 타임아웃됩니다. 서버 CPU 사용률이 갑자기 100%에 달합니다. 네트워크 트래픽이 평소보다 수십~수백 배 급증합니다. 접속 로그를 보면 비정상적으로 많은 요청이 쏟아지고 있습니다.
단순 트래픽 급증과 DDoS를 구별하는 방법은 IP 분포를 확인하는 것입니다. 정상적인 트래픽 급증은 다양한 국내 IP에서 들어오지만, DDoS는 해외 IP에서 비정상적으로 많은 요청이 동시에 들어옵니다.
5. 소규모 서버에서 할 수 있는 기본 방어 조치
대규모 DDoS는 클라우드 방어 서비스 없이는 막기 어렵지만, 소규모 공격은 서버 자체 설정으로 어느 정도 방어가 가능합니다.
특정 IP 차단 공격 IP가 집중되어 있다면 UFW로 차단합니다.
sudo ufw deny from 공격IP주소
Nginx Rate Limiting 설정 같은 IP에서 과도하게 많은 요청이 오는 것을 제한합니다. Nginx 설정 파일에서 http 블록 안에 아래 내용을 추가합니다.
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
그리고 server 블록의 location 안에 아래를 추가합니다.
limit_req zone=one burst=5;
이 설정은 같은 IP에서 분당 30회를 초과하는 요청을 제한합니다.
Fail2Ban 활용 앞서 설정한 Fail2Ban을 SSH뿐 아니라 Nginx 로그에도 적용하면, 비정상적으로 많은 HTTP 요청을 보내는 IP를 자동 차단할 수 있습니다.
6. Cloudflare로 DDoS를 막는 방법
대규모 DDoS에는 서버 자체 방어에 한계가 있습니다. 수 Gbps에 달하는 트래픽이 몰리면 서버가 처리하기도 전에 네트워크 회선 자체가 막힙니다.
이때 효과적인 방법이 Cloudflare 같은 CDN 서비스를 앞에 두는 것입니다.
Cloudflare는 전 세계에 분산된 자체 네트워크로 들어오는 트래픽을 먼저 필터링합니다. 공격 트래픽은 흡수하고 정상 트래픽만 원본 서버로 전달합니다. 무료 플랜만으로도 기본적인 DDoS 방어와 함께 원본 서버 IP를 숨기는 기능을 제공합니다.
Cloudflare를 적용하면 공격자는 원본 서버 IP를 알 수 없어 직접 공격도 어려워집니다.
7. DDoS를 완전히 막을 수 없는 이유 – 현실적인 관점
DDoS 공격을 100% 차단하는 방법은 존재하지 않습니다. 공격 규모가 방어 인프라의 처리 용량을 넘어서면 어떤 방어책도 한계가 있습니다.
현실적인 목표는 두 가지입니다. 첫째, 공격의 영향을 최소화해 서비스 중단 시간을 줄입니다. 둘째, 공격이 끝난 뒤 빠르게 복구합니다.
이를 위해 평소에 모니터링 경보를 설정해 이상 트래픽을 빠르게 감지하고, Cloudflare 같은 방어 서비스를 미리 적용해 두는 것이 중요합니다.
8. 정리 및 다음 단계
오늘 배운 핵심을 정리합니다.
- DDoS는 수많은 분산 컴퓨터가 동시에 서버를 공격해 서비스를 마비시키는 공격입니다.
- 볼류메트릭, 프로토콜, 애플리케이션 레이어 세 가지 유형이 있습니다.
- 소규모 공격은 UFW 차단, Nginx Rate Limiting, Fail2Ban으로 어느 정도 방어할 수 있습니다.
- 대규모 공격에는 Cloudflare 같은 전문 방어 서비스가 필요합니다.
- DDoS의 완전 차단은 불가능하므로, 빠른 감지와 복구 체계를 갖추는 것이 현실적입니다.
다음 글에서는 서버가 갑자기 응답하지 않을 때 원인을 찾고 복구하는 방법을 알아보겠습니다.