Introduction

DGX Spark で自宅ローカル内の .local というドメインの名前解決をしようとしたら名前解決ができなかったのでメモ。
Windows や Mac では名前解決ができ、かつ他のホスト名は名前解決ができていたためかなり混乱した。

Why?

結論としては、 systemd-resovled の仕様。
systemd-resolved の公式ドキュメント PROTOCOLS AND ROUTING によれば

Note that by default lookups for domains with the “.local” suffix are not routed to DNS servers, unless the domain is specified explicitly as routing or search domain for the DNS server and interface. This means that on networks where the “.local” domain is defined in a site-specific DNS server, explicit search or routing domains need to be configured to make lookups within this DNS domain work. Note that today it’s generally recommended to avoid defining “.local” in a DNS server, as RFC6762[3] reserves this domain for exclusive MulticastDNS use.

デフォルトでは、ドメインがDNSサーバーおよびインターフェースのルーティングドメインまたは検索ドメインとして明示的に指定されていない限り、「.local」というサフィックスを持つドメインの検索はDNSサーバーにルーティングされません。つまり、サイト固有のDNSサーバーで「.local」ドメインが定義されているネットワークでは、このDNSドメイン内での検索を機能させるために、明示的な検索ドメインまたはルーティングドメインを設定する必要があります。なお、RFC6762[3]ではこのドメインをMulticastDNS専用として予約しているため、現在では一般的に、DNSサーバーで「.local」を定義しないことが推奨されています。

とある。
つまり .local というホスト名は systemd-resolved だけでなく、mDNS の RFC においても特別扱いされていてたというわけである。
試してはいないが、 systemd-resolved は Ubuntu 15.04 で初めて導入がされているため、最初からこの仕様だった可能性がある (mDNS の仕様も 2013年と Ubuntu 15.04 より早い)

実際、 dig をよく見てみると、 mDNS について警告が出ていた。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ dig wazuh.taktak.local

; <<>> DiG 9.18.39-0ubuntu0.24.04.3-Ubuntu <<>> wazuh.taktak.local
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 28599
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;wazuh.taktak.local. IN A

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Tue May 05 16:12:59 JST 2026
;; MSG SIZE rcvd: 47

WARNING: .local is reserved for Multicast DNS と。
一方で DNS に登録してある、サフィックスが .local でないホスト名はきちんと名前解決ができている。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ dig wazuh.taktak.internal

; <<>> DiG 9.18.39-0ubuntu0.24.04.3-Ubuntu <<>> wazuh.taktak.internal
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52269
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;wazuh.taktak.internal. IN A

;; ANSWER SECTION:
wazuh.taktak.internal. 0 IN A 192.168.11.106

;; Query time: 1 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Tue May 05 16:13:04 JST 2026
;; MSG SIZE rcvd: 66

一応

1
$ resolvectl domain <interface> "~.local"

みたいにすれば、そのインターフェースからの名前解決において、 .local を DNS に問い合わせに行くように変更できるが、当然非推奨。
だって、 mDNS の問い合わせの挙動が変わってしまうし。

Use .internal instead of .local

ということで代わりに .internal を使いなさい、というのが世界のルールとのこと。
既に ICANN でも決議 Approved Resolutions | Special Meeting of the ICANN Board | 29 July 2024 されており、あとは IETF の A Top-level Domain for Private Use 標準化待ち (2026/07/04 期限で既に 5 回改定されている)

ICANN での話し合いのときに「(.INTERNALは) 長すぎる」とかの意見があったみたいですが、ここまで来ればもう確定だと思うので、 .internal を使うようにしましょう。