macOS 26에서 .internal 등 커스텀 DNS 설정이 작동하지 않음
(gist.github.com/adamamyl)- 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.1및host명령은 정상 응답을 반환하지만, 시스템 리졸버를 사용하는 앱은 모두 실패- 이는
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특수용 도메인 초안
-
Hacker News 의견들
-
이런 사소한 문제들(papercuts) 때문에 macOS를 떠났음
LLM으로 버그 리포트를 작성하는 건 검토가 전제된다면 괜찮지만, “macOS 25에서 작동했다” 같은 명백한 오류가 그대로 들어가면 신뢰가 떨어짐
이런 리포트가 늘어나면, 검증 부담 때문에 사람들이 AI가 쓴 리포트를 그냥 버리게 될 것 같음- AI가 만든 콘텐츠임을 명시하지 않는 사용은 절대 용납할 수 없다고 생각함
AI가 내 이름으로 글을 쓰게 하는 건 “내 시간은 네 시간보다 소중하다”는 인상을 주는 무례한 행위임
만약 공개적으로 AI 사용을 밝히면 곤란한 상황이라면, 그 자체로 그 사용 목적을 다시 생각해봐야 함 - 모든 OS에는 이런 사소한 문제들이 있음
Linux나 Windows에서도 똑같이 고통스러운 사례를 쓸 수 있음. 결국 “어떤 독을 고를지” 의 문제임 - 이런 문제는 수십 년째 이어져 온 Apple의 전통임
Microsoft는 하위 호환성 유지, Apple은 기존 기능을 과감히 깨는 것으로 유명했음
요즘은 Microsoft도 예전만큼 보수적이지 않고, Apple은 오히려 예전보다 안정적으로 변한 느낌임 - 어차피 Apple은 예전부터 리포트를 잘 안 읽는 회사로 유명하니, LLM 리포트를 버린다고 해도 달라질 건 없을 듯함
- 나는 모든 OS에서 이런 사소한 문제를 겪었지만, Linux에서는 롤백이 쉬움
NixOS처럼 부팅 메뉴에서 이전 버전을 선택하면 시스템 전체가 되돌아감
노트북에서는 macOS를 쓰지만, 실제 작업은 대부분 Linux 컨테이너 안에서 함
- AI가 만든 콘텐츠임을 명시하지 않는 사용은 절대 용납할 수 없다고 생각함
-
macOS 26은 지금까지 중 가장 호환성이 깨지는 버전임
여러 의도적 변경으로 앱 개발이 매우 힘들어졌음
예를 들어 Lunar 앱은 SDR 니트 수치를 임의로 설정할 수 없게 되어 밝기 제어가 막혔고,
YellowDot 앱은 마이크 표시등 밝기 조절이 막혀 쓸 수 없게 됨
또, 타이틀 없는 창의 마우스 이벤트 문제, 감마 테이블 적용 불가,
Clop 같은 앱에서 드래그 시 원본 파일 경로를 잃는 문제 등 여러 버그가 있음- iOS 27이 Snow Leopard 스타일의 안정화 버전이 될 거란 루머가 있음
macOS 27도 그렇게 되길 바람 (출처) - 음악 제작을 취미로 하는 입장에서 마이크 표시등은 정말 불필요하고 거슬림
macOS의 철학이 너무 고집스럽고 일방적이라 답답함 -
YellowDot 문제는 LUT을 이용해 녹화 점 색상을 검은색으로 매핑하는 식으로 우회할 수도 있지 않을까 생각함
macOS를 직접 쓰진 않지만 이론상 가능해 보임 - M1에서는 1600니트까지 잘 됐는데 M5에서는 600니트 이상 안 되는 이유가 이거였군요
당분간은 그냥 포기해야 할 듯함 - 마이크 점 밝기 제한은 프라이버시 보호 목적임
악성코드가 카메라·마이크 접근을 숨기지 못하게 하려는 조치임
또, SDR 밝기 제한은 곧 나올 OLED 디스플레이의 배터리 이슈를 미리 방지하려는 의도일 수도 있음
- iOS 27이 Snow Leopard 스타일의 안정화 버전이 될 거란 루머가 있음
-
Apple이 하드웨어와 소프트웨어로 분리되는 날을 여전히 기다리고 있음
Apple Silicon은 원하지만, 그들의 OS는 싫음
내 커널과 모듈을 직접 실행할 수 없다면 그건 내 장비가 아님
옆의 노트북은 coreboot로 부팅되는데, 그게 내 철학을 보여줌- Mac에서도 커널을 직접 돌릴 수 있지 않음? 문제는 드라이버 지원 아닌가?
- macOS가 완벽하진 않지만, 전체를 “끔찍하다”고 부르는 건 과장된 평가라고 생각함
- 나도 macOS가 싫진 않음. 다만 “끔찍하다”고 단정하는 건 설득력이 떨어짐
-
나는 로컬 웹 개발 시
*.localhost를 사용함
모든 현대 브라우저가 이를 자동으로 127.0.0.1로 해석하므로 DNS 설정이나 hosts 수정이 필요 없음
다만 브라우저 외의 프로그램(python, wget 등)에는 적용되지 않음-
*.*.localhost도 지원돼서, 이제 프로덕션 도메인 구조를 그대로 로컬에 복제할 수 있음
ArchiveBox는 이 기능으로 스냅샷별 도메인 격리를 구현해 보안 위험을 줄였음 - Tahoe에서는 python이나 wget에서도 잘 작동함
- Chrome에서 테스트했는데 Safari에서도 동일하게 동작할 듯함
- 나도 이 방식을 쓰고 있음. 다만
.localhost가 좀 길어서 아쉬움
예전엔.local을 썼는데 충돌이 많았음 - 우리는
dev.our-root-domain.com을 공용 DNS에서 127.0.0.1로 매핑해 사용함
-
-
오래된 Yosemite 머신에서 여러 로컬 TLD를 제공하는 설정을 써왔음
/etc/resolver방식은 이미 2014년쯤부터 폐기 예정이었는데, 이번에 완전히 제거된 듯함
대신scutil을 직접 써서 설정을 저장하는 게 정석임- 하지만
scutil만으로는 부족함
일부 macOS 조회는 여전히 mDNSResponder를 통해 이 설정을 무시하거나 덮어씀
그래서 결국 unbound나 dnsmasq를 쓰는 게 더 단순함
- 하지만
-
나도
/etc/resolver/X와 dnsmasq 조합으로 여러 TLD를 쓰고 있는데 문제 없음
설정 파일엔 항상domain지시어를 포함시킴
실제로는 거의 항상 이 설정이 필요했음
아마domain항목을 추가하면 문제 해결될 수도 있음 -
나는 주로 Linux를 쓰지만, 사람들이 왜 macOS의 디자인이 나쁘다고 하는지 잘 모르겠음
UX만 보면 macOS는 꽤 정제된 느낌이었음
Gnome 테마 중 인기 있는 것들도 대부분 macOS 스타일을 모방함- 온라인에서는 불만이 큰 사람들만 눈에 띄는 편향이 있음
특히 HN에서는 더 그렇다고 생각함 - Tahoe 버전도 대부분 괜찮았음
창 모서리 조절이 불편하긴 하지만, 전체적으로는 만족스러움
결국 모든 OS엔 버그가 있음 - Apple의 기능 추가 문화(feature creep) 때문에 UX가 매번 불필요하게 바뀌는 경우가 많음
예를 들어 알림 대화상자가 대표적임 - 나도 macOS의 미적 감각은 좋다고 생각함
다만 커스터마이징 부족이 아쉬움
Windows 98 같은 옛 UI를 그리워하는 건 세대 차이일지도 모름 - 전체적으로 UX는 마음에 듦
전체화면 전환 방식은 독특하지만 익숙해지면 편함
다만 윈도우 타일링 부재는 불편함
그래도 여전히 Linux를 선호함. suspend나 전원 관리가 8년째 문제이긴 하지만
- 온라인에서는 불만이 큰 사람들만 눈에 띄는 편향이 있음
-
예전에 Apple이 iOS에서 자체 서명 인증서를 막아버려 로컬 HTTPS 개발이 거의 불가능해졌던 적이 있음
왜 이런 부분을 건드렸는지 이해하기 어려움 -
나는 macOS를 좋아함
기본으로 zsh이 탑재되어 있고, Linux에서 하던 거의 모든 일을 개인용 컴퓨터에서도 할 수 있음 -
*.localhost는 기본적으로 작동함
dnsmasq 없이도 여러 호스트명을 127.0.0.1로 연결할 수 있음- 하지만 내부 사설 IP를 다른 주소로 매핑해야 할 때는 이 방식이 부족함
-
*.example-private같은 도메인은 여러 기기를 사설 IP로 구분하기 위해 필요함
단순히 로컬호스트만 쓰려면 그냥 127.0.0.1을 쓰면 됨
개인적으로는 mDNS의 *.local을 써서 DHCP 기반 자동 설정을 활용함