23.4 零配置网络(mDNS/DNS-SD)
零配置网络(Zero-configuration networking,也称 Zeroconf)是一组简化网络配置的技术,使网络设备无需管理员干预即可自动完成地址分配、域名解析与服务发现。
该功能在嵌入式设备上较为实用。在某些场景下,用户无法通过屏幕或串口获取树莓派的 IP 地址,但需通过 SSH 方式连接。树莓派 OS 默认启用 Avahi 服务且支持多播 DNS,此时用户可直接使用 ping raspberrypi.local 获取 IP 地址,或直接通过 SSH 连接 raspberrypi.local。
零配置网络的主要部分包括:
- 链路本地寻址(Link-Local Addressing),提供数值型网络地址的自动分配。
- 多播 DNS(mDNS),提供主机名的自动分发与解析。
- 基于 DNS 的服务发现(DNS-SD),提供服务实例的自动发现。
Zeroconf 的常用实现是 Avahi。nss-mdns 可在所有使用 nsswitch(名称服务切换,The Name Service Switch,NSS)的工具中,通过 mDNS 协议查找 *.local 后缀的主机名。
23.4.1 安装 Avahi 和 nss-mdns
使用 pkg 安装:
# pkg install avahi-app nss_mdns使用 Ports 安装:
# cd /usr/ports/net/avahi-app/ && make install clean
# cd /usr/ports/dns/nss_mdns/ && make install clean23.4.2 配置名称切换服务
dns/nss_mdns 将安装以下 NSS 模块。
lib/nss_mdns.so.1
lib/nss_mdns_minimal.so.1
lib/nss_mdns4.so.1
lib/nss_mdns4_minimal.so.1
lib/nss_mdns6.so.1
lib/nss_mdns6_minimal.so.1
lib/nss_mdns.so
lib/nss_mdns_minimal.so
lib/nss_mdns4.so
lib/nss_mdns4_minimal.so
lib/nss_mdns6.so
lib/nss_mdns6_minimal.so关于上述模块的说明,参见 avahi/nss-mdns。
/etc/nsswitch.conf 文件是 nsswitch 的配置文件,源代码位于 lib/libc/net/nsswitch.conf,默认文件内容如下:
#
# nsswitch.conf(5) - name service switch configuration file
#
group: compat
group_compat: nis
hosts: files dns
netgroup: compat
networks: files
passwd: compat
passwd_compat: nis
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files为了启用 mDNS,需在 hosts: files dns 行后追加 mdns 和 mdns6。
hosts: files dns mdns mdns623.4.3 启用服务
D-Bus 随 Avahi 作为依赖自动安装,将其设为开机自启:
# service dbus enable启动 D-Bus 服务:
# service dbus start将 Avahi 守护进程设置为开机自启:
# service avahi-daemon enable启动 Avahi 服务:
# service avahi-daemon start23.4.4 测试服务
执行 ping 命令测试 FreeBSD 的主机名,将显示 IP 地址。
PS C:\Users\ykla> ping ykla
正在 Ping ykla.local [192.168.179.129] 具有 32 字节的数据:
来自 192.168.179.129 的回复: 字节=32 时间=6ms TTL=64
来自 192.168.179.129 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.179.129 的回复: 字节=32 时间=3ms TTL=64
来自 192.168.179.129 的回复: 字节=32 时间=3ms TTL=64
192.168.179.129 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 1ms,最长 = 6ms,平均 = 3ms也可查看 IPv6 地址:
PS C:\Users\ykla> ping -6 ykla
正在 Ping ykla.local [fe80::20c:29ff:fe8a:22dc%18] 具有 32 字节的数据:
来自 fe80::20c:29ff:fe8a:22dc%18 的回复: 时间=1ms
来自 fe80::20c:29ff:fe8a:22dc%18 的回复: 时间=3ms
来自 fe80::20c:29ff:fe8a:22dc%18 的回复: 时间=4ms
来自 fe80::20c:29ff:fe8a:22dc%18 的回复: 时间=13ms
fe80::20c:29ff:fe8a:22dc%18 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 1ms,最长 = 13ms,平均 = 5ms与 FreeBSD 主机的实际 IP 地址一致,验证通过。
使用 SSH 连接到该设备:
PS C:\WINDOWS\system32> ssh ykla@ykla
FreeBSD 16.0-CURRENT (GENERIC) #0 main-n285005-e9fc0c538264: Mon Apr 13 12:44:54 UTC 2026
Welcome to FreeBSD!
……省略部分输出……