mDNS
多播 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
打印机发现现在应该可以工作了。