macOS 26에서 .internal 등 커스텀 DNS 설정이 작동하지 않음

1 week ago 7

  • macOS 26.3.1에서 /etc/resolver/ 기반 도메인별 DNS 설정이 비표준 TLD에 대해 무효화됨, 기존 로컬 개발 환경이 중단되는 문제 발생
  • mDNSResponder가 커스텀 TLD 요청을 mDNS로만 처리하며, 지정된 유니캐스트 네임서버를 전혀 참조하지 않음
  • .internal, .test, .home.arpa, .lan 등 IANA 루트존에 없는 TLD 전반이 실패하며, 표준 도메인(google.com 등)은 정상 작동
  • 유일한 임시 해결책은 /etc/hosts에 수동 등록하는 방식이지만, 동적 환경(Docker, Kubernetes 등) 에서는 비현실적임
  • macOS 개발자 커뮤니티에서 오랫동안 사용해온 로컬 DNS 워크플로 전체가 중단되어, 개발 도구 및 VPN 통합 기능에 광범위한 영향 발생

macOS 26에서 발생한 DNS 회귀 문제

  • macOS 26.3.1(Darwin 25.3.0, Build 25D771280a)에서 /etc/resolver/를 통한 도메인별 DNS 설정 기능이 손상됨

    • macOS 25.x까지 정상 작동하던 기능이 26 버전 업데이트 후 중단됨
    • Apple의 공식 문서(man 5 resolver)에 명시된 기능임에도 불구하고, 비표준 TLD에서 더 이상 동작하지 않음
  • mDNSResponder가 모든 커스텀 TLD 요청을 mDNS로 가로채며, 지정된 유니캐스트 네임서버를 무시함

    • getaddrinfo()를 사용하는 모든 애플리케이션(ping, curl, python3 socket)에서 “Unknown host” 오류 발생
    • tcpdump 결과, 로컬 DNS(127.0.0.1:53)로의 트래픽이 전혀 발생하지 않음
    • dns-sd -G v4 명령에서는 “No Such Record” 응답과 비정상적으로 긴 TTL(약 108,002초)이 표시됨

테스트 및 재현 절차

  • Homebrew로 설치한 dnsmasq를 로컬 DNS 리졸버로 설정하고, *.internal 또는 *.example-private 도메인을 127.0.0.1로 매핑

    • /etc/resolver/example-private 파일에 nameserver 127.0.0.1 지정
    • scutil --dns 명령에서는 해당 리졸버가 정상 등록된 것으로 표시됨
    • 그러나 ping probe.example-private 실행 시 “Unknown host” 오류 발생
  • dig @127.0.0.1host 명령은 정상 응답을 반환하지만, 시스템 리졸버를 사용하는 앱은 모두 실패

    • 이는 mDNSResponder가 내부적으로 쿼리를 차단하고, 유니캐스트 DNS를 호출하지 않기 때문임

영향을 받는 TLD 목록

TLD 상태 비고
.internal 실패 IETF 초안의 특수용 TLD, macOS 25에서는 정상
.test 실패 RFC 6761 §6.2에 따라 로컬 테스트용으로 예약됨
.home.arpa 실패 RFC 8375에 따라 가정용 네트워크용으로 예약됨
.lan 실패 비공식적이지만 널리 사용됨
기타 비등록 TLD 실패 IANA 루트존에 없는 모든 TLD
  • .test의 경우 RFC 6761에 명시된 대로 정상 DNS를 통해 해석되어야 함에도 불구하고, macOS 26은 이를 mDNS 전용으로 처리함
  • 반면, google.com, bbc.co.uk 등 IANA 등록 도메인은 기존대로 정상 동작

개발 환경 및 도구에 미치는 영향

  • 로컬 개발용 DNS 워크플로 전체가 중단

    • dnsmasq + /etc/resolver/ 조합으로 *.test, *.internal 등을 사용하는 개발자
    • Docker Desktop 및 유사 도구의 컨테이너 이름 해석 기능
    • /etc/resolver/ 파일을 자동 생성하는 Vagrant, Tailscale, VPN 클라이언트
    • Kubernetes 로컬 개발 도구(minikube, kind, k3d 등)의 *.cluster.local 해석
  • 시스템은 scutil --dns에서 리졸버 구성이 정상으로 표시되므로, 사용자는 문제를 인지하기 어렵고 로그나 오류 메시지도 없음

임시 해결책 및 한계

  • 유일하게 동작하는 방법은 /etc/hosts에 수동으로 도메인 매핑을 추가하는 것
    • 이 방식은 mDNSResponder를 완전히 우회함
    • 그러나 Docker나 동적 DNS 환경에서는 비현실적이며, 변경 시마다 sudo 권한이 필요함

기술 사양 및 검증 환경

  • macOS 26.3.1 (Build 25D771280a), Apple Silicon(arm64)
  • dnsmasq는 Homebrew를 통해 설치되어 127.0.0.1:53에서 수신
  • dig 및 host 명령은 정상 응답, ping·curl·python3 socket.getaddrinfo는 실패
  • 관련 문서 및 표준:
    • man 5 resolver — macOS의 /etc/resolver/ 메커니즘 문서
    • RFC 6761 — .test, .localhost, .invalid, .example 등 특수용 도메인 정의
    • RFC 8375 — home.arpa 도메인 정의
    • IETF draft-ietf-dnsop-interneti-mdn — .internal 특수용 도메인 초안

Read Entire Article