
2026/03/20 0:06
macOS 26 はカスタム DNS 設定(`.internal` を含む)を破壊します。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
macOS 26.3.1 は、IANAルートゾーンにリストされていないトップレベルドメイン(TLD)— 例:.internal、.test、*.home.arpa、および .emflocal のようなカスタムゾーン — に対して暗黙的に DNS 解決を無効化する回帰が導入されました。
mDNSResponder はこれらのクエリを捕捉し、それらをマルチキャスト DNS とみなし、
/etc/resolver/ で指定されたユニキャストネームサーバーに転送しません。その結果、システムレベルのツール(ping、curl、socket.getaddrinfo() など)は「Unknown host」エラーを報告しますが、scutil --dns は解決器設定がアクティブであると表示し、誤った正確性感覚を与えます。
この回帰は macOS 25.x 26.3.0 から 26 にアップグレードした直後に発生し、RFC 6761 を違反しています。RFC 6761 は .test をローカルテスト用に予約しており、通常の DNS 解決を要求します。標準的な IANA 登録 TLD(例:google.com)はデフォルト解決器経由で正常に解決され続けます。ローカル解決器への直接クエリ(
dig @127.0.0.1 …)は正しい IP アドレスを返しますが、システムアプリケーションはそれらを無視します。
回避策としては
/etc/hosts に静的エントリを追加する方法しかなく、Docker コンテナのような動的環境には実用的ではありません。この問題は Feedback Assistant(ID 22280434)で報告されており、現在プライベート TLD を使用したローカル開発ワークフロー(dnsmasq + /etc/resolver/、Docker Desktop コンテナ名解決、Vagrant/Tailscale VPN クライアント、および *.cluster.local を使用する Kubernetes ツール)を脅かしています。本文
問題概要
macOS 26 は、IANA ルートゾーンに登録されていないすべてのトップレベルドメイン(TLD)について、
/etc/resolver/ に設定されたドメイン別 DNS リゾルバを静かに破棄します。mDNSResponder はこれらのクエリをマルチキャスト DNS(mDNS)として処理し、リゾルバファイルで指定されたユニキャストネームサーバーを参照しません。このため、macOS 25 では正常に動作していたローカル開発やプライベートネットワークの DNS ワークフローが中断します。
背景
はドメイン別 DNS 設定を可能にする仕組みです。/etc/resolver/
例:
という名前のファイルにinternal
を記述すると、nameserver 127.0.0.1
のクエリはすべてローカルネームサーバーへ転送されます。*.internal- この機能は man 5 resolver に文書化され、macOS 10.6 以降安定して使用されています。
- 開発者はしばしばプライベートドメインを回答するローカル DNS サーバー(例:dnsmasq, bind, unbound)を稼働させます。
対象マシンでは Homebrew でインストールした
dnsmasq が次のように設定されています:
# /opt/homebrew/etc/dnsmasq.d/test.conf address=/probe.example-private/127.0.0.1
リゾルバファイルは
example‑private のクエリをローカルサーバーへ転送します。
再現手順
| ステップ | コマンド | 期待される結果 |
|---|---|---|
| 1 | | で dnsmasq が稼働 |
| 2 | | |
| 3 | | リゾルバファイル作成 |
| 4 | | DNS キャッシュをフラッシュし、mDNSResponder を再起動 |
| 5 | `scutil --dns | grep -A4 "example-private"` |
| 6 | | 失敗 – “Unknown host” |
| 7 | | 失敗 – |
期待される動作
ping、curl、ブラウザ、あるいは
getaddrinfo() を呼び出す任意のアプリケーションは、dnsmasq の address= 指令と /etc/resolver/example-private によって定義されたルートを経由し、probe.example-private を 127.0.0.1 へ解決するべきです。macOS 25 ではこの挙動が確認できていました。
実際の挙動
- すべての解決試行が “Unknown host” で失敗します。
- DNS トラフィックは
に届きません(tcpdump でポート 53 のパケットはゼロ)。dnsmasq - mDNSResponder は内部的に「No Such Record」の応答を返し、TTL が非常に大きい値(約108,002 秒)となります。
証拠例:
dns-sd -G v4 probe.example-private Timestamp A/R Flags IF Hostname Address TTL 11:42:03.617 Add 40000002 0 probe.example-private. 0.0.0.0 108002 No Such Record
対象 TLD(失敗するもの)
| TLD | 状態 | 備考 |
|---|---|---|
| 壊れた | IETF ドラフトの特別用途 TLD。macOS 25 では機能していた |
| 壊れた | RFC 6761 §6.2 – ローカルテスト用に予約 |
| 壊れた | RFC 8375 – 居住型プライベートネットワーク |
| 壊れた | 一般的な慣習だが IANA で登録されていない |
未登録 TLD(例:) | 壊れた | IANA ルートゾーンに存在しない |
IANA に正式登録された TLD(例:
google.com, bbc.co.uk)は引き続き機能します。
回避策
唯一確実な回避策は
/etc/hosts に手動でエントリを追加することです。これにより mDNSResponder をバイパスできますが、動的環境には非現実的であり、変更ごとに sudo が必要になります。
影響
(例:dnsmasq +/etc/resolver/
,*.test
,*.local
)を利用したローカル開発 DNS ワークフローが中断します。*.internal- Docker Desktop、Vagrant、Tailscale、VPN クライアント、および Kubernetes のローカルツールがプライベート TLD 用に生成するリゾルバ設定は無音で失敗します。
でリゾルバ構成を確認できても、ログやエラーメッセージなしに解決失敗が発生します。scutil --dns
環境
| 項目 | 値 |
|---|---|
| macOS バージョン | 26.3.1 (Darwin 25.3.0, Build 25D771280a) |
| アーキテクチャ | Apple Silicon (arm64) |
| dnsmasq | Homebrew インストール、127.0.0.1:53 でリッスン |
| 回帰発生時期 | macOS 25.x の直前の夜間アップデート後に発生 |
参考文献
- man 5 resolver –
に関する macOS ドキュメント。/etc/resolver/ - RFC 6761 – 特別用途ドメイン名(
,.test
,.localhost
,.invalid
)。.example - RFC 8375 –
の特別用途。home.arpa - IETF draft‑ietf-dnsop-interneti-mdn –
の提案。.internal
Apple Feedback Assistant へのリンク
https://feedbackassistant.apple.com/feedback/22280434(ログインが必要)