- Avahi is a free Zero-configuration networking (zeroconf) implementation, including a system for multicast DNS/DNS-SD service discovery. It allows programs to publish and discover services and hosts running on a local network with no specific configuration. For example you can plug into a network and instantly find printers to print to, files to look at and people to talk to. It is licensed under the GNU Lesser General Public License (LGPL).
Install the package.
You can manage the Avahi daemon with
avahi-daemon.service using systemd.
systemd-resolved.serviceentirely before using Avahi.
Avahi provides local hostname resolution using a "hostname.local" naming scheme. To enable it, install the start/enable
Then, edit the file
/etc/nsswitch.conf and change the
hosts line to include
mdns_minimal [NOTFOUND=return] before
hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns
- If you experience slowdowns in resolving
.localhosts try to use
- The line above makes
nss-mdnsauthoritative for the
.localdomain, unless your unicast DNS server responds to
SOAqueries for the top level
localname, or if the request has more than two labels. See
Configuring mDNS for custom TLD
mdns_minimal module handles queries for the
.local TLD only. Note the
[NOTFOUND=return], which specifies that if
mdns_minimal cannot find
*.local, it will not continue to search for it in
In case you want Avahi to support other TLDs, you should:
mdns_minimal [NOTFOUND=return]with the full
mdnsmodule. There also are IPv4-only and IPv6-only modules
domain-nameof your choice
- whitelist Avahi custom TLDs in
Avahi includes several utilities which help you discover the services running on a network. For example, run
$ avahi-browse --all --ignore-local --resolve --terminate
to discover services in your network.
The Avahi Zeroconf Browser (
avahi-discover – note that it needs Avahi's optional dependencies , and ) shows the various services on your network. You can also browse SSH and VNC Servers using
Be sure to open UDP port
5353 if you are using a firewall.
Link-Local (Bonjour/Zeroconf) chat
Avahi can be used for Bonjour protocol support under Linux. Check Wikipedia:Comparison of instant messaging clients or List of applications#Instant messaging clients for a list of clients supporting the Bonjour protocol.
Obtaining IPv4LL IP address
By default, if you are getting IP using DHCP, you are using thepackage. It can attempt to obtain an IPv4LL address if it failed to get one via DHCP. By default this option is disabled. To enable it, comment noipv4ll string:
... #noipv4ll ...
# avahi-autoipd -D
Avahi advertises the services whose
*.service files are found in
/etc/avahi/services. Files in this directory must be readable by the
If you want to advertise a service for which there is no
*.service file, it is very easy to create your own.
As an example, let us say you wanted to advertise a quote of the day (QOTD) service operating per RFC:865 on TCP port
17 which you are running on your machine
The first thing to do is to determine the
<type>. indicates that the type should be "the DNS-SD service type for this service. e.g. '_http._tcp'". Since the DNS-SD register was merged into the IANA register in 2010, we look for the service name on the IANA register or in
/etc/services file. The service name shown there is
qotd. Since we are running QOTD on tcp, we now know the service is
_qotd._tcp and the port (per IANA and RFC 865) is
Our service file is thus:
<?xml version="1.0" standalone='no'?><!--*-nxml-*--> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name replace-wildcards="yes">%h</name> <service> <type>_qotd._tcp</type> <port>17</port> </service> </service-group>
For more complicated scenarios, such as advertising services running on a different server, DNS sub-types and so on, consult.
Avahi comes with an example service file to advertise an SSH server. To enable it:
# cp /usr/share/doc/avahi/ssh.service /etc/avahi/services/
.service file in
/etc/avahi/services with the following contents:
<?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name replace-wildcards="yes">NFS Music Share on %h</name> <service> <type>_nfs._tcp</type> <port>2049</port> <txt-record>path=/data/shared/Music</txt-record> </service> </service-group>
The port is correct if you have insecure as an option in your
/etc/exports; otherwise, it needs to be changed (note that insecure is needed for macOS clients). The path is the path to your export, or a subdirectory of it. For some reason the automount functionality has been removed from Leopard, however a script is available. This was based upon this post.
With the Avahi daemon running on both the server and client, the file manager on the client should automatically find the server.
You can also auto-discover regular FTP servers, such as vsftpd. Install the package and change the settings of vsftpd according to your own personal preferences (see this thread on ubuntuforums.org or ).
.service file in
/etc/avahi/services with the following contents:
<?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name>FTP file sharing</name> <service> <type>_ftp._tcp</type> <port>21</port> </service> </service-group>
The FTP server should now be advertised by Avahi. You should now be able to find the FTP server from a file manager on another computer in your network. You might need to enable #Hostname resolution on the client.
AirPrint from Mobile Devices
Avahi along with CUPS also provides the capability to print to just about any printer from airprint compatible mobile devices. In order to enable print capability from your device, simply create an Avahi service file for your printer in
/etc/avahi/services/. An example of a generic services file for an HP-Laserjet printer would be similar to the following with the
note fields changed.
<?xml version="1.0" standalone='no'?><!--*-nxml-*--> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name>yourPrnterName</name> <service> <type>_ipp._tcp</type> <subtype>_universal._sub._ipp._tcp</subtype> <port>631</port> <txt-record>txtver=1</txt-record> <txt-record>qtotal=1</txt-record> <txt-record>rp=printers/yourPrnterName</txt-record> <txt-record>ty=yourPrnterName</txt-record> <txt-record>adminurl=http://126.96.36.199:631/printers/yourPrnterName</txt-record> <txt-record>note=Office Laserjet 4100n</txt-record> <txt-record>priority=0</txt-record> <txt-record>product=(GPL Ghostscript)</txt-record> <txt-record>printer-state=3</txt-record> <txt-record>printer-type=0x801046</txt-record> <txt-record>Transparent=T</txt-record> <txt-record>Binary=T</txt-record> <txt-record>Fax=F</txt-record> <txt-record>Color=T</txt-record> <txt-record>Duplex=T</txt-record> <txt-record>Staple=F</txt-record> <txt-record>Copies=T</txt-record> <txt-record>Collate=F</txt-record> <txt-record>Punch=F</txt-record> <txt-record>Bind=F</txt-record> <txt-record>Sort=F</txt-record> <txt-record>Scan=F</txt-record> <txt-record>pdl=application/octet-stream,application/pdf,application/postscript,image/jpeg,image/png,image/urf</txt-record> <txt-record>URF=W8,SRGB24,CP1,RS600</txt-record> </service> </service-group>
Alternatively, https://raw.github.com/tjfontaine/airprint-generate/master/airprint-generate.py can be used to generate Avahi service files. It depends on and . The script can be run using:
# python3 airprint-generate.py -d /etc/avahi/services
Hostname changes with appending incrementing numbers
This is a known bug that is caused by a hostname race condition. One possible workaround is disabling IPv6 to attempt to prevent the race condition. If multiple interfaces are present use allow-interfaces to limit Avahi to a single interface. Another possible workaround is to disable the cache to prevent Avahi from checking for host name conflicts altogether, but this prevents Avahi from performing lookups.
systemd-resolved prevents nss-mdns from working
nss-mdns only works if the DNS server listed in
/etc/resolv.conf returns NXDOMAIN to SOA queries for the "local" domain. Even if systemd-resolved is configured with
MulticastDNS=no in , it will not return NXDOMAIN for these queries. See systemd issue 21659.
A solution is to use the full
mdns NSS module instead of
mdns_minimal and create
/etc/mdns.allow to allow only the "local" domain. For example:
hosts: mymachines mdns [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns