반응형
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
반응형
'리눅스' 카테고리의 다른 글
| 우분투 24.04에서 TCP Wrappers를 사용하는 sshd 서비스를 접근 제어하는 방법 (0) | 2026.02.03 |
|---|---|
| CentOS 7에서 sg 드라이버가 로드되지 않았을 때 해결하는 방법 (0) | 2026.01.30 |
| CentOS 7에서 다운로드한 RPM 패키지 설치하는 방법 (0) | 2026.01.22 |
| HPE 서버 RAID 컨트롤러의 세대교체 (0) | 2026.01.19 |
| 우분투에서 zabbix-get 패키지를 설치하는 방법 (0) | 2026.01.16 |