블로그로 돌아가기

프록시를 이용한 DDoS 공격으로부터 서버 보호하기: 15분 만에 설정하기

웹 서비스의 DDoS 공격으로부터 보호하는 방법에 대한 자세한 가이드: Nginx 및 HAProxy 설정, 로드 분산 및 악성 트래픽 필터링.

📅2026년 2월 23일
```html

DDoS 공격은 몇 분 만에 모든 웹 서비스의 작동을 마비시킬 수 있습니다. 공격자는 다양한 IP 주소에서 수천 개의 요청을 보내 서버를 과부하시키고 실제 사용자에게는 접근할 수 없게 만듭니다. 프록시 서버는 악성 트래픽을 필터링하고 부하를 분산시키며 서버의 실제 IP 주소를 숨길 수 있는 효과적인 보호 도구 중 하나입니다.

이 가이드에서는 DDoS 방어를 위한 프록시 설정 방법, 사용할 프록시 유형 및 다층 보안 시스템 구축 방법을 살펴보겠습니다. 이 자료는 시스템 관리자, 웹 서비스 소유자 및 DevOps 전문가를 대상으로 합니다.

DDoS 공격이 작동하는 방식과 프록시가 도움이 되는 이유

DDoS(Distributed Denial of Service)는 서비스 거부 공격입니다. 공격자는 수천 개의 감염된 장치로 구성된 봇넷을 사용하여 동시에 서버에 요청을 보냅니다. 목표는 서버의 자원(프로세서, 메모리, 대역폭)을 소모하여 합법적인 사용자에게 접근할 수 없게 만드는 것입니다.

DDoS 공격의 주요 유형:

  • 볼륨 공격 (Volumetric attacks) — 대량의 트래픽으로 대역폭을 채우는 공격 (DNS 증폭, UDP 플러드)
  • 프로토콜 공격 (Protocol attacks) — 네트워크 프로토콜의 취약점을 악용하는 공격 (SYN 플러드, Ping of Death)
  • 애플리케이션 계층 공격 (Application layer attacks) — 웹 애플리케이션에 대한 합법적인 요청을 모방하는 공격 (HTTP 플러드, Slowloris)

프록시 서버는 DDoS로부터 보호하는 데 여러 가지 방법으로 도움이 됩니다:

  • 서버의 실제 IP 주소 숨기기 — 공격자는 프록시의 IP만 보고, 기본 서버의 IP는 보지 못합니다.
  • 악성 트래픽 필터링 — 프록시는 요청을 분석하고 의심스러운 요청을 차단합니다.
  • 부하 분산 — 여러 프록시 서버가 백엔드 서버 간에 트래픽을 분산시킵니다.
  • 요청 속도 제한 (Rate limiting) — 하나의 IP 주소에서 오는 요청 수를 제한합니다.
  • 정적 콘텐츠 캐싱 — 기본 서버의 부하를 줄입니다.

프록시가 모든 유형의 DDoS에 대한 만병통치약이 아니라는 점을 이해하는 것이 중요합니다. 강력한 볼륨 공격은 프록시 서버까지의 대역폭을 채울 수 있습니다. 따라서 프록시는 CDN, 클라우드 anti-DDoS 서비스(Cloudflare, AWS Shield), 방화벽과 같은 다른 보호 방법과 결합하여 효과적입니다.

DDoS 방어를 위한 프록시 유형: 역방향 vs 정방향

DDoS 방어를 위해 두 가지 주요 유형의 프록시 서버가 사용됩니다:

역방향 프록시 (Reverse Proxy)

역방향 프록시는 귀하의 웹 서버 앞에 위치하며 클라이언트로부터 모든 들어오는 요청을 수신합니다. 클라이언트는 프록시와만 상호작용하며 귀하의 서버의 실제 IP 주소를 알지 못합니다. 이는 DDoS 방어를 위한 주요 도구입니다.

인기 있는 역방향 프록시 솔루션:

  • Nginx — 역방향 프록시 기능을 갖춘 빠르고 가벼운 웹 서버
  • HAProxy — 강력한 필터링 기능을 갖춘 전문 로드 밸런서
  • Apache mod_proxy — Apache용 모듈, Nginx보다 성능이 떨어짐
  • Varnish — 캐싱에 중점을 둔 HTTP 가속기

정방향 프록시 (Forward Proxy)

정방향 프록시는 클라이언트 측에서 나가는 요청에 사용됩니다. DDoS 방어의 맥락에서 덜 사용되지만 다음과 같은 경우에 유용할 수 있습니다:

  • 외부 API에 접근할 때 서버의 IP 주소 숨기기
  • 여러 IP 주소를 통해 나가는 트래픽 분산
  • 잠재적인 공격에 대한 정보를 수집할 때 차단 우회

이러한 작업에는 주거용 프록시가 적합합니다 — 이들은 실제 가정 사용자의 IP 주소를 가지고 있으며 일반 트래픽처럼 보이기 때문에 발견 및 차단이 어렵습니다.

프록시 유형 DDoS 방어를 위한 적용 장점
역방향 프록시 (Nginx, HAProxy) 들어오는 트래픽 수신, 필터링, 부하 분산 서버의 실제 IP를 숨기고, 공격을 필터링하며, 콘텐츠를 캐시합니다.
주거용 프록시 인프라 숨기기, 위협 모니터링 실제 IP, 차단하기 어려움
데이터 센터 프록시 추가 보호 계층, 빠른 처리 높은 속도, 저렴한 비용

서버 보호를 위한 Nginx의 역방향 프록시 설정

Nginx는 역방향 프록시를 구축하기 위한 가장 인기 있는 도구 중 하나입니다. 들어오는 요청을 빠르게 처리하고, 요청 속도 제한을 지원하며, 의심스러운 트래픽을 필터링할 수 있습니다.

역방향 프록시 기본 설정

모든 들어오는 트래픽을 수신할 별도의 서버에 Nginx를 설치합니다. 실제 웹 서버는 프록시 뒤에 숨겨져 있어야 하며 프록시로부터의 요청만 수신해야 합니다.

# /etc/nginx/nginx.conf

http {
    # 하나의 IP에서의 연결 수 제한
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    limit_conn conn_limit 10;

    # 요청 수 제한 (요청 속도 제한)
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    limit_req zone=req_limit burst=20 nodelay;

    # Slowloris 공격 방지를 위한 타임아웃
    client_body_timeout 10s;
    client_header_timeout 10s;
    keepalive_timeout 5s 5s;
    send_timeout 10s;

    upstream backend {
        # 실제 웹 서버의 IP
        server 192.168.1.100:80;
        # 로드 밸런싱을 위해 여러 서버 추가 가능
        # server 192.168.1.101:80;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            # 백엔드로 요청 전달
            proxy_pass http://backend;
            
            # 클라이언트의 원래 IP 전달
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            
            # 프록시 타임아웃
            proxy_connect_timeout 5s;
            proxy_send_timeout 10s;
            proxy_read_timeout 10s;
        }
    }
}

의심스러운 User-Agent 차단

많은 DDoS 공격은 특정 User-Agent를 가진 봇을 사용합니다. 이들을 차단하기 위한 규칙을 추가합니다:

# 알려진 봇 차단
map $http_user_agent $bad_bot {
    default 0;
    ~*bot 1;
    ~*crawler 1;
    ~*spider 1;
    ~*scraper 1;
    "" 1; # 빈 User-Agent
}

server {
    listen 80;
    server_name example.com;

    if ($bad_bot) {
        return 403;
    }

    location / {
        proxy_pass http://backend;
    }
}

원치 않는 국가의 Geo 차단

귀하의 서비스가 특정 국가에서만 작동하는 경우, GeoIP 모듈을 사용하여 다른 지역의 트래픽을 차단할 수 있습니다:

# GeoIP 모듈 설치
# apt-get install nginx-module-geoip

load_module modules/ngx_http_geoip_module.so;

http {
    geoip_country /usr/share/GeoIP/GeoIP.dat;

    # 러시아와 우크라이나에서만 트래픽 허용
    map $geoip_country_code $allowed_country {
        default no;
        RU yes;
        UA yes;
    }

    server {
        listen 80;
        server_name example.com;

        if ($allowed_country = no) {
            return 403;
        }

        location / {
            proxy_pass http://backend;
        }
    }
}

트래픽 필터링 및 부하 분산을 위한 HAProxy

HAProxy는 트래픽 필터링 기능이 강화된 강력한 로드 밸런서입니다. 애플리케이션 계층에서 공격을 차단하기 위한 복잡한 ACL(Access Control Lists)을 지원합니다.

HAProxy 기본 구성

# /etc/haproxy/haproxy.cfg

global
    maxconn 50000
    # 로깅
    log /dev/log local0
    log /dev/log local1 notice

defaults
    mode http
    log global
    option httplog
    option dontlognull
    
    # 타임아웃
    timeout connect 5s
    timeout client 30s
    timeout server 30s
    
    # 요청 크기 제한 (POST 플러드 방지)
    maxconn 3000

frontend http_front
    bind *:80
    
    # 요청 속도 제한: 하나의 IP에서 10초에 최대 100 요청
    stick-table type ip size 100k expire 30s store http_req_rate(10s)
    http-request track-sc0 src
    http-request deny if { sc_http_req_rate(0) gt 100 }
    
    # Host 헤더가 없는 요청 차단
    acl has_host hdr(host) -m found
    http-request deny if !has_host
    
    # 의심스러운 User-Agent 차단
    acl bad_bot hdr_sub(User-Agent) -i bot crawler spider scraper
    http-request deny if bad_bot
    
    # 백엔드로 전달
    default_backend web_servers

backend web_servers
    balance roundrobin
    option httpchk GET /health
    
    # 백엔드 서버 목록
    server web1 192.168.1.100:80 check
    server web2 192.168.1.101:80 check
    server web3 192.168.1.102:80 check

ACL을 통한 HTTP Flood 방어

HTTP Flood는 공격자가 수많은 합법적인 HTTP 요청을 보내는 공격입니다. HAProxy는 이를 탐지하기 위한 복잡한 규칙을 생성할 수 있습니다:

frontend http_front
    bind *:80
    
    # 하나의 IP에서 요청 수 추적
    stick-table type ip size 100k expire 30s store http_req_rate(10s),conn_cur
    http-request track-sc0 src
    
    # 한도를 초과할 경우 차단
    acl too_many_requests sc_http_req_rate(0) gt 50
    acl too_many_connections sc_conn_cur(0) gt 10
    
    http-request deny deny_status 429 if too_many_requests
    http-request deny deny_status 429 if too_many_connections
    
    # 존재하지 않는 경로에 대한 요청 차단 (스캐닝)
    acl valid_path path_beg /api /static /login /
    http-request deny if !valid_path
    
    default_backend web_servers

신뢰할 수 있는 IP 주소의 화이트리스트

요청 속도 제한을 받지 않을 신뢰할 수 있는 IP(예: 사무실 주소 또는 파트너)를 위한 화이트리스트를 만듭니다:

frontend http_front
    bind *:80
    
    # 신뢰할 수 있는 IP 화이트리스트
    acl whitelist src 203.0.113.0/24 198.51.100.50
    
    # 화이트리스트가 아닌 IP에 대해서만 요청 속도 제한
    stick-table type ip size 100k expire 30s store http_req_rate(10s)
    http-request track-sc0 src if !whitelist
    http-request deny if { sc_http_req_rate(0) gt 100 } !whitelist
    
    default_backend web_servers

인프라 숨기기를 위한 주거용 프록시 사용

귀하의 서버 앞에 역방향 프록시 외에도 주거용 프록시를 사용하여 인프라를 추가로 보호할 수 있습니다. 이는 특히 다음과 같은 경우에 유용합니다:

  • 모니터링 서버의 IP 주소 숨기기 — DDoS 공격을 추적하거나 위협 정보를 수집하는 경우, 주거용 프록시가 귀하의 활동을 숨기는 데 도움이 됩니다.
  • 인프라를 노출하지 않고 외부 API에 접근하기 — 귀하의 서버가 주거용 프록시를 통해 요청을 보내면 발견하기 어려워집니다.
  • DDoS 방어 테스트하기 — 다양한 IP 주소에서 공격을 모방하여 필터의 효과를 확인합니다.

주거용 프록시는 실제 가정 사용자의 IP 주소를 가지고 있어 일반 트래픽과 구별하기 어렵습니다. 이는 차단을 어렵게 하고 geo 제한을 우회할 수 있게 합니다.

예시: 주거용 프록시를 통한 위협 모니터링

예를 들어, 귀하의 서비스에 공격할 수 있는 봇넷의 활동을 추적하고 싶다고 가정해 보겠습니다. 주거용 프록시를 사용하면 서버의 IP 주소를 노출하지 않고 정보를 수집할 수 있습니다:

import requests

# 주거용 프록시 설정
proxies = {
    'http': 'http://username:password@residential-proxy.com:8080',
    'https': 'http://username:password@residential-proxy.com:8080'
}

# 잠재적 위협에 대한 정보 수집
threat_sources = [
    'http://suspicious-site1.com',
    'http://suspicious-site2.com'
]

for source in threat_sources:
    try:
        response = requests.get(source, proxies=proxies, timeout=5)
        # 공격 패턴을 식별하기 위한 응답 분석
        print(f"상태: {response.status_code}, IP: {response.headers.get('X-Your-IP')}")
    except Exception as e:
        print(f"{source} 접근 오류: {e}")

필터링 규칙: 공격과 합법적인 트래픽 구별하기

애플리케이션 계층(L7)에서 DDoS 방어의 주요 어려움은 악성 트래픽을 합법적인 트래픽과 구별하는 것입니다. 현대의 공격은 실제 사용자의 행동을 모방하여 탐지를 어렵게 만듭니다.

DDoS 공격의 징후

  • 요청 수의 급격한 증가 — 짧은 기간 내에 평소보다 2-10배 증가
  • 동일한 User-Agent로부터의 요청 — 봇은 종종 동일한 User-Agent를 사용합니다.
  • Referer 없음 — 다른 페이지에서의 이동 없이 직접 요청
  • 유사한 요청 — 최소한의 변형으로 동일한 URL에 대한 요청
  • JavaScript 없음 — 봇은 페이지에서 JS 코드를 실행하지 않습니다.
  • 페이지 체류 시간 짧음 — 봇은 응답을 받은 후 즉시 연결을 종료합니다.
  • 의심스러운 IP 범위 — 동일한 서브넷에서의 대량 요청

다층 필터링

효과적인 보호는 여러 수준의 필터링을 사용합니다:

수준 1: IP 평판

알려진 봇넷, 프록시 서버, VPN의 데이터베이스를 통해 IP 주소를 확인합니다. 평판이 좋지 않은 IP를 차단합니다.

수준 2: 요청 속도 제한

하나의 IP에서의 요청 수를 제한합니다. 예를 들어, 일반 사용자에게는 분당 50 요청 이하로 제한합니다.

수준 3: 행동 분석

User-Agent, Referer, 쿠키, JavaScript 실행 여부를 확인합니다. 이러한 매개변수가 없는 요청을 차단합니다.

수준 4: CAPTCHA

의심스러운 트래픽에 대해 CAPTCHA를 표시합니다. 봇은 이를 통과할 수 없으며, 합법적인 사용자는 한 번만 통과합니다.

예시: Nginx에서의 JavaScript 챌린지

봇을 필터링하는 간단한 방법은 쿠키를 설정하기 위해 JavaScript 실행을 요구하는 것입니다:

server {
    listen 80;
    server_name example.com;

    # 쿠키 존재 여부 확인
    set $has_cookie 0;
    if ($http_cookie ~* "verified=true") {
        set $has_cookie 1;
    }

    # 쿠키가 없으면 JS 챌린지 표시
    location / {
        if ($has_cookie = 0) {
            return 200 '
                <html>
                <head><title>Verification</title></head>
                <body>
                <script>
                    document.cookie = "verified=true; path=/";
                    window.location.reload();
                </script>
                <noscript>JavaScript를 활성화해 주세요</noscript>
                </body>
                </html>
            ';
        }

        proxy_pass http://backend;
    }
}

실시간 DDoS 모니터링 및 대응

DDoS로부터 효과적으로 보호하려면 트래픽을 지속적으로 모니터링하고 이상 징후에 신속하게 대응해야 합니다. 주요 메트릭을 추적하는 모니터링 시스템을 설정하세요:

  • 초당 요청 수 — 급격한 증가는 공격을 나타낼 수 있습니다.
  • 고유 IP 주소 수 — DDoS는 종종 많은 IP에서 발생합니다.
  • 4xx/5xx 오류 비율 — 오류 증가가 과부하의 징후일 수 있습니다.
  • 서버 응답 시간 — 지연 증가가 문제를 나타냅니다.
  • 자원 소비 — CPU, 메모리, 네트워크 트래픽

모니터링 도구

도구 목적 특징
Prometheus + Grafana 메트릭 수집 및 시각화 유연한 알림 설정, 아름다운 대시보드
ELK 스택 (Elasticsearch, Logstash, Kibana) 실시간 로그 분석 강력한 로그 검색, 패턴 식별
Netdata 시스템 자원 모니터링 간단한 설치, 실시간 메트릭
Fail2ban IP 자동 차단 로그 분석 및 의심스러운 IP 차단

Prometheus에서 알림 설정하기

이상 징후 발견 시 자동 알림을 위한 규칙을 만듭니다:

# prometheus_alerts.yml

groups:
  - name: ddos_detection
    interval: 10s
    rules:
      # 요청 수 급증 시 알림
      - alert: HighRequestRate
        expr: rate(nginx_http_requests_total[1m]) > 1000
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "높은 요청 수 감지됨"
          description: "요청 수는 {{ $value }} req/s입니다."

      # 5xx 오류 증가 시 알림
      - alert: HighErrorRate
        expr: rate(nginx_http_requests_total{status=~"5.."}[5m]) > 10
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "높은 5xx 오류 비율"
          description: "5xx 오류: {{ $value }} req/s입니다."

      # 높은 CPU 사용량 시 알림
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "높은 CPU 사용량"
          description: "CPU 사용량은 {{ $value }}%입니다."

Fail2ban을 통한 자동 대응

Fail2ban은 로그를 분석하고 요청 한도를 초과하는 IP 주소를 자동으로 차단합니다:

# /etc/fail2ban/jail.local

[nginx-req-limit]
enabled = true
filter = nginx-req-limit
logpath = /var/log/nginx/access.log
maxretry = 100
findtime = 60
bantime = 3600
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]

# /etc/fail2ban/filter.d/nginx-req-limit.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*"
ignoreregex =

다층 보호: 프록시와 다른 방법 결합하기

프록시 서버는 DDoS 방어의 중요한 요소이지만, 다른 방법과 결합할 때 가장 효과적입니다. 다층 보호 아키텍처를 살펴보겠습니다:

수준 1: 네트워크 보호 (L3/L4)

  • 클라우드 anti-DDoS 서비스 — Cloudflare, AWS Shield, Google Cloud Armor는 트래픽이 귀하의 서버에 도달하기 전에 필터링합니다.
  • 하드웨어 방화벽 — 네트워크 트래픽 필터링을 위한 전문 장비
  • BGP 블랙홀링 — 공급자 수준에서 악성 트래픽을 "블랙홀"로 리디렉션합니다.

수준 2: CDN 및 캐싱

  • CDN (Content Delivery Network) — 정적 콘텐츠를 여러 서버에 분산시켜 원본 서버의 부하를 줄입니다.
  • 프록시에서의 캐싱 — Varnish, Nginx는 인기 있는 페이지를 캐시하여 백엔드에 접근하지 않고 제공합니다.
  • 콘텐츠 최적화 — CSS/JS의 미니피케이션, 이미지 압축은 트래픽 양을 줄입니다.

수준 3: 프록시 및 로드 밸런싱 (L7)

  • 역방향 프록시 — Nginx, HAProxy는 애플리케이션 수준에서 요청을 필터링합니다.
  • 로드 밸런싱 — 여러 백엔드 서버 간에 부하를 분산합니다.
  • 요청 속도 제한 — 하나의 IP에서 오는 요청 수를 제한합니다.
  • WAF (Web Application Firewall) — ModSecurity, AWS WAF는 웹 애플리케이션에 대한 공격을 차단합니다.

수준 4: 백엔드 최적화

  • 데이터베이스 최적화 — 인덱스, 요청 캐싱, 읽기 복제본
  • 비동기 처리 — 무거운 작업은 큐를 통해 백그라운드에서 수행됩니다 (RabbitMQ, Redis)
  • 수평 확장 — 부하 증가 시 새로운 서버 추가

아키텍처 예시

클라이언트
  ↓
Cloudflare (anti-DDoS L3/L4, CDN)
  ↓
Nginx 역방향 프록시 (요청 속도 제한, 필터링)
  ↓
HAProxy (부하 분산)
  ↓
백엔드 서버 (웹 애플리케이션)
  ↓
데이터베이스 (복제 포함)

이러한 아키텍처는 네트워크, 전송 및 애플리케이션 수준에서 보호를 제공합니다. 공격이 한 수준을 통과하더라도 다음 수준에서 차단됩니다.

추가 보호 계층으로 데이터 센터 프록시 사용

경우에 따라 데이터 센터 프록시를 CDN과 귀하의 서버 사이에 중간 계층으로 추가하는 것이 의미가 있습니다. 이들은 높은 처리 속도를 제공하며 추가적인 트래픽 필터링을 수행할 수 있습니다. 데이터 센터 프록시는 주거용 및 모바일 프록시보다 저렴하여 대량의 트래픽을 처리하는 경제적인 솔루션이 됩니다.

결론

프록시 서버를 통한 DDoS 공격 방어는 악성 트래픽을 필터링하고 서버의 실제 IP 주소를 숨기며 부하를 분산시킬 수 있는 효과적인 방법입니다. Nginx 또는 HAProxy 기반의 역방향 프록시는 필터링 규칙, 요청 속도 제한 및 의심스러운 요청 차단을 유연하게 설정할 수 있습니다.

우리가 살펴본 주요 사항은 다음과 같습니다:

  • 역방향 프록시 (Nginx, HAProxy) — 애플리케이션 수준(L7)에서의 주요 보호 도구
  • 요청 속도 제한 및 User-Agent, IP 평판에 따른 필터링은 대부분의 공격을 차단하는 데 도움이 됩니다.
  • 주거용 프록시는 모니터링 인프라를 숨기고 위협 정보를 수집하는 데 유용합니다.
  • 다층 보호 (CDN + 프록시 + WAF + 백엔드 최적화)는 최대한의 내구성을 제공합니다.
  • 모니터링 및 자동 대응은 공격을 신속하게 발견하고 차단하는 데 필수적입니다.

DDoS 공격은 지속적으로 진화하므로 보호 시스템은 정기적으로 업데이트하고 테스트해야 합니다. 부하 테스트를 수행하고 로그를 분석하며 필터링 규칙을 업데이트하고 새로운 공격 방법을 주시하십시오.

프록시를 사용하여 다층 보호 시스템을 구축할 계획이라면, 주거용 프록시를 사용하여 중요한 인프라를 숨기고 데이터 센터 프록시를 사용하여 대량의 트래픽을 고속으로 처리하는 것을 고려해 보십시오. 다양한 유형의 프록시 조합은 보안, 성능 및 비용 간의 최적의 균형을 제공합니다.

```