네트워크·보안
와일드카드 DNS 때문에 쓰지 않는 서브도메인이 검색에 색인된 문제
*.도메인 CNAME이 없는 서브도메인까지 Web Station 기본 페이지를 200으로 내보내던 문제를, 실패한 .htaccess 시도부터 안내 페이지 교체, 개별 CNAME 전환, www 301까지 정리한 기록입니다.
구글에서 site:rapsso.com으로 검색해 봤다가 이상한 걸 발견했습니다. 제가 오래전에 쓰다 버린 서브도메인 두 개가 여전히 검색 결과에 나오고 있었습니다. 그 주소들은 이미 아무 사이트도 연결돼 있지 않은데 말이죠.
직접 열어 보니 이유가 바로 보였습니다. 시놀로지 Web Station의 기본 환영 페이지 Hello! Welcome to Synology Web Station!이 HTTP 200으로 떠 있었습니다. 원인은 DNS의 와일드카드 레코드 하나였습니다.
와일드카드 한 줄이 모든 주소를 살려 두고 있었습니다
DNS에 *.rapsso.com이 NAS를 가리키는 CNAME으로 걸려 있었습니다. 서브도메인을 새로 만들 때마다 DNS를 안 건드려도 되니 편해서 걸어 뒀던 겁니다.
문제는 이게 존재하지 않는 모든 이름에도 답한다는 점입니다. blog.rapsso.com이든 아무렇게나 친 asdf.rapsso.com이든 전부 NAS로 옵니다. NAS에는 그 이름의 가상 호스트가 없으니, Web Station은 기본 페이지(/volume2/web/index.html, 1,991바이트)를 200으로 돌려줍니다.
검색엔진 입장에서는 수많은 주소가 같은 내용의 페이지를 정상 응답으로 주는 셈입니다. www.rapsso.com도 루트로 넘어가지 않고 이 페이지를 보여 주고 있었습니다.
첫 시도는 실패했습니다: .htaccess로 410 주기
처음엔 /volume2/web/.htaccess에 rapsso.com 서브도메인으로 오는 요청은 410(삭제됨)을 주는 규칙을 넣었습니다. 결과는 두 가지로 틀렸습니다.
- 기본 페이지에는 안 걸렸습니다. 이 페이지는 Apache가 아니라 nginx가 정적으로 바로 내보내고 있어서
.htaccess를 아예 읽지 않습니다. - 엉뚱한 곳에 걸렸습니다. 문서 루트가
/volume2/web/아래에 있던 정상 사이트 4곳이 이.htaccess를 상속받아 410을 내기 시작했습니다.
바로 지우고 4곳이 200으로 돌아온 걸 확인했습니다. /volume2/web/ 바로 밑은 여러 가상 호스트가 공유하는 폴더라, 거기에 .htaccess를 두면 안 된다는 걸 이때 배웠습니다.
기본 페이지를 "이동 안내 페이지"로 바꿨습니다
기본 페이지를 없앨 수는 없으니 내용을 바꿨습니다. 원본은 index.html.synology-default-20260924로 보관하고, 검색엔진에는 색인하지 말라고 하고 사람은 본 사이트로 보내는 페이지로 교체했습니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>rapsso.com</title>
<meta name="robots" content="noindex,nofollow">
<meta http-equiv="refresh" content="0;url=https://rapsso.com/">
<link rel="canonical" href="https://rapsso.com/">
</head>
<body>
<p>이 주소는 사용하지 않습니다. <a href="https://rapsso.com/">https://rapsso.com/</a>으로 이동합니다.</p>
</body>
</html>
바꾼 뒤 확인했습니다. 쓰지 않는 서브도메인과 임의의 이름은 새 페이지를 받았고, 정상 사이트들은 200을 그대로 유지했습니다. 한 곳은 원래 301이었는데 그것도 그대로였습니다.
근본 해결: 와일드카드를 지우고 쓰는 이름만 등록
안내 페이지는 임시방편입니다. 없는 이름에는 애초에 DNS가 "그런 주소 없음(NXDOMAIN)"이라고 답하는 게 맞습니다.
rapsso.com의 실제 네임서버는 Cloudflare였습니다. 도메인을 산 등록 업체 DNS 화면에도 레코드가 남아 있었지만 거기는 쓰이지 않는 상태였습니다. 어느 쪽이 진짜 네임서버인지 먼저 확인해야 헛수고를 안 합니다.
nslookup -type=ns rapsso.com
Cloudflare에서 이렇게 바꿨습니다.
- 실제로 쓰는 서브도메인을 전부 적어서 하나씩 개별 CNAME으로 등록했습니다(12개).
*.rapsso.com와일드카드를 지웠습니다.- 안 쓰는 이름들이 NXDOMAIN을 받는지, 등록한 13개 호스트가 정상 응답하는지 확인했습니다.
순서가 중요합니다. 와일드카드부터 지우면 개별 등록을 안 한 서브도메인이 그 순간 전부 죽습니다.
$ nslookup zz-random-test123.rapsso.com 1.1.1.1
*** one.one.one.one can't find zz-random-test123.rapsso.com: Non-existent domain
www와 http도 정리했습니다
www는 Cloudflare 프록시를 거치고 있어서 Cloudflare의 Redirect Rule로 처리했습니다. https://www.*로 들어오면 https://${1}로 301을 보내고 쿼리 문자열은 유지합니다. 여기에 Always Use HTTPS를 켜서 http 요청도 https로 올렸습니다.
$ curl -s -o /dev/null -w "%{http_code} -> %{redirect_url}\n" "http://www.rapsso.com/notes/?a=1"
301 -> https://www.rapsso.com/notes/?a=1
$ curl -s -o /dev/null -w "%{http_code} -> %{redirect_url}\n" "https://www.rapsso.com/notes/?a=1"
301 -> https://rapsso.com/notes/?a=1
http의 www는 두 번 넘어가서 최종 주소에 도착합니다. 한 번에 보내면 더 좋지만, 두 번이어도 최종 응답은 200이고 쿼리도 살아 있어서 그대로 뒀습니다.
검색 결과에 남은 옛 주소는 DNS를 고친다고 바로 사라지지 않습니다. 검색엔진이 다시 와서 "없음"을 확인해야 빠지니, 웹마스터 도구에서 삭제 요청을 같이 넣는 게 빠릅니다. 서브도메인을 여럿 쓰는 NAS라면, 와일드카드는 편한 만큼 안 쓰는 주소까지 전부 살려 둔다는 걸 기억해 두면 좋습니다.
확인한 공식 자료
구현 과정에서 판단 기준을 교차 확인한 공식 문서입니다. 글의 사례와 결론은 운영자가 직접 겪은 작업을 바탕으로 작성했습니다.