HA探究篇-mDNS分析
起因
在配置好HomeAssistant
后,我发现在管理界面,它只需要在浏览器输入http://homeassistant:8123
就可以访问到HA的管理界面。根据之前折腾路由器的经验,这域名应该在路由器中的DNS记录了才可被解析呀,身为一个局域网设备,它是怎么能将自己的DNS解析发布出来的呢?它又不可能直接修改路由器中的DNS表。于是我抓了下局域网的包,分析下这个协议的工作过程。
抓包
我的主机在192.168.1.10,HA服务器在192.168.1.123
“No.” | “Time” | “Source” | “Destination” | “Protocol” | “Length” | “Info” | |
---|---|---|---|---|---|---|---|
“198” | “3.678602” | “192.168.1.10” | “223.5.5.5” | “DNS” | “86” | “Standard query 0x2131 HTTPS _8123._https.homeassistant” | |
“199” | “3.678611” | “192.168.1.10” | “223.5.5.5” | “DNS” | “86” | “Standard query 0x2131 HTTPS _8123._https.homeassistant” | |
“200” | “3.679403” | “192.168.1.10” | “192.168.1.255” | “NBNS” | “92” | “Name query NB HOMEASSISTANT<00>” | |
“201” | “3.679410” | “192.168.1.10” | “192.168.1.255” | “NBNS” | “92” | “Name query NB HOMEASSISTANT<00>” | |
“202” | “3.681246” | “192.168.1.10” | “224.0.0.251” | “MDNS” | “79” | “Standard query 0x0000 A homeassistant.local | “QM” question” |
“203” | “3.681254” | “192.168.1.10” | “224.0.0.251” | “MDNS” | “79” | “Standard query 0x0000 A homeassistant.local | “QM” question” |
“204” | “3.681703” | “192.168.1.123” | “224.0.0.251” | “MDNS” | “89” | “Standard query response 0x0000 A, cache flush 192.168.1.123” | |
“205” | “3.681711” | “192.168.1.123” | “224.0.0.251” | “MDNS” | “89” | “Standard query response 0x0000 A, cache flush 192.168.1.123” | |
“212” | “3.684134” | “192.168.1.10” | “224.0.0.252” | “LLMNR” | “73” | “Standard query 0x64d7 A homeassistant” | |
“213” | “3.684138” | “192.168.1.10” | “224.0.0.252” | “LLMNR” | “73” | “Standard query 0x64d7 A homeassistant” | |
“234” | “3.685123” | “192.168.1.123” | “192.168.1.10” | “LLMNR” | “89” | “Standard query response 0x64d7 A homeassistant A 192.168.1.123” | |
“235” | “3.685127” | “192.168.1.123” | “192.168.1.10” | “LLMNR” | “89” | “Standard query response 0x64d7 A homeassistant A 192.168.1.123” |
分析
可以看到,当我的主机输入http://homeassistant:8123
地址时,电脑自动给223.5.5.5
(这是阿里DNS的地址)、192.168.1.255
、224.0.0.251
和224.0.0.252
,这四个地址发送数据包,让它们试图解析这个域名。
其中的前两个地址不是关心的重点。一个是公共DNS,一个是NBNS(NetBIOS Name Service)。重点看第三个地址,注意到它的协议是mDNS。
mDNS
根据查到的资料:
mDNS(Multicast DNS)是一种基于组播的协议,用于在局域网内解析本地主机名和 IP 地址之间的映射关系。mDNS 协议是 Zero Configuration Networking(Zeroconf)技术的一部分,它允许设备在不需要任何配置的情况下自动发现和连接到网络上的其他设备。
mDNS 协议的工作原理如下:
- 主机发送查询请求:当主机需要解析另一个主机的主机名时,它将向组播地址 224.0.0.251 发送一个查询请求。查询请求中包含了需要解析的主机名和查询请求的 ID。
- 局域网内的所有主机都收到查询请求:局域网内的所有主机都会收到查询请求,但只有那些已经注册了与查询请求匹配的主机名的主机才会作出响应。
- 主机作出响应:如果一个主机已经注册了与查询请求匹配的主机名,它将向查询请求的源主机发送一个响应。响应中包含了主机名、IP 地址和查询请求的 ID。
- 源主机收到响应:当源主机收到响应时,它将使用响应中包含的 IP 地址来建立与目标主机的连接。
需要注意的是,mDNS 协议只能在同一局域网内使用,因为它使用的是组播地址和局域网广播。另外,mDNS 协议不需要任何中央服务器或域名系统的支持,因此它非常适合用于小型网络或临时网络,例如家庭网络、会议室网络或 Wi-Fi 热点。
可以明确知道,HA正是用了mDNS协议,实现了域名解析。而我的计算机查找域名的过程,是从公共DNS出发,再查找本地NBNS,之后查找mDNS,最后查找LLMNR。这和我的网络配置相符合,我自定义了DNS服务器,使它指向223.5.5.5
,所以它跳过了查找本地DNS服务器的过程,而是直接向阿里DNS发送请求。
本地数据包分析
回到mDNS,如上图,主机向组播地址224.0.0.251
,这个mDNS协议组播地址发出DNS请求,问:“homeassistant.local
在哪个地址呀?”
之后,HA的服务器便回复了:“homeassistant.local
在地址192.168.1.123
”
这样,便完成了一次域名解析过程。而我的主机也会将这个地址记录下来,直到DNS刷新或者是DNS记录值过期。
总结
其实mDNS和DNS还是很相似的,都是向某个地址发请求,等待回应,保存DNS解析记录。不过由于mDNS用的是组播地址,它便可以不需要服务器就可完成解析。只要服务端存活,服务端收到来自组播的信息,就会发出回应。这样做的好处很明显了,可以在配置完成后,在局域网内输入域名,即可自动获取到服务器的IP,免去了人工查找服务端IP地址的过程。
最后来段ChatGPT总结的优缺点吧。
多播 DNS(mDNS)协议是一种在局域网(LAN)中进行 DNS 解析和服务发现的协议。以下是 mDNS 协议的优点和缺点:
优点:
简化网络配置:mDNS 协议可以让设备自动发现和连接其他设备,无需手动配置 DNS 服务器或 DHCP 服务器。这使得网络更加易于部署和管理,并且可以减少网络故障的可能性。
提高网络可靠性:mDNS 协议使用多播地址来广播 DNS 查询和回复消息,这可以减少网络负载并提高网络响应速度。此外,mDNS 协议在没有 DNS 服务器的情况下仍然可以工作,因此即使网络中出现故障,设备和服务也可以继续通信。
支持零配置网络:mDNS 协议是支持零配置网络(Zero Configuration Networking,Zeroconf)的重要组成部分。Zeroconf 技术可以帮助设备自动配置网络,并使其可以在没有中央服务器的情况下发现和连接其他设备。
缺点:
安全性问题:mDNS 协议的广播特性可以使网络中的任何设备都可以看到其他设备和服务。这可能会导致安全隐患,例如未经授权的设备可以访问网络上的其他设备和服务。
可扩展性问题:由于 mDNS 协议使用广播消息,因此在大型网络中使用可能会导致网络负载过高,从而降低网络性能和可扩展性。
兼容性问题:不是所有的设备和服务都支持 mDNS 协议。这可能会导致在某些情况下,设备和服务无法相互通信或无法正确工作。
不难看出,它的优势很明显,可以简化网络配置,简化网络结构,自然提高了稳定性。劣势则是兼容性和安全性问题,很容易受到中间人攻击,劫持DNS来截获一些私密信息。但在有一定安全性的局域网内,mDNS对HA则是很合适了。我还注意到它还支持LLMNR协议,可以说开发组的考虑很周到了。