mDNS

来自 Alpine Linux

多播 DNS 是一种通常用于发现打印机的协议。 Avahi 是一个流行的实现,但需要更多设置才能进行常规名称解析以查看结果。

设置 avahi

安装、启用并启动 avahi,使用

doas apk add avahi doas rc-update add avahi-daemon doas rc-service avahi-daemon start

现在应该可以浏览结果了。要查找打印机,请使用

doas apk add avahi-tools avahi-browse --resolve --terminate _ipp._tcp

记下主机名,我们稍后会用到它。

设置 avahi2dns

名称解析由 musl 实现,它只支持 DNS,所以我们必须将 avahi 结果映射到常规 DNS 服务器。 这由 avahi2dns 完成。

doas apk add avahi2dns

因为我们想要一个完整的 DNS 服务器在端口 53 上运行,我们需要配置 avahi2dns 使用另一个端口。 这默认通过包含以下内容的 /etc/conf.d/avahi2dns 完成

 command_args="-p 5354"

启用并启动 avahi2dns,使用

doas rc-update add avahi2dns doas rc-service avahi2dns start

现在应该可以使用 DNS 查询打印机的地址了。

drill -p 5354 @127.0.0.1 <printer_name>.local

其中 printer_name 是 avahi-browse 给出的主机名。

设置 NetworkManager

如果您已经在使用 NetworkManager,您可以利用 dnsmasq 作为您的 DNS 服务器,它可以轻松地将 mDNS 请求转发到另一个服务器。

安装 networkmanager-dnsmasq 软件包

doas apk add networkmanager-dnsmasq

配置 NetworkManager 使用 dnsmasq 作为其 dns 服务器,通过编辑 /etc/NetworkManager/NetworkManager.conf

 [main] 
 dhcp=internal
 dns=dnsmasq

然后我们需要告诉 dnsmasq 将所有 mDNS 查询转发到 avahidns /etc/NetworkManager/dnsmasq.d/mdns.conf

 # Forward queries for the "local" domain to 127.0.0.1 port 5354
 server=/local/127.0.0.1#5354

重启 NetworkManager

doas rc-service networkmanager restart

不使用 NetworkManager

设置 DNS 解析器

如果您不使用 NetworkManager,您将需要设置一个 DNS 解析器,它将 .local 域的请求转发到 avahi2dns,并正常处理其他请求。 有多种方法可以做到这一点,但我们记录了一个对于笔记本电脑来说可能最方便的选项:使用 DHCP 提供的服务器进行常规 DNS 请求。 我们将使用 unbound 作为服务器,并使用 resolvconf 来告知 unbound DHCP 结果。

安装程序

doas apk add openresolv unbound

创建 /etc/resolvconf.conf

 name_servers=127.0.0.1
 unbound_conf=/etc/unbound/unbound.conf.d/resolvconf.conf

这告诉 resolvconf 使用本地名称服务器并将 DHCP 提供的 DNS 服务器传递给 unbound

创建 /etc/unbound/unbound.conf.d/avahi-local.conf

 forward-zone:
       name: "local"
       forward-addr: 127.0.0.1@5354
 server:
       do-not-query-localhost: no
       domain-insecure: "local"

这读取 resolvconf 提供的信息,但将 .local 请求转发到 avahi2dns。 我们还需要为 .local 禁用 dnssec,并告诉 unbound 可以查询 localhost。

启用并启动 unbound

doas rc-update add unbound doas rc-service unbound start

设置 DHCP 客户端

如何将 DHCP 提供的 DNS 发送到 resolvconf 取决于所使用的 DHCP 客户端。

udhcpc

这是 busybox 中的 DHCP 客户端,适用于有线和无线接口。

创建 /etc/udhcpc/udhcpc.conf

 RESOLV_CONF="/etc/udhcpc-resolv.conf"

创建 /etc/udhcpc/post-bound/resolvconf

 #!/bin/sh
 cat /etc/udhcpc-resolv.conf | resolvconf -a $interface

并使其可执行

chmod 755 /etc/udhcpc/post-bound/resolvconf

这种设置的一个不便之处是,当连接到其他 wifi 网络时,udhcpc 不会重新配置接口。 为了实现这一点,必须运行

iwctl station wlan0 connect <network_name> doas kill -USR2 $(cat /run/udhcpc.wlan0.pid) doas kill -USR1 $(cat /run/udhcpc.wlan0.pid)

iwd

为了避免手动重新配置 wifi 接口,我们可以配置 iwd 在内部使用 DHCP 并将 DNS 服务器信息转发到 resolvconf。 为此,创建 /etc/iwd/main.conf

 [General]
 EnableNetworkConfiguration=True
 [Network]
 NameResolvingService=resolvconf

测试设置

现在您应该能够使用以下命令查询打印机地址和常规地址:

drill @127.0.0.1 <printer_name>.local drill @127.0.0.1 alpinelinux.org

您的 /etc/resolv.conf 还应包含

 nameserver 127.0.0.1

打印机发现现在应该可以工作了。