Apache(IHS) 웹 서버에서 도메인명이 아닌 IP 주소로 접속하거나, ServerName에 정의되지 않은 요청이 들어올 경우 이를 차단하거나 에러 페이지를 보여주는 방법을 정리합니다. 가장 먼저 로딩되는 Dummy VirtualHost를 활용하는 것이 핵심입니다.
0. 배경 지식 (Context)
Apache는 클라이언트 요청의 Host 헤더와 일치하는 ServerName(또는 ServerAlias)을 찾지 못할 경우, 설정 파일에서 가장 먼저 정의된 VirtualHost를 기본값(Default)으로 사용하여 요청을 처리합니다.
이 원리를 이용하여, 최상단에 아무런 ServerName을 갖지 않는(혹은 더미 값을 가진) VirtualHost를 배치하고 403 Forbidden 등을 반환하게 하면, 지정된 도메인 외의 모든 접근을 차단할 수 있습니다.
Test Environment
- OS: CentOS 7.2
- Web Server: IBM HTTPServer v8.5 (Apache 2.2 Base)
1. httpd.conf 설정 (VirtualHost 구성)
핵심은 순서입니다. 차단용(Dummy) 설정을 정상 서비스 설정보다 반드시 위쪽에 작성해야 합니다.
1) 기본 설정 및 포트 리슨
Listen 80
Listen 4958
# Apache 2.2 / IHS 8.5 이하 필수 (IP 기반 가상호스트 활성화)
NameVirtualHost *:80
NameVirtualHost *:4958
2) 차단용 Dummy VirtualHost (최상단 배치)
이 블록에는 ServerName을 지정하지 않거나 의미 없는 값을 넣습니다. 이곳으로 들어오는 요청은 모두 에러 메시지를 반환합니다.
# [80 포트] 미등록 도메인/IP 접속 차단
<VirtualHost *:80>
DocumentRoot /app/was/htdocs
# 접근 거부 메시지 설정 (보안상 상세 정보 숨김 권장)
ErrorDocument 403 "Forbidden: Access is denied."
ErrorDocument 404 "Not Found."
ErrorDocument 500 "Internal Server Error."
# 모든 요청에 대해 403 Forbidden 강제 반환 (mod_rewrite 사용 시)
# RewriteEngine On
# RewriteRule .* - [R=403,L]
# 또는 디렉토리 접근 권한 제어
<Directory "/app/was/htdocs">
Order allow,deny
Deny from all
</Directory>
</VirtualHost>
# [4958 포트] 미등록 도메인/IP 접속 차단
<VirtualHost *:4958>
DocumentRoot /app/was/htdocs
ErrorDocument 403 "Forbidden: Access is denied."
# ... (상동)
</VirtualHost>
3) 실제 서비스 VirtualHost
정상적인 도메인(ServerName)을 가진 요청만 처리하는 블록입니다. Proxy 설정을 포함합니다.
# Reverse Proxy 사용 시 Open Relay 방지
ProxyRequests Off
# [80 포트] 정상 서비스
<VirtualHost *:80>
ServerName test.apache.com
# WAS 또는 백엔드 서버로 프록시
ProxyPass / http://172.31.98.155/ Keepalive=on
ProxyPassReverse / http://172.31.98.155/
# Host 헤더 유지 (WAS가 도메인을 인식하도록 함)
ProxyPreserveHost On
ErrorLog /app/was/HTTPServer/logs/test_proxy_error.log
CustomLog /app/was/HTTPServer/logs/test_proxy_access.log combined
</VirtualHost>
# [4958 포트] 정상 서비스
<VirtualHost *:4958>
ServerName test.httpserver.com
ProxyPass / http://172.31.98.209/ Keepalive=on
ProxyPassReverse / http://172.31.98.209/
ProxyPreserveHost On
ErrorLog /app/was/HTTPServer/logs/http_proxy_error.log
CustomLog /app/was/HTTPServer/logs/http_proxy_access.log combined
</VirtualHost>
ProxyPreserveHost On 옵션은 클라이언트가 요청한 도메인 정보(Host Header)를 백엔드 서버(WAS)까지 그대로 전달합니다. WAS에서 가상 호스트를 구분해야 한다면 필수 옵션입니다.
2. 검증 (Verification)
설정 적용 후 웹 서버를 재기동하고 curl을 이용하여 테스트합니다.
1) 정상 도메인 접속 테스트
# 정상 응답(200 OK)이 와야 함
curl -v -H "Host: test.apache.com" http://localhost:80/
2) IP 접속 및 미등록 도메인 테스트
# 1. IP로 직접 요청 -> 403 또는 설정한 에러 메시지 출력되어야 함
curl -v http://localhost:80/
# 2. 엉뚱한 도메인 요청 -> 403 출력되어야 함
curl -v -H "Host: unknown.com" http://localhost:80/
Next Step:
Apache 2.4 (IHS 9.0 이상)를 사용 중이라면, NameVirtualHost 지시어는 더 이상 필요하지 않으므로 삭제하고, 접근 제어 구문을 Require all denied 등으로 변경해야 합니다.