用 mDNS 给局域网设备配主机名:原理、配置与发行版差异
前段时间买了台 JMK M5Plus 小主机,装上 PVE 搭了个 All in One 的环境,跑了好几台虚拟机。虚拟机都是 DHCP 拿地址,平时没什么问题,但只要路由器那边 IP 段一变,所有虚拟机的地址就全跟着变,每次都得去 PVE 控制台一台一台查,烦透了。
解决办法其实很简单:给每台虚拟机配好主机名,启用 mDNS,之后直接用 hostname.local 访问,不用再管它的 IP 是多少。
mDNS 是什么
mDNS(Multicast DNS,多播 DNS)是一个零配置的局域网名称解析协议。普通 DNS 需要一台专门的 DNS 服务器集中记录「域名 → IP」的对应关系;mDNS 不需要这台服务器,它把查询以多播的形式发到局域网里(地址 224.0.0.251,端口 5353),由持有该名字的设备自己应答。
用起来的效果就是:虚拟机主机名叫 debian-vm,启用 mDNS 之后,局域网里的其他机器就能直接通过 debian-vm.local 访问它,不管它的 IP 是多少、什么时候变。.local 这个顶级域名是 mDNS 专用的保留后缀。
macOS 和 iOS 默认就支持 mDNS(苹果把这一整套叫 Bonjour),所以从 Mac 上访问 .local 主机名开箱即用。Linux 上则需要装一个实现了 mDNS 的服务——最常见的是 avahi-daemon。
第一步:设好主机名
mDNS 是靠主机名来识别设备的,所以每台虚拟机得有一个不重复的主机名。
查看当前主机名:
hostnamectl
输出里的 Static hostname 就是当前主机名。也可以直接 hostname,或者看文件 cat /etc/hostname。
改主机名用 hostnamectl,一条命令搞定,重启也不会丢:
sudo hostnamectl set-hostname my-new-hostname
改完顺手把 /etc/hosts 里的旧主机名也更新一下,避免本地解析出问题:
sudo nano /etc/hosts
找到 127.0.1.1 那行,把后面的旧主机名换成新的:
127.0.1.1 my-new-hostname
第二步:启用 mDNS(安装 avahi)
Debian / Ubuntu 上装 avahi-daemon:
sudo apt update
sudo apt install avahi-daemon
装完启动服务,并设成开机自启:
sudo systemctl enable --now avahi-daemon
--now 表示「设为开机自启的同时立刻启动」,等价于 enable + start 两条命令。
一个容易踩的坑:Debian 12 和 Ubuntu 24 默认状态不一样
在不同发行版上配 mDNS 的时候,我发现一个很容易踩的坑——同样是 Debian 系,两者的默认状态并不一致:
- Ubuntu 24 默认就装了
avahi-daemon并且开机自启,装完系统 mDNS 就是可用的,不需要上面的安装步骤。 - Debian 12 默认没有
avahi-daemon,必须按上一节手动安装并启用。
所以如果你在 Ubuntu 上不做任何配置就能 ping xxx.local 成功,到了 Debian 上却发现完全不通,多半不是配置写错了,而是这台机器压根还没装 avahi。
不确定某台机器上 avahi 到底有没有在跑,查一下状态就知道:
systemctl status avahi-daemon
看到 active (running) 就说明服务正常;如果提示 Unit avahi-daemon.service could not be found,那就是还没安装。
第三步:验证
在同一局域网的另一台机器上 ping 一下:
ping my-new-hostname.local
能通就说明 mDNS 已经生效。之后不管这台虚拟机的 IP 怎么变,hostname.local 这个地址永远有效。
几点补充
- SSH 直接用主机名:配好之后
ssh user@debian-vm.local就能连,再也不用先查 IP。这正是我折腾这套东西的初衷。 - 同名冲突:mDNS 靠名字识别设备,如果两台机器主机名相同,会发生抢占/冲突,avahi 通常会自动给后来者改成
hostname-2.local。所以务必保证每台主机名唯一。 - 跨网段不可用:mDNS 基于多播,默认只在同一个二层网络(同一局域网 / 同一 VLAN)内有效,不能跨路由器的不同网段解析。需要跨网段稳定访问,得用真正的内网 DNS 或后面我会单独写的 ZeroTier 方案。
每台虚拟机都这样配一遍,以后就彻底告别「先去面板查 IP 再连」的循环了。对家庭服务器、All in One 这种机器多又都吃 DHCP 的场景,mDNS 是性价比最高的解决办法之一。