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特別用途ドメインのドラフト
3件のコメント
このせいで Tailscale MagicDNS を数日間使えずにいます..
Tailscaleがこの問題を回避してくれることを期待します。
Hacker Newsのコメント
こういう些細な不具合(papercuts)のせいで macOS を離れた
LLM でバグレポートを書くこと自体は、レビューを前提とするなら構わないが、「macOS 25 では動いていた」のような明らかな誤りがそのまま入っていると信頼性が落ちる
こうしたレポートが増えると、検証の負担のせいで人々はAI が書いたレポートをそのまま捨てるようになる気がする
AI に自分の名前で文章を書かせるのは、「自分の時間は君の時間より大事だ」という印象を与える無礼な行為だ
もし公に AI の利用を明かすと都合が悪いなら、その時点でその利用目的自体を考え直すべきだ
Linux や Windows でも同じくらいつらい事例はいくらでも書ける。結局は**「どの毒を選ぶか」**の問題だ
Microsoft は後方互換性の維持、Apple は既存機能を大胆に壊すことで知られていた
最近は Microsoft も昔ほど保守的ではなく、Apple はむしろ以前より安定志向になった気がする
NixOS のようにブートメニューで前のバージョンを選べば、システム全体を元に戻せる
ノート PC では macOS を使っているが、実際の作業の大半はLinux コンテナの中でしている
macOS 26 はこれまでで最も互換性が壊れているバージョンだ
いくつもの意図的な変更によってアプリ開発が非常に難しくなった
たとえば Lunar は SDR ニット値を任意に設定できなくなって輝度制御が塞がれ、
YellowDot はマイク表示灯の明るさ調整ができなくなって使えなくなった
さらに、タイトルなしウィンドウでのマウスイベントの問題、ガンマテーブルを適用できない問題、
Clop のようなアプリでドラッグ時に元ファイルのパスを失う問題など、さまざまなバグがある
macOS 27 もそうなってほしい(ソース)
macOS の哲学があまりにも頑固で一方的で息苦しい
macOS は使っていないが、理論上は可能に見える
しばらくは諦めるしかなさそうだ
マルウェアがカメラやマイクへのアクセスを隠せないようにする措置だ
また、SDR 輝度制限は今後登場するOLED ディスプレイのバッテリー問題を先回りして防ごうとしているのかもしれない
Apple がハードウェアとソフトウェアで分離される日を今でも待っている
Apple Silicon は欲しいが、彼らの OS は嫌いだ
自分のカーネルやモジュールを直接動かせないなら、それは自分の機材ではない
隣のノート PC は coreboot で起動しているが、それが自分の哲学を表している
ローカルの Web 開発では
*.localhostを使っているすべてのモダンブラウザがこれを自動的に127.0.0.1 に解決するので、DNS 設定や hosts の修正が不要だ
ただしブラウザ以外のプログラム(python、wget など)には適用されない
*.*.localhostもサポートされているので、今では本番ドメイン構成をそのままローカルに複製できるArchiveBox はこの機能でスナップショットごとのドメイン分離を実装し、セキュリティリスクを減らした
.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 ではそうだと思う
ウィンドウの角の調整はやりにくいが、全体としては満足している
結局どの OS にもバグはある
たとえば通知ダイアログがその代表だ
ただ、カスタマイズ性の不足は残念だ
Windows 98 のような昔の UI を懐かしむのは世代差なのかもしれない
フルスクリーン切り替えの方式は独特だが、慣れれば便利だ
ただしウィンドウタイル機能の不在は不便だ
それでも Linux の方を好む。suspend や電源管理が 8 年経っても問題だが
以前、Apple が iOS で自己署名証明書を塞いでしまい、ローカル HTTPS 開発がほぼ不可能になったことがあった
なぜそういう部分に手を入れたのか理解しがたい
自分は macOS が好きだ
標準でzsh が搭載されていて、Linux でやっていたことのほとんどを個人用 PC でもできる
*.localhostは標準で動作するdnsmasq なしでも複数のホスト名を 127.0.0.1 に向けられる
*.example-privateのようなドメインは、複数の機器をプライベート IP で区別するために必要だ単に localhost だけ使うなら、127.0.0.1 を使えばいい
個人的には *mDNS の .local を使って DHCP ベースの自動設定を活用している