← ~/notes · 2 min read

macOS가 새 도메인을 거부할 때 — NXDOMAIN negative cache

Cloudflare DNS 레코드는 분명히 만들었고 1.1.1.1엔 정상 응답인데, 내 Mac에서만 안 잡혔다. 원인은 30분 전 캐시.

목차
  1. 원인 — Negative Cache
  2. 해결
  3. 처음 의심했던 것들
  4. 잘못된 길로 빠지지 않으려면
  5. TTL 무시하는 negative cache
  6. 한 줄 정리

블로그 도메인 blog.hyeonbin.net을 새로 만들고 Cloudflare에 DNS 레코드를 추가했다.

$ nslookup blog.hyeonbin.net 1.1.1.1
Address: 172.67.157.85
Address: 104.21.93.143

문제 없음. 그런데 브라우저에선 안 열림. curl도 안 됨.

$ curl https://blog.hyeonbin.net/
curl: (6) Could not resolve host: blog.hyeonbin.net

원인 — Negative Cache

DNS는 응답이 있을 때만 캐싱하는 게 아니다. NXDOMAIN(존재하지 않음) 응답도 캐시한다. 캐시가 비싸서 그런다.

도메인을 만들기 전에 누가(아마 Mac이 알아서 백그라운드로) blog.hyeonbin.net을 한 번 조회했고, 그때 NXDOMAIN을 받아서 시스템 DNS resolver가 캐시했다. 그 후 도메인을 만들어도 캐시는 갱신 안 되니, 시스템은 계속 “그런 도메인 없음”이라고 답한다.

nslookup은 시스템 resolver를 안 거치고 1.1.1.1에 직접 물어보니 정상 응답. 시스템 resolver는 negative cache를 들고 있어서 거부.


해결

macOS의 캐시를 두 군데 다 비워야 한다.

sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
  • dscacheutil -flushcache — Directory Service 캐시
  • mDNSResponder HUP 시그널 — Bonjour + DNS 리졸버 데몬 캐시

둘 다 해야 비로소 갱신된다. 한쪽만 하면 다른 쪽에서 stale 응답을 계속 준다.


처음 의심했던 것들

부끄럽지만 처음엔 다 엉뚱한 곳을 의심했다.

  • “Cloudflare에서 서브도메인 설정 안 한 거 아냐?” → 했음. 1.1.1.1에 응답 정상.
  • “방화벽?” → 다른 도메인은 됨.
  • “SSL 문제?” → 그러면 다른 에러가 떴어야 함.
  • “Cloudflare가 이상한가?” → curl로 IP 직접 때리면 응답 옴.

핵심 단서는 **“nslookup은 되는데 curl은 안 됨”**이었다. 이건 거의 항상 시스템 resolver 캐시 문제.

nslookup vs dig vs host는 특정 서버를 지정해서 직접 묻는다. 반면 curl/ping/브라우저는 시스템 resolver를 거친다. 둘이 답이 다르면 시스템 resolver의 캐시 또는 hosts 파일 또는 mDNS가 범인.


잘못된 길로 빠지지 않으려면

이런 상황에서 진단 순서는:

# 1) 권위 있는 서버에 직접 묻기
dig @1.1.1.1 blog.hyeonbin.net +short

# 2) 시스템 resolver에 묻기
dig blog.hyeonbin.net +short

# 1번은 응답 있고 2번은 없으면 시스템 캐시 문제 확정
sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder

# 다시 2번 확인
dig blog.hyeonbin.net +short

이 4줄이면 5초.


TTL 무시하는 negative cache

$ dig @1.1.1.1 blog.hyeonbin.net
;; ANSWER SECTION:
blog.hyeonbin.net. 300 IN A 172.67.157.85

권위 응답 TTL은 300초. 그런데 macOS의 negative cache는 보통 15분 ~ 1시간 유지된다 (정확한 시간은 SOA 레코드의 minimum-TTL). 새 도메인 만들고 5분 기다린다고 해결 안 된다.

기다릴 필요 없이 그냥 위 두 명령어 치면 끝.


한 줄 정리

증상의심
다른 도메인은 되는데 새 도메인만 안 됨NXDOMAIN negative cache
dig @1.1.1.1은 되는데 curl은 안 됨시스템 resolver 캐시
5분 후에 자동 해결 안 됨negative cache TTL 길게 박힘

치료:

sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder

DNS 디버깅의 절반은 “어디서 캐싱되고 있나”를 추적하는 일이다. 그 캐시가 negative일 수도 있다는 걸 잊으면 한 시간 잃는다.