2025.09.28
Local decentralized DNS without DNS: Multicast DNS (mDNS)
Entering
You have two linux items (others will also work, but you'll need to google why) that you want to communicate between.
The simplest way is to use ip
, but only once. Tommorow the item will get a different ip
, you can't win it.
The simplest way is to add an alias into /etc/hosts
192.168.0.48 destination
And use the alias everywhere:
$ scp kitty.gif user@destination:
But the ip
will change anyway. But you will update it in a single place. But you will update it.
The simplest way to fix is install local DNS server on the server, make it the main server in the network, and proxy DNS queries throught it there is no.
Wouldn’t it be a breeze to avoid editing by hand?
Multicast DNS (mDNS)
In 2025 year 25 years ago was invented Multicast DNS (mDNS) which via brodcast request creates a local dynamic decentralized DNS
that you shouldn't care about. But only within the single network. And only single host per item.
How Multicast DNS (how mDNS)
In linux when it converts word-names into numbers, it uses service Name Service Switch
. This service has /etc/nsswitch.conf where it was shown where to how to look:
> cat /etc/nsswitch.conf # Name Service Switch configuration file. # See nsswitch.conf(5) for details. passwd: files systemd group: files [SUCCESS=merge] systemd shadow: files systemd gshadow: files systemd publickey: files hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns networks: files
For "hosts" it says to check first in (mymachines) local containers
Then it go to the (systemd-resolved
) dns resolver which replaced nss-dns
. If DNS
returns unavailable, it quits.
Then it checks /etc/hosts
, local hostname, and legacy DNS
.
Engaging fact: we can add another service to the list. What if we will add the Multicast DNS (mDNS)
?
Multicast DNS installation (mDNS installation)
Oviously, for literaly everyone we will have both and server, and client parts. We will do belows everywhere for harmony.
https://wiki.archlinux.org/title/Avahi
Install package libnss-mdns in deps of which is avahi
(we will add into NSS hosts
as service):
# pacman -Sy nss-mdns # emerge -av sys-auth/nss-mdns # sudo apt-get install libnss-mdns avahi-daemon avahi-utils
Next add to /etc/nsswitch.conf following string mdns_minimal [NOTFOUND=return]
:
# hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns # hosts: mymachines mdns_minimal resolve [!UNAVAIL=return] files myhostname dns
[NOTFOUND=return]
tells not to look for domains*.local
anymore, this will break entries in /etc/hosts
so you can remove it to keep everything work as before, but better.
You can also catch domains beyond *.local
, but we don't need it. We'll use /etc/hosts
for it.
Set local domain in the file /etc/avahi/avahi-daemon.conf
and reload and check:
$ cat /etc/avahi/avahi-daemon.conf | grep host-name host-name=source $ systemctl enable avahi-daemon.service # add to autorun $ systemctl restart avahi-daemon.service # run $ avahi-browse --all --verbose --resolve --terminate $ avahi-resolve-host-name source.local source.local 192.168.100.101 $ ping source.local PING source.local 56 data bytes 64 bytes from source.local : icmp_seq=1 ttl=64 time=0.031 ms 64 bytes from source.local : icmp_seq=2 ttl=64 time=0.067 ms 64 bytes from source.local : icmp_seq=3 ttl=64 time=0.056 ms ^C
The problem is that we can have only one domain per item. If you want to have multiple local domains like:
git.local server.local
You can easily do this via /etc/avahi/hosts
, but there you also have to hardcode the ip
.
The simplest way to fix it would be to run multiple instances of there is no simple way live with the single on it's all better anyway.avahi-publish &
per each domain each time calcuting dynamic local ip
Enable sftp/ssh
$ cp /usr/share/doc/avahi/sftp-ssh.service /etc/avahi/services/ $ cp /usr/share/doc/avahi/ssh.service /etc/avahi/services/ $ systemctl restart avahi-daemon.service
Second item
Quickly repeat on the second item, then check from both they aren't alone. Configure an ssh
connection by ip
between two items. Then in ssh
just replace ip
to the local domain:
$ ssh my_user@destination.local -i ~/.ssh/my_key
When eveything works we add to ~/.ssh/config
magic words:
Host destination HostName destination.local IdentityFile ~/.ssh/my_key User my_user
An alias for ssh
was magically created and fully configured:
$ ssh destination
That's all, we can now exchange files and remotely execute commands
$ cd /tmp/ $ date > temp_file $ echo "source" >> temp_file $ scp temp_file destination: $ ssh destination 'echo destination >> ~/temp_file' $ ssh destination 'cat ~/temp_file'
Uru ru ru, we can now exchange files and remotely execute commands. And now we can use domains not tied to ip
!
Leaving
There is no multidomaning on the single item, but I can live with it.
You can apply the same to NFS
and rsync
and git
!!!
And also mDNS
the base of IoT
and other home assistant
networks!