Skip to content
blog.chrisyuan.me
Go back

mDNS 全解析:從 .local 到 Matter 智慧家庭

Updated:
Edit page

Table of contents

Open Table of contents

前言

如果有在 Raspberry Pi 上安裝過 Raspbian,網路設定完成,OpenSSH server 啟動後,就可以在同網段下,用下面指令 ssh 進去:

ssh [email protected]

為什麼可以直接用 raspberrypi.local 這個名稱找到 Raspberry Pi 裝置的 IP 呢?

起源

進入網路時代後,各種裝置都有聯網需求,既然要聯網,就少不了網路設定的步驟,雖然有 DHCP 協定,可以省去在設備裝置上設定 IP/子網路遮罩/DNS server 的流程,但如果需要連上某台設備,還是得先知道該台設備的 IP/Port 等資料才能連上,而且透過 DHCP 拿到的 IP 是有可能變動的,可能某台設備剛設定好時 IP 是 192.168.5.100,過一陣子重開機後就變成 192.168.5.200,使用這台設備的人就必須要重新設定到新的 IP 上才能繼續使用,這個步驟有沒有辦法讓他自動化呢?

現在人手一支的 iPhone,大家都知道是 Apple 的,大家也知道在 iPhone 之前 Apple 還賣了好多年 Mac 電腦,但應該很少人知道 Apple 早年還賣過印表機,在後期進入網路時代,這些印表機也能聯網,可以分享給在同一區域網路中的電腦列印,Apple 也為此開發設計了一個通訊協定 AppleTalk ,讓電腦可以和印表機溝通。再後來 AppleTalk 被 Universal Plug and Play(UPnP) 取代,其中一份網路協定 Multicast DNS(mDNS) 由 Apple工程師 Stuart Cheshire 所設計出來,這位工程師還是 Apple 中的 DEST(Distinguished Engineer, Scientist, or Technologist) ,在 Apple 裡,只有最頂尖優秀的工程師、研究學者與技術人員才會給予 DEST 頭銜。

運作原理

mDNS 是利用 Multicast (224.0.0.251(IPv4), ff02::fb(IPv6) + UDP 5353 port) 模擬出一台虛擬的 DNS server,設備裝置可以透過這個特殊的 Multicast IP + Port 暴露自己的連線方式或是擁有的能力,讓同一網路中的其他裝置也在這組 IP/Port 找到對應的設備裝置。

搭配 DNS-Based Service Discovery(DNS-SD),裝置不只能解析 .local 主機名稱,還能廣播自己提供的服務類型(如 _http._tcp_ipp._tcp),讓其他裝置自動發現可用的網頁伺服器、印表機等服務,完全不需要手動設定。

詳細細節規範可參考 RFC 6762 (Multicast DNS)RFC 6763 (DNS-Based Service Discovery) 這兩份 RFC。

後續標準演進

常見的 mDNS/DNS-SD 軟體

Apple Bonjour

Apple 的原生 mDNS/DNS-SD 實作,基於開源的 mDNSResponder。深度整合在 macOS 和 iOS 中,是 AirPlay、AirPrint、HomeKit、Time Machine 等功能的基礎。Apple 也提供 Windows 版本(隨 iTunes 安裝)。

Avahi

Linux 上最廣泛使用的 mDNS/DNS-SD 實作。Raspberry Pi 的 Raspbian 預設安裝 Avahi,這也是為什麼可以直接用 raspberrypi.local 連線的原因。

值得注意的是,Avahi 最後一個穩定版本 0.8 發布於 2020 年 2 月,至今已超過五年沒有新的正式版本。近年陸續被揭露多個安全漏洞(CVE-2024-52615、CVE-2024-52616 等),修補程式雖然已存在於專案 repository,但尚未整合發布新版本。

systemd-resolved

systemd 內建的 DNS 解析服務,支援 mDNS 名稱解析(.local 主機名稱),但服務廣播和瀏覽的功能不如 Avahi 完整。同時執行 Avahi 和 systemd-resolved 會因為搶佔 UDP 5353 port 而產生衝突,Fedora 的做法是在安裝 Avahi 時預設停用 systemd-resolved 的 mDNS 功能。

Windows 原生支援

不過 Windows 的原生 mDNS 只處理名稱解析,不支援服務廣播。需要廣播服務的應用程式仍需依賴 Bonjour 或第三方 mDNS 函式庫。

瀏覽工具

常見應用

智慧家庭

影音串流

列印服務

網路印表機是 mDNS 最早也最普及的應用之一,透過廣播 _ipp._tcp(Internet Printing Protocol)服務,macOS 和 Linux 可以自動發現印表機,完全不需要手動安裝驅動程式或設定 IP。Apple AirPrint 也是基於相同機制。

IoT 裝置

mDNS vs LLMNR

LLMNR(Link-Local Multicast Name Resolution) 是 Microsoft 開發的協定,功能與 mDNS 類似但僅提供名稱解析,不支援服務發現。

特性mDNSLLMNR
標準RFC 6762(IETF)RFC 4795(IETF)
開發者AppleMicrosoft
Multicast 位址224.0.0.251224.0.0.252
PortUDP 5353UDP 5355
網域.local任意單一標籤名稱
服務發現有(搭配 DNS-SD)
跨平台macOS / Linux / Windows / iOS / Android主要 Windows

Microsoft 在 2022 年宣布將逐步淘汰 LLMNR 和 NetBIOS,統一採用 mDNS 作為預設的 multicast 名稱解析協定。Windows Server 2025 將是最後一個內建 WINS 的 LTSC 版本。

安全注意事項

mDNS 在設計上沒有驗證機制,使用時需要留意以下風險:

防護建議


Edit page
Share this post on:

Previous Post
在 Linux 上 Local 安裝 AWS CLI v2
Next Post
選擇 SSH key 的加密演算法