Upgrading to macOS Sequoia broke mDNS for me.
My M2 MacBook stopped responding when pinging its host name lithium.local
.
The Anki sync server
running on it became unreachable. It didn’t matter whether I attempted to
resolve lithium.local
from another machine or on that machine itself.
Searching the system log for clues, or changing mDNS related configurations did not help. Turning it off and on again didn’t help either.
Searching system logs for hints turned out to be a rabbit hole. On Debian or
NixOS, I can always just search the logs in /var/log
or journalctl
for
hints. Recent macOS versions are really good at
masking useful debug information
in logs. A few guides,
like this one here,
tell you to add a configuration profile to unmask log information: 5 minutes
later and you are in a Apple Configurator rabbit hole.
All I need is to map a host name to an IP address, without relying on a central
DNS server. Before giving in and just adding the affected machine’s IP address
to every single /etc/hosts
file on all my computers, I wanted to find a
duct-tape quick-fix.
I want to show you a workaround for getting your macOS to respond to mDNS queries again without having to reinstall macOS:
If you ever encounter your macOS machine not responding to mDNS queries because
mDNSResponder
gave up working, you can use dns-sd -R
. Just run the
following command:
# Assuming that $(hostname) is your machine's host name
dns-sd -R $(hostname).local _device-info._tcp local 0
Verify that it works by querying your machine’s host name using dns-sd -q
:
dns-sd -q $(hostname).local
DATE: ---Sat 21 Dec 2024---
22:31:11.112 ...STARTING...
Timestamp A/R Flags IF Name Type Class Rdata
22:31:11.113 Add 40000003 1 $HOST.local. Addr IN 127.0.0.1
22:31:11.113 Add 40000002 11 $HOST.local. Addr IN 192.x1.y2.z3
mDNS and DNS are similar, to a large degree. In the transport layer, mDNS is DNS. In the network layer, mDNS sends packets out as multicast instead. Seriously, it’s mind-blowing
Theoretically, you should be able to run the following dig
invocation and get
the same result as when using dns-sd -q
.
dig +short @224.0.0.251 -p 5353 $(hostname).local
You can intercept mDNS query using the following tcpdump
invocation:
sudo tcpdump -i lo0 -n 'port 5353'
When tcpdump
then intercepts the query with dig
, you may see something like
the following:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo0, link-type NULL (BSD loopback), snapshot length 262144 bytes
22:37:12.525546 IP 127.0.0.1.52740 > 224.0.0.251.5353: 19746+ [1au] A (QM)? $HOST.local. (54)
22:37:12.528499 IP 127.0.0.1.5353 > 127.0.0.1.52740: 19746*- 1/0/1 A 192.x1.y2.z3 (75)
Unfortunately, running dig
this way doesn’t show me the query results in
there, but please write me if it works on your machine.