본문 바로가기

리눅스

Nginx 등록되지 않은 가상호스트를 차단 및 제한하는 방법

반응형

Nginx 등록되지 않은 가상호스트(Default Server)를 차단 및 제한하는 방법

웹 서버를 운영하다 보면 등록하지 않은 도메인이나 IP 주소로 직접 들어오는 정체불명의 공격성 요청을 자주 마주하게 됩니다. Nginx의 default_server 설정과 비표준 응답 코드 444 그리고 더미 인증서를 활용해 이러한 불필요한 트래픽을 원천 봉쇄하고 서버 보안을 강화하는 방법입니다.

개념 정리

return 444;
  • Nginx 전용 비표준 코드
  • HTTP 응답 헤더조차 보내지 않고 즉시 TCP 연결 종료
일반적인 HTTP 상태 코드(403, 404)보다 훨씬 "조용한" 차단 방식입니다.
ssl_reject_handshake on;
  • SSL 핸드쉐이크 단계에서 연결 자체를 거부
  • 유효하지 않은 도메인 요청에 대해 인증서 정보 노출 안 함, TLS 협상 비용 안 함
HTTPS 환경에서 "아무 도메인이나 찔러보는 공격"을 막을 때 매우 유용합니다.

더미(Self-signed) 인증서 생성

HTTPS default_server는 인증서 설정이 필수이므로 실제 서비스와 무관한 더미 인증서를 생성합니다.

디렉토리 생성 및 이동

sudo mkdir -p /etc/nginx/ssl/default_deny
cd /etc/nginx/ssl/default_deny

개인키 + 인증서 생성(10년 유효)

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout dummy.key -out dummy.crt \
  -subj "/C=KR/ST=Seoul/L=Seoul/O=DenyServer/OU=IT/CN=localhost"

인증서 파일 권한 설정

sudo chmod 600 /etc/nginx/ssl/default_deny/dummy.key
sudo chmod 644 /etc/nginx/ssl/default_deny/dummy.crt

Nginx 차단 설정

Default Deny 파일 생성

vim /etc/nginx/conf.d/default.deny.conf

Log Format

log_format debug_deny '$remote_addr - $remote_user [$time_local] "$host $request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
728x90

HTTP 기본 차단 서버(80)

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    #access_log off;
    access_log /var/log/nginx/default.deny-access.log debug_deny;
    error_log /var/log/nginx/default.deny-error.log warn;

    location / {
        allow 192.168.1.0/24; # 허용할 관리자/내부 IP 대역
        deny all;

        # 403 Forbidden 발생 시 즉시 연결 종료(444)로 리다이렉트
        error_page 403 =444 /empty;
    }

    # error_page 리다이렉트용(루프 방지)
    location = /empty {
        return 444;
    }
}

동작 방식

  • 내부 허용 대역(192.168.1.0/24)은 정상 처리
  • 그 외 요청은 deny all → 403
  • error_page로 444 반환 → 즉시 연결 종료

HTTPS 기본 차단 서버(443)

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;

    #access_log off;
    access_log /var/log/nginx/default.deny-access.log debug_deny;
    error_log /var/log/nginx/default.deny-error.log warn;

    # Nginx 1.19.4+ 에서 사용 가능
    #ssl_reject_handshake on;

    location / {
        allow 192.168.1.0/24;
        deny all;
        
        error_page 403 =444 /empty;
    }

    location = /empty {
        return 444;
    }

    # 보안용 더미 인증서 적용
    ssl_certificate /etc/nginx/ssl/default_deny/dummy.crt;
    ssl_certificate_key /etc/nginx/ssl/default_deny/dummy.key;
}

HTTPS에서의 핵심 포인트

  • ssl_reject_handshake on;
    • 가능하다면 활성화 권장
  • 실제 서비스와 무관한 더미 인증서 사용
더보기

---

vim /etc/nginx/conf.d/default.deny.conf
# 1. 상세 분석을 위한 커스텀 로그 포맷 정의
log_format debug_deny '$remote_addr - $remote_user [$time_local] "$host $request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

# [HTTP 차단 설정]
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    access_log /var/log/nginx/default.deny-access.log debug_deny;
    error_log /var/log/nginx/default.deny-error.log warn;

    location / {
        allow 192.168.1.0/24; # 허용할 관리자/내부 IP 대역
        deny all;

        # 403 Forbidden 발생 시 즉시 연결 종료(444)로 리다이렉트
        error_page 403 =444 /empty;
    }

    location = /empty {
        return 444;
    }
}

# [HTTPS 차단 설정]
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;

    access_log /var/log/nginx/default.deny-access.log debug_deny;
    error_log /var/log/nginx/default.deny-error.log warn;

    location / {
        allow 192.168.1.0/24;
        deny all;
        
        error_page 403 =444 /empty;
    }

    location = /empty {
        return 444;
    }

    # 보안용 더미 인증서 적용
    ssl_certificate /etc/nginx/ssl/default_deny/dummy.crt;
    ssl_certificate_key /etc/nginx/ssl/default_deny/dummy.key;
}

---

설정 문법 검사

sudo nginx -t

설정 리로드

sudo nginx -s reload

 

728x90
반응형