On Mon, 09 Feb 2026 at 19:49:56 +0100, Aurelien Jarno wrote:
On 2026-02-07 10:50, Simon McVittie wrote:
$ strace -e openat,connect getent hosts remnant.local
...

I think there are two issues with this command:

- You should add a final dot, so that the search is not expanded with
 the search domains from /etc/resolv.conf, which libnss-mdns obviously
 can't handle and then goes to your configured recursive DNS resolver.

Good catch, that makes sense. Yes, I confirm that with the final dot, I get one DNS resolution (which you've explained below as the SOA check for .local, rather than actually resolving remnant.local., so that's benign) followed by mDNS resolution via Avahi.

- You should use ahosts instead of hosts. hosts uses the deprecated
 gethostbyname2() interface, which does explicit lookups with AF_INET
 and AF_INET6. The latter is not supported given your nsswitch.conf.

I agree that `getent ahosts` is a better choice than `getent hosts`, because it replicates the behaviour we'd expect from a modern application that does an AF_UNSPEC lookup.

 Alternatively you should either add mdns6_minimal entry or even better
 use mdns_minimal instead (why isn't that the default noawdays?).

mdns_minimal is intentionally not the default because it was observed to cause long delays (5+ seconds) in legacy software that implements IPv6 by doing one lookup with AF_INET6, followed by a second lookup with AF_INET only after failure of the first lookup has been reported, in the scenario where the responding host (remnant.local in my example) is IPv4-only. In that scenario, it would wait 5 seconds for an IPv6 response that will never happen, and then do a second, IPv4 query which gets a result immediately.

More modern software that does an AF_UNSPEC lookup, or AF_INET and AF_INET6 in parallel ("happy eyeballs"), would be OK with mdns_minimal, but Avahi/nss-mdns upstream specifically asked us not to make that the default. Because mDNS is inherently a local LAN protocol, the reasons to prefer IPv6 don't really apply to it: RFC1918 and RFC3927 addresses are readily available, even if globally-routable IPv4 addresses are not.

mdns6_minimal is only provided for completeness, and is basically pointless: everyone should use either mdns_minimal or mdns4_minimal.

openat(AT_FDCWD, "/etc/hosts", O_RDONLY|O_CLOEXEC) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), 
sin_addr=inet_addr("127.0.0.53")}, 16) = 0

This one is due to libnss-mdns doing a SOA lookup of the .local domain.
This is by design in libnss-mdns, which implements the heuristic
described in https://support.apple.com/en-us/HT201275. This is not
linked with glibc.

Yes, that makes sense. We can tell it's this because it happens after /etc/hosts is opened, which means it's after the "files" step in nsswitch.conf.

    smcv

Reply via email to