사이트 앞에 CDN이나 리버스 프록시를 두면 트래픽을 흡수하고 서버 주소를 숨길 수 있지만, 실제 IP가 알려지지 않은 동안에만 효과가 있습니다. 공격자는 CDN을 뚫는 경우가 드뭅니다. 대신 원본 서버를 직접 찾습니다. 이 가이드는 원본 서버가 노출되는 지점과, 프록시 외의 모든 접속을 원본 서버가 거부하게 만드는 방법을 정리합니다.
원본 서버가 발견되는 경로
- DNS 기록: 여러 서비스가 과거 레코드를 보관하므로, CDN을 붙이기 전에 사용하던 IP가 그대로 남아 있습니다.
- 서브도메인: 서버를 직접 가리키는
mail.,ftp.,dev.레코드. - 이메일 헤더: 같은 호스트에서 발송한 메일은 헤더에 IP가 드러납니다.
- 인증서 투명성과 인터넷 스캔: 스캐너는 인증서를 그것을 제공하는 모든 IP와 대조합니다.
- 애플리케이션 동작: 웹훅, 이미지 가져오기, "URL 확인" 기능은 원본 서버에서 바깥으로 연결합니다.
1단계: 깨끗한 상태에서 시작
서버가 이미 노출되었다면 가장 안전한 해결책은 새 IP를 받거나 새 서버로 이전하는 것입니다. 이미 공개된 주소를 숨기는 것은 통하지 않습니다. 이전 계획은 무중단 마이그레이션 가이드를 참고하세요.
2단계: 프록시에서 온 트래픽만 허용
프록시가 공개한 대역에서 오는 웹 포트만 허용하고 나머지는 모두 막습니다. UFW에서는 다음과 같이 하며, 제공업체가 공개하는 대역을 사용하세요.
sudo ufw default deny incoming
sudo ufw allow OpenSSH
for ip in $(cat proxy-ranges.txt); do sudo ufw allow from "$ip" to any port 443 proto tcp; done
sudo ufw enable
대역은 바뀌므로 목록을 정기적으로 갱신하세요. 더 강한 보증이 필요하면 인증된 원본 풀(상호 TLS)을 사용하여 Nginx가 프록시 인증서가 없는 모든 클라이언트를 거부하게 하세요.
3단계: 유출될 수 있는 모든 것을 분리
- 이메일은 원본 서버가 아닌 다른 호스트나 릴레이를 통해 보내세요.
- 웹이 아닌 서브도메인은 원본 IP에서 분리하세요.
- 애플리케이션의 외부 요청은 프록시나 별도의 워커를 거치게 하세요.
- 알 수 없는
Host에는 빈 응답을 돌려주는 기본 Nginx 서버 블록을 두어, IP만으로 스캔했을 때 아무것도 보이지 않게 하세요.
server {
listen 443 ssl default_server;
ssl_reject_handshake on;
}
4단계: 공격자처럼 테스트
DNS 기록 조회 도구에서 도메인을 검색하고, 자신의 IP 대역에서 해당 인증서를 스캔하고, 테스트 메일의 헤더를 확인하세요. 하나라도 원본이 드러나면 IP를 바꾸고 다시 반복하세요.
이 방법이 하는 일과 하지 않는 일을 기억하세요. 주소의 가용성과 프라이버시를 보호할 뿐, 계정 소유자가 누구인지는 숨기지 않습니다. 그에 대해서는 익명 호스팅은 실제로 얼마나 익명인가를 읽어 보시고, 네트워크 계층을 넘어서는 공격은 Layer 7 방어를 참고하세요.