MDNS: Difference between revisions
m (→Setup avahi2dns: Use various templates, doas instead of sudo, and minor grammar improvements.) |
No edit summary |
||
(13 intermediate revisions by 7 users not shown) | |||
Line 1: | Line 1: | ||
[https://en.wikipedia.org/wiki/Multicast_DNS Multicast DNS] is a protocol that is normally used for the discovery of printers. | {{DISPLAYTITLE:mDNS}} | ||
[https://en.wikipedia.org/wiki/Multicast_DNS Multicast DNS] is a protocol that is normally used for the discovery of printers. Avahi is a popular implementation by but more setup is needed for the regular name resolution to see the results. | |||
{{warning|There might be in issue in ipv4/ipv6 dual-setups. [https://github.com/LouisBrunner/avahi2dns/issues/21 Check this issue.]}} | |||
== Setup avahi == | == Setup avahi == | ||
Line 5: | Line 8: | ||
Install, enable and start avahi with: | Install, enable and start avahi with: | ||
{{cmd|doas apk add avahi | {{cmd|doas apk add {{pkg|avahi}} | ||
doas rc-update add avahi-daemon | doas rc-update add avahi-daemon | ||
doas rc-service avahi-daemon start}} | doas rc-service avahi-daemon start}} | ||
Line 11: | Line 14: | ||
It should now be possible to browse results. To look for a printer, use: | It should now be possible to browse results. To look for a printer, use: | ||
{{cmd|doas apk add avahi-tools | {{cmd|doas apk add {{pkg|avahi-tools}} | ||
avahi-browse --resolve --terminate _ipp._tcp}} | avahi-browse --resolve --terminate _ipp._tcp}} | ||
Line 20: | Line 23: | ||
Name resolution is implemented by musl, and it only supports DNS, so we have to map the avahi results to a regular DNS server. This is done by avahi2dns. | Name resolution is implemented by musl, and it only supports DNS, so we have to map the avahi results to a regular DNS server. This is done by avahi2dns. | ||
{{cmd| | {{cmd|doas apk add {{pkg|avahi2dns}}}} | ||
doas | |||
since we will want a full DNS server running at port 53, we need to configure avahi2dns to use another port. | since we will want a full DNS server running at port 53, we need to configure avahi2dns to use another port. This is done by default with {{path|/etc/conf.d/avahi2dns}} containing: | ||
command_args="-p 5354" | command_args="-p 5354" | ||
Line 32: | Line 31: | ||
Enable and start avahi2dns with | Enable and start avahi2dns with | ||
{{cmd|doas rc-update add | {{cmd|doas rc-update add avahi2dns | ||
doas rc-service | doas rc-service avahi2dns start}} | ||
It should now be possible to use DNS to query the address of the printer. | It should now be possible to use DNS to query the address of the printer. | ||
Line 41: | Line 40: | ||
Where printer_name is the hostname given by avahi-browse. | Where printer_name is the hostname given by avahi-browse. | ||
== Setup Networkmanager == | |||
If you are already using networkmanager, you can leverage {{pkg|dnsmasq}} as your DNS server which can easily forward mDNS requests to another server. | |||
Install the {{pkg|networkmanager-dnsmasq}} package: | |||
{{cmd|doas apk add {{pkg|networkmanager-dnsmasq}}}} | |||
Configure networkmanager to use dnsmasq as it's dns server by editing {{path|/etc/NetworkManager/NetworkManager.conf}} | |||
[main] | |||
dhcp=internal | |||
dns=dnsmasq | |||
Then we need to tell dnsmasq to forward all mDNS queries to avahidns {{path|/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 | |||
Restart networkmanager: | |||
{{cmd|doas rc-service networkmanager restart}} | |||
== Without NetworkManager == | |||
=== Setup DNS resolver === | |||
If you are not using NetworkManager, you will need to setup a DNS resolver that will forward request of .local domain to avahi2dns and handle other requests normally. There is more than one way to do it, but we document an option that is probably most convenient for a laptop: using the DHCP provided server for the regular DNS requests. We will use unbound as the server and resolvconf to inform unbound about the DHCP results. | |||
Install the programs: | Install the programs: | ||
{{cmd|doas apk add openresolv unbound | {{cmd|doas apk add {{pkg|openresolv}} {{pkg|unbound}}}} | ||
Create {{path|/etc/resolvconf.conf}}: | Create {{path|/etc/resolvconf.conf}}: | ||
name_servers=127.0.0.1 | name_servers=127.0.0.1 | ||
unbound_conf=/etc/unbound | unbound_conf=/etc/unbound/unbound.conf.d/resolvconf.conf | ||
This tells resolveconf to use a local nameserver and pass the DHCP provided DNS server to unbound | This tells resolveconf to use a local nameserver and pass the DHCP provided DNS server to unbound | ||
Create {{path|/etc/unbound/unbound.conf}}: | Create {{path|/etc/unbound/unbound.conf.d/avahi-local.conf}}: | ||
forward-zone: | forward-zone: | ||
name: "local" | name: "local" | ||
forward-addr: 127.0.0.1@5354 | forward-addr: 127.0.0.1@5354 | ||
server: | server: | ||
do-not-query-localhost: no | do-not-query-localhost: no | ||
Line 66: | Line 91: | ||
This reads the information provided by resolvconf, but forwards .local requests to avahi2dns. We also need to disable dnssec for .local and tell unbound that it is OK to query localhost. | This reads the information provided by resolvconf, but forwards .local requests to avahi2dns. We also need to disable dnssec for .local and tell unbound that it is OK to query localhost. | ||
Enable and start unbound | |||
{{cmd|doas rc-update add unbound | |||
doas rc-service unbound start}} | |||
=== Using bind(named) as DNS resolver === | |||
It is assumed that bind(named) is already installed and running, if not, then you can use the instructions[[https://wiki.alpinelinux.org/wiki/Small-Time_DNS_with_BIND9]] | |||
If you already have a bind(named) server configured, then the solution is to set an access "zone" for postfix addresses.local | |||
To do this, add the following lines to the bind configuration file (by default, the /etc/bind/named.conf file is used): | |||
zone "local" { | |||
type forward; # type requests | |||
forward only; # rule to use only forwards | |||
forwarders { | |||
127.0.0.1 port 5354; # Avahi2dns adress and port | |||
}; | |||
}; | |||
Additionally, you may need to disable dnssec verification for the .local postfix. To do this, add the following lines inside the options configuration: | |||
options { | |||
... | |||
validate-except { | |||
"local"; | |||
}; | |||
... | |||
}; | |||
After adding the configuration, double-check that you have a .local zone. To do this, use the command: | |||
named-checkconf -l # OUTPUT: local IN _default forward | |||
If there were no errors, you can reload the bind(named) service: | |||
rc-service named reload | |||
=== Setup DHCP client === | |||
How send the DHCP provided DNS to resolvconf depends on the DHCP client being used. | |||
==== udhcpc ==== | |||
This is the DHCP client in busybox, and will work for both wired and wireless interfaces. | |||
Create {{path|/etc/udhcpc/udhcpc.conf}}: | |||
RESOLV_CONF="/etc/udhcpc-resolv.conf" | |||
Create {{path|/etc/udhcpc/post-bound/resolvconf}}: | |||
#!/bin/sh | |||
cat /etc/udhcpc-resolv.conf | resolvconf -a $interface | |||
and make it executable | |||
{{cmd|chmod 755 /etc/udhcpc/post-bound/resolvconf}} | |||
An inconvenience of this setup is that udhcpc will not reconfigure the interface when connecting to other wifi networks. For that to happen one has to run | |||
{{cmd|iwctl station wlan0 connect <network_name> | |||
doas kill -USR2 $(cat /run/udhcpc.wlan0.pid) | |||
doas kill -USR1 $(cat /run/udhcpc.wlan0.pid)}} | |||
==== iwd ==== | |||
To avoid having to manually reconfigure the wifi interface, we can configure iwd to use DHCP internally and forward DNS server info to resolveconf. To do that create {{path|/etc/iwd/main.conf}}: | |||
[General] | |||
EnableNetworkConfiguration=True | |||
[Network] | [Network] | ||
NameResolvingService=resolvconf | NameResolvingService=resolvconf | ||
== Test the setup == | |||
You should now be able to query for both the printer address and regular addresses with | |||
{{cmd|drill @127.0.0.1 <printer_name>.local | {{cmd|drill @127.0.0.1 <printer_name>.local | ||
Line 86: | Line 179: | ||
Printer discovery should now be working. | Printer discovery should now be working. | ||
[[Category:Networking]] |
Latest revision as of 16:31, 3 April 2025
Multicast DNS is a protocol that is normally used for the discovery of printers. Avahi is a popular implementation by but more setup is needed for the regular name resolution to see the results.

Setup avahi
Install, enable and start avahi with:
doas apk add avahi doas rc-update add avahi-daemon doas rc-service avahi-daemon start
It should now be possible to browse results. To look for a printer, use:
doas apk add avahi-tools avahi-browse --resolve --terminate _ipp._tcp
Make note of the hostname, as we will use it afterwards.
Setup avahi2dns
Name resolution is implemented by musl, and it only supports DNS, so we have to map the avahi results to a regular DNS server. This is done by avahi2dns.
doas apk add avahi2dns
since we will want a full DNS server running at port 53, we need to configure avahi2dns to use another port. This is done by default with /etc/conf.d/avahi2dns containing:
command_args="-p 5354"
Enable and start avahi2dns with
doas rc-update add avahi2dns doas rc-service avahi2dns start
It should now be possible to use DNS to query the address of the printer.
drill -p 5354 @127.0.0.1 <printer_name>.local
Where printer_name is the hostname given by avahi-browse.
Setup Networkmanager
If you are already using networkmanager, you can leverage dnsmasq as your DNS server which can easily forward mDNS requests to another server.
Install the networkmanager-dnsmasq package:
doas apk add networkmanager-dnsmasq
Configure networkmanager to use dnsmasq as it's dns server by editing /etc/NetworkManager/NetworkManager.conf
[main] dhcp=internal dns=dnsmasq
Then we need to tell dnsmasq to forward all mDNS queries to 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
Restart networkmanager:
doas rc-service networkmanager restart
Without NetworkManager
Setup DNS resolver
If you are not using NetworkManager, you will need to setup a DNS resolver that will forward request of .local domain to avahi2dns and handle other requests normally. There is more than one way to do it, but we document an option that is probably most convenient for a laptop: using the DHCP provided server for the regular DNS requests. We will use unbound as the server and resolvconf to inform unbound about the DHCP results.
Install the programs:
doas apk add openresolv unbound
Create /etc/resolvconf.conf:
name_servers=127.0.0.1 unbound_conf=/etc/unbound/unbound.conf.d/resolvconf.conf
This tells resolveconf to use a local nameserver and pass the DHCP provided DNS server to unbound
Create /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"
This reads the information provided by resolvconf, but forwards .local requests to avahi2dns. We also need to disable dnssec for .local and tell unbound that it is OK to query localhost.
Enable and start unbound
doas rc-update add unbound doas rc-service unbound start
Using bind(named) as DNS resolver
It is assumed that bind(named) is already installed and running, if not, then you can use the instructions[[1]]
If you already have a bind(named) server configured, then the solution is to set an access "zone" for postfix addresses.local
To do this, add the following lines to the bind configuration file (by default, the /etc/bind/named.conf file is used):
zone "local" { type forward; # type requests forward only; # rule to use only forwards forwarders { 127.0.0.1 port 5354; # Avahi2dns adress and port }; };
Additionally, you may need to disable dnssec verification for the .local postfix. To do this, add the following lines inside the options configuration:
options { ... validate-except { "local"; }; ... };
After adding the configuration, double-check that you have a .local zone. To do this, use the command:
named-checkconf -l # OUTPUT: local IN _default forward
If there were no errors, you can reload the bind(named) service:
rc-service named reload
Setup DHCP client
How send the DHCP provided DNS to resolvconf depends on the DHCP client being used.
udhcpc
This is the DHCP client in busybox, and will work for both wired and wireless interfaces.
Create /etc/udhcpc/udhcpc.conf:
RESOLV_CONF="/etc/udhcpc-resolv.conf"
Create /etc/udhcpc/post-bound/resolvconf:
#!/bin/sh cat /etc/udhcpc-resolv.conf | resolvconf -a $interface
and make it executable
chmod 755 /etc/udhcpc/post-bound/resolvconf
An inconvenience of this setup is that udhcpc will not reconfigure the interface when connecting to other wifi networks. For that to happen one has to run
iwctl station wlan0 connect <network_name> doas kill -USR2 $(cat /run/udhcpc.wlan0.pid) doas kill -USR1 $(cat /run/udhcpc.wlan0.pid)
iwd
To avoid having to manually reconfigure the wifi interface, we can configure iwd to use DHCP internally and forward DNS server info to resolveconf. To do that create /etc/iwd/main.conf:
[General] EnableNetworkConfiguration=True
[Network] NameResolvingService=resolvconf
Test the setup
You should now be able to query for both the printer address and regular addresses with
drill @127.0.0.1 <printer_name>.local drill @127.0.0.1 alpinelinux.org
Your /etc/resolv.conf should also contain
nameserver 127.0.0.1
Printer discovery should now be working.