mDNS与DNS-SD以及在Matter中使用 - FreeBuf网络安全行业门户
十二月 22, 2025 [网络与安全] #obsidian #协议与标准 #安全 #网络mDNS与DNS-SD以及在Matter中使用 - FreeBuf网络安全行业门户
原文链接:https://www.freebuf.com/articles/network/404855.html
一、mDNS
多播DNS(Multicast DNS,简称mDNS)是一种用于局域网(LAN)内设备自动进行域名解析的协议。它在没有中央DNS服务器的情况下,允许设备自我注册和查询主机名、IP 地址等信息。mDNS 使用与标准DNS相同的报文格式。mDNS通常和DNS-SD一起使用,用于服务发现和名称解析。
工作原理
mDNS使用IP组播(Multicast)技术,通过发送DNS查询和响应报文来实现主机名到IP地址的解析。mDNS使用固定的IPv4多播地址224.0.0.251和IPv6多播地址FF02::FB,在UDP端口5353上进行通信。以下是mDNS的工作步骤:
- 启动和自注册: 每个设备启动时,会选择一个主机名(如 "hostname.local")并通。过向mDNS的组播地址发送查询请求,询问这个主机名是否已经存在。如果没有冲突,设备就会使用这个主机名注册自己。
- 冲突检测和名称分配: 如果已有设备使用相同的主机名,新设备需要尝试不同的名称,直到选定一个唯一的主机名。
- 名称解析: 当设备需要解析某个主机名的IP地址时,它会发送一个mDNS查询报文到局域网内的多播地址,所有接收到报文的设备都会检查查询的主机名是否匹配。如果匹配,它们会回复一个响应报文,包含相应的IP地址信息。
示例
设备自注册
假设设备1自注册其主机名"device1.local"。
-
设备1发送查询报文,检查是否有其他设备使用同样的主机名:
QUERY: Name: device1.local Type: ANY -
如果没有设备回复该查询,设备1将自己的主机名 "device1.local" 和IP地址进行自注册
名称解析
设备2在网络中查询 "device1.local" 的IP地址:
-
设备2发送查询报文,查找 "device1.local" 的A记录:
QUERY: Name: device1.local Type: A -
设备1收到查询后,发送响应报文:
ANSWER: Name: device1.local Type: A Address: 192.168.1.2
实现
典型的mDNS实现包括:
- Apple的Bonjour:广泛用于Apple设备中,用于自动发现局域网中的设备和服务。
- Avahi:一个开源的mDNS和DNS-SD实现,常用于Linux系统中。
二、DNS-SD
DNS-SD(DNS-Based Service Discovery,即基于DNS的服务发现)是一个网络协议框架,它基于mDNS实现。DNS-SD主要用于在本地网络中自动发现并使用网络服务,如打印机、文件共享、媒体播放等。
工作原理
DNS-SD借助于多播DNS(mDNS),在本地网络内进行服务的发现和发布。以下是DNS-SD的基本工作原理:
- 服务注册: 服务提供者自注册。该信息通常包括服务名称、类型(如 "_http._tcp")、端口号、及其他附加参数。
- 服务发现: 客户端在本地网络中查询特定类型的服务。例如,客户端广播一个查询,想找到所有的 "_http._tcp" 服务。其它设备收到这个查询后,会响应其提供的服务信息。
- 服务解析: 客户端在发现服务后,可以进一步解析获取具体的服务细节。例如,从服务名称解析出具体的 IP 地址和端口号。
DNS-SD 记录类型
DNS-SD 中采用了多个特定的 DNS 记录类型来进行服务的发现和信息传递:
- PTR 记录:用于枚举网络中某一类型的所有服务。例如,"_http._tcp.local" PTR 记录列出了网络中所有的 HTTP 服务。
- SRV 记录:提供具体的服务主机名和端口信息;每个服务有一个或者多个 SRV 记录。
- TXT 记录:用来存储与服务相关的任意文本信息,如服务的配置选项等。
- A/AAAA 记录:将服务主机名解析为一个或多个 IP 地址。
限制
- 局域网范围:DNS-SD 和 mDNS 一般只在局域网内工作,因为它们使用多播地址。
- 名称冲突:多个设备在同一个局域网内提供相同名称服务时,会发生名称冲突,需要进行名称分配和冲突解决机制。
使用场景
DNS-SD 被广泛应用于各种需要自动发现网络服务的应用环境,如家庭网络、办公室局域网、多媒体设备连接等。例如:
- Apple 的 Bonjour 服务发现技术就是基于 DNS-SD 和 mDNS 实现的。
- 各种智能家居设备和 IoT 设备的互联互通,比如Matter。
示例
下面通过一个示例详细描述Matter协议中如何使用DNS-SD进行服务发现和解析。如果Matter设备可以预先接入局域网,并且没有提供蓝牙、Thread等模式,那么就只能通过DNS-SD进行设备发现。
1. 服务注册
假设一个Matter设备注册其服务信息,服务类型为"_matter._tcp"。为了便于理解,以下描述仅为了展示流程,实际上Matter使用DNS-SD会比下面的描述要复杂,字段里面会含有更多的信息,实际流程是一样的:
PTR记录:
_matter._tcp.local. IN PTR Device-1234._matter._tcp.local.
SRV记录:
Device-1234._matter._tcp.local. IN SRV 0 0 5555 Device-1234.local.
TXT记录:
Device-1234._matter._tcp.local. IN TXT "model=abc123" "version=1.0"
A/AAAA记录:
Device-1234.local. IN A 192.168.1.100 Device-1234.local. IN AAAA fe80::1
2. 服务发现
客户端设备发送DNS-SD查询,寻找服务类型为"_matter._tcp"的设备:
- DNS查询:
_matter._tcp.local. IN PTR - 接收查询响应:
_matter._tcp.local. IN PTR Device-1234._matter._tcp.local.
3. 服务解析
客户端解析服务实例"Device-1234._matter._tcp.local.":
- SRV记录解析:
Device-1234._matter._tcp.local. IN SRV 0 0 5555 Device-1234.local. - TXT记录解析:
Device-1234._matter._tcp.local. IN TXT "model=abc123" "version=1.0" - A/AAAA记录解析:
Device-1234.local. IN A 192.168.1.100 Device-1234.local. IN AAAA fe80::1
DNS-SD在Matter中的优点
- 即插即用:无需预配置,设备可自动广播和发现服务。
- 跨厂商互操作性:基于标准的DNS协议,确保不同厂商设备之间的互操作性。
- 动态更新:支持设备上线、下线时动态更新服务信息。