AVAHI vs systemd-resolved: which is easier to manage at scale on a Linux fleet (defaults, config files, troubleshooting)?
Networking System Software

AVAHI vs systemd-resolved: which is easier to manage at scale on a Linux fleet (defaults, config files, troubleshooting)?

9 min read

In a Linux fleet, Avahi and systemd‑resolved solve adjacent but different problems. Avahi implements mDNS/DNS‑SD for Zeroconf‑style service discovery on the local network; systemd‑resolved is a general DNS and stub resolver service. At scale, “easier to manage” depends on what you need: Bonjour‑compatible service discovery, predictable DNS resolution, or both.

Quick Answer: The best overall choice for fleet‑wide, predictable name resolution is systemd‑resolved. If your priority is Bonjour/Zeroconf‑compatible local service discovery (printers, file shares, peer apps), Avahi + nss‑mdns is often a stronger fit. For mixed scenarios where you need both classic DNS and mDNS/DNS‑SD, consider running systemd‑resolved with Avahi and nss‑mdns together, with clear resolver and nsswitch boundaries.

At-a-Glance Comparison

RankOptionBest ForPrimary StrengthWatch Out For
1systemd‑resolvedFleet‑wide DNS and split‑horizon setupsCentralized, policy‑driven DNS resolver with systemd integrationmDNS support is limited vs Avahi; behavior varies by distro defaults
2Avahi + nss‑mdnsZeroconf/Bonjour‑style local service discoveryRobust mDNS/DNS‑SD implementation and *.local hostname lookupNot a general DNS resolver; requires careful nsswitch ordering
3systemd‑resolved + AvahiMixed DNS + service discovery fleetsClear separation: DNS via resolved, discovery via AvahiMore moving parts; need explicit configuration to avoid conflicts

Comparison Criteria

We evaluated each option against the following criteria to keep the comparison grounded in day‑to‑day fleet operations:

  • Defaults & behavior on common distros: How each component behaves out‑of‑the‑box on major Linux distributions, and how predictable that behavior is at scale.
  • Configuration model & files: How you express policy (DNS servers, search domains, mDNS scopes, service publishing) and how easy it is to reason about in Git, config management, and OS images.
  • Troubleshooting & observability: How quickly operators can debug “hostname resolution is weird” or “service isn’t discoverable” on hundreds or thousands of machines.

Detailed Breakdown

1. systemd‑resolved (Best overall for fleet‑wide DNS and policy control)

systemd‑resolved ranks as the top choice because it centralizes DNS behavior for the OS, integrates with other systemd components, and is already wired into many distributions’ networking stacks.

What it does well:

  • Central DNS policy enforcement:
    systemd‑resolved gives you a single resolver daemon with:

    • Global and per‑link DNS servers
    • Per‑link search domains and routing domains
    • DNS over TLS (DoT) support on newer systemd versions
    • A standard stub listener (127.0.0.53) used by /etc/resolv.conf on many distros

    At scale, that means you can have predictable behavior for VPN interfaces, corporate DNS, and split‑horizon zones, expressed via networkd or NetworkManager integration.

  • Tight integration with modern Linux networking:

    • Plays directly with systemd-networkd and NetworkManager
    • Exposes status via systemd-resolve --status or resolvectl
    • Comes enabled by default (or at least installed) on most systemd‑based distros

    You get a uniform interface to debug “which DNS servers are actually being used” across your fleet, and you can script against it in a consistent way.

Tradeoffs & Limitations:

  • Limited mDNS/DNS‑SD vs Avahi:
    systemd‑resolved can do basic mDNS name resolution for *.local and sometimes service discovery, but:

    • It does not replace Avahi’s full mDNS/DNS‑SD feature set
    • Interoperability with Bonjour/Zeroconf setups is less battle‑tested than Avahi
    • Service publishing and browsing APIs are not as mature or widely used as Avahi’s D‑Bus API

    For “find printers to print to” and full service browsing, systemd‑resolved alone is not enough in most real deployments.

  • Behavior differences across distros:
    Some distributions:

    • Symlink /etc/resolv.conf to systemd‑resolved’s stub
    • Others generate a static /etc/resolv.conf and leave resolved disabled
    • Some use NetworkManager’s own resolver settings

    At fleet scale, you need to standardize on a pattern per OS image; otherwise, your troubleshooting story gets noisy.

Decision Trigger: Choose systemd‑resolved as your primary resolver if you want consistent DNS behavior across all hosts, need per‑link policies (VPNs, containers, different uplinks), and your main problems are “which DNS server answered this query?” rather than mDNS/DNS‑SD service discovery.


2. Avahi + nss‑mdns (Best for Zeroconf/Bonjour‑style local discovery)

Avahi + nss‑mdns is the strongest fit here because it implements the mDNS/DNS‑SD protocol suite explicitly for Zeroconf‑style LAN discovery and integrates cleanly with the system via D‑Bus and nsswitch.

What it does well:

  • Full mDNS/DNS‑SD service discovery:
    Avahi is “a system which facilitates service discovery on a local network via the mDNS/DNS‑SD protocol suite.” That means, on a LAN you can:

    • Browse printers automatically
    • Find file shares and peer applications
    • Interoperate with Apple macOS Bonjour and other Zeroconf stacks

    It’s primarily targeted at Linux and ships by default in most distributions, so you’re working with a component that’s already trusted as plumbing.

  • System‑level hostname resolution via nss‑mdns:
    With the nss‑mdns project, you enable *.local lookups via mDNS in all system programs using nsswitch. Practically, that means:

    • ping hostname.local works
    • CLI tools and daemons that rely on glibc’s resolver will see mDNS hosts
    • You control precedence via /etc/nsswitch.conf (for example, hosts: files mdns4_minimal [NOTFOUND=return] dns)

    At scale, this is the missing piece that makes Avahi matter beyond GUI tools – every process using libc resolution gets mDNS.

Tradeoffs & Limitations:

  • Not a general DNS resolver:
    Avahi is not a replacement for /etc/resolv.conf or your upstream DNS:

    • It doesn’t manage recursive DNS or split horizon
    • It doesn’t arbitrate between corporate DNS, VPN DNS, and public resolvers
    • It’s scoped to local network service discovery (mDNS/DNS‑SD)

    You still need a DNS resolver (systemd‑resolved, dnsmasq, unbound, or similar) to handle normal domain lookups.

  • Configuration spread across Avahi + nsswitch:
    At scale you manage:

    • /etc/avahi/avahi-daemon.conf (daemon settings, interfaces, publish behavior)
    • /etc/avahi/services/*.service (XML definitions for static services you want to advertise)
    • /etc/nsswitch.conf (how mdns or mdns4_minimal is ordered relative to files and dns)

    It’s not complicated, but you do need to standardize patterns across images or Ansible roles so hostname.local behaves identically everywhere.

Decision Trigger: Choose Avahi + nss‑mdns if your main goal is Bonjour/Zeroconf‑compatible service discovery on the LAN, you want Linux machines to find printers and file shares automatically, and you’re comfortable pairing Avahi with a separate DNS resolver for non‑local domains.


3. systemd‑resolved + Avahi (Best for mixed DNS + discovery fleets)

systemd‑resolved + Avahi stands out for this scenario because it lets you keep systemd‑resolved as the authoritative DNS resolver while handing mDNS/DNS‑SD and service publishing to a mature, Bonjour‑compatible stack.

What it does well:

  • Clear separation of responsibilities:

    • systemd‑resolved: handles classic DNS, DoT, per‑link policies, VPN/search domains
    • Avahi: handles mDNS/DNS‑SD browsing and publishing
    • nss‑mdns (optional but recommended): integrates mDNS into glibc resolver via nsswitch

    This keeps DNS troubleshooting (corporate zones, public internet) conceptually separate from “why can’t this host see that printer.local?”

  • Matches real mixed environments:
    In fleets where:

    • Laptops move between corporate networks and home networks
    • Printers and file servers use Bonjour
    • You need both “resolv.conf makes sense” and “AirPrint‑style discovery works,”

    this combined approach lets you scale predictable DNS while still giving users “plug in and instantly find what’s available” behavior on the LAN.

Tradeoffs & Limitations:

  • More moving parts, more documentation:
    With both daemons running, you need:

    • A documented policy on mDNS scope: which interfaces Avahi listens on, what you publish
    • Standardized /etc/nsswitch.conf entries so mdns resolution doesn’t surprise you
    • Awareness of any overlapping mDNS features in systemd‑resolved so you don’t double‑announce or have conflicting behavior

    The result is powerful, but it requires a bit more upfront design for fleet‑level consistency.

Decision Trigger: Choose systemd‑resolved + Avahi if you want strong DNS controls (per‑link, VPN‑friendly) and first‑class Zeroconf discovery, and you’re willing to own a slightly more complex—but explicit—configuration story.


Comparison Criteria in Practice

Defaults & distro behavior at scale

  • systemd‑resolved

    • Often enabled by default on systemd‑based distros; /etc/resolv.conf may be a symlink to run/systemd/resolve/stub-resolv.conf.
    • Behavior can diverge between distros (Ubuntu vs Debian vs Fedora), so standardize in your base images or cloud-init.
  • Avahi

    • “Primarily targetted at Linux systems and ships by default in most distributions.”
    • Typically enabled on desktop profiles; often disabled or not installed on minimal server images.
  • nss‑mdns

    • Not always installed by default, even where Avahi is present.
    • Needs explicit entries in /etc/nsswitch.conf to influence hosts: resolution.

At scale, the easiest path is to codify:

  • “Our servers: systemd‑resolved only, no Avahi.”
  • “Our developer laptops: systemd‑resolved + Avahi + nss‑mdns, with a known hosts: line.”

Or an equivalent split that reflects your fleet’s roles.

Configuration model & files

  • systemd‑resolved:

    • Global config: /etc/systemd/resolved.conf
    • Per‑link DNS via systemd-networkd unit files or NetworkManager profiles
    • Very amenable to config management and immutable images
  • Avahi:

    • Daemon config: /etc/avahi/avahi-daemon.conf (interfaces, publish settings, allow‑interfaces/deny‑interfaces, etc.)
    • Static services: drop XML into /etc/avahi/services/ to publish without writing code.
    • Dynamic services: use Avahi’s D‑Bus API for applications that need runtime registration/browsing.
  • nss‑mdns:

    • Single touchpoint: /etc/nsswitch.conf
    • At scale you enforce a standard hosts: ordering via config management to avoid regressions.

Troubleshooting & observability

For “works on my machine, broken on this one” incidents, you typically walk the stack in this order:

  • systemd‑resolved:

    • resolvectl status / systemd-resolve --status
    • resolvectl query example.com
    • Check service/unit state: systemctl status systemd-resolved
  • Avahi:

    • avahi-browse -a to see all discoverable services on the LAN
    • avahi-resolve-host-name hostname.local to test single host resolution
    • systemctl status avahi-daemon and logs via journalctl -u avahi-daemon
  • nsswitch / nss‑mdns:

    • Inspect /etc/nsswitch.conf to verify mdns entries
    • Use getent hosts hostname.local to exercise the glibc resolver in a distro‑agnostic way

At scale, these are straightforward to script, which makes it easier to codify “runbook checks” for when a cohort of machines is behaving differently.


Final Verdict

For a Linux fleet where the primary challenge is centralized, predictable DNS resolution (corporate zones, VPNs, split‑horizon behavior), systemd‑resolved is easier to manage at scale. It gives you a coherent resolver story, integrates with systemd networking, and is already the default in many distributions.

When your priority is Bonjour/Zeroconf‑style local discovery—“plug in and instantly find printers to print to or find files being shared”—Avahi plus nss‑mdns is the right tool. It implements the mDNS/DNS‑SD protocol suite directly, plays well with macOS Bonjour, and exposes clear integration surfaces via D‑Bus and /etc/avahi/services.

Most real fleets benefit from a layered approach: systemd‑resolved for DNS and Avahi (+ nss‑mdns) for local service discovery, with explicit nsswitch and interface policies. That separation keeps each component doing the job it was designed for and gives operators clear, protocol‑aligned troubleshooting paths.

Next Step

Get Started](https://avahi.org)