Enhancing Local Network Communication: Unix mDNS Configuration

Installation and configuration of a mDNS Server on a Unix based machine.
Operating System: Raspbian GNU/Linux 10 (buster).
mDNS Server : avahi-daemon 0.8-5+deb11u1.
Overview
Multicast Domain Name System (mDNS) è un protocollo per la risoluzione di nomi in indirizzi IP all'interno di una rete locale che non fa uso di server centralizzati, contrariamente a DNS. Si serve dello stack IP/UPD e opera all'interno di esso sull'indirizzo multicast link-local 224.0.0.251 IPv4 o FF02::FB IPv6 usando la porta UDP 5353. (Per connessioni link-local si intende quella categoria di connessioni di rete valide solo all'interno di un segmento di rete locale, che non fuoriescono quindi dal router).
Il funzionamento del protocollo mDNS si basa sulla possibilità dei dispositivi collegati alla rete di rendere pubblico il loro hostname ed indirizzo IP agli altri dispositivi della rete locale e di rispondere alle query di risoluzione di nome. Quando un dispositivo vuole risolvere un hostname in un indirizzo IP manda un pacchetto mDNS all'indirizzo 224.0.0.251 alla porta UDP 5353. Il dispositivo che con il hostname in questione risponde con un proprio pacchetto mDNS contenente il proprio indirizzo IP.
Ogni dispositivo dotato di mDNS nella rete funge da trasmettitore, annunciando il proprio hostname ed indirizzo IP alla rete, e rispondendo alle query di risoluzione di nome. Quando un dispositivo si connette ad una rete locale per la prima volta invia per conto proprio un pacchetto multicast sonda
che si traduce essenzialmente in una query di risoluzione di nome del proprio hostname. Se nessun altro dispositivo risponde alla query il dispositivo può procedere ad assegnare il proprio hostname a sè stesso in quanto unico possessore del hostname in questione nella rete. Se altri dispositivi rispondono al pacchetto sonda allora il dispositivo deve scegliere un altro hostname da assegnare a sè stesso. Successivamente al pacchetto sonda il dispositivo invia un altro pacchetto multicast mDNS contenente il proprio hostname, indirizzo IP e altre informazioni come il sistema operativo, tipo di dispositivo e assieme un record Domain Name System-Based Authentication of Named Entities (DANE) che agisce da firma digitale per assicurare l'autenticità del dispositivo.
Il protocollo mDNS dispone anche della caratteristica di risoluzione di servizi. Un dispositivo dotato di mDNS è in grado di annunciare alla rete, oltre al proprio hostname, anche i servizi che offre come Web Server, File Sharing, DataBase, servizi di stampa ecc. Gli altri dispositivi della rete quindi sono in grado di eseguire ricerche specifiche sulla rete di determinati servizi. I dispositivi che offrono quei servizi risponderanno alla ricerca con il proprio hostname ed indirizzo IP.
Il protocollo mDNS è supportato in larga scala su diverse piattaforme e sistemi operativi, tra cui Linux, macOS, Windows ed iOS. Per quanto riguarda Linux, il più comune servizio mDNS è Avahi. Il servizio Avahi daemon può essere installato e configurato per annunciare il hostname ed i servizi della macchina su cui viene installato.
I vantaggi di mDNS includono:
-
Facile risoluzione di nomi: mDNS permette di eseguire risoluzioni di nomi senza la necessità di un servizio centralizzato di nomi DNS.
-
Service discovery: mDNS permette di annunciare alla rete i servizi offerti dal dispositivo.
-
Cross-platform: mDNS è supportato su diverse piattaforme e sistemi operativi. Indipendentemente dalla piattaforma o dal sistema operativo un dispositivo dotato di mDNS può avvalersi di risolvere nomi di altri dispositivi dotati possibilmente di altri sistemi operativi e degli altri vantaggi che porta questo protocollo.
-
Disaccoppiamento: mDNS non dipende su infrastrutture esterne. Questa caratteristica lo rende un'ottima opzione per reti che devono operare indipendentemente.
-
Resilienza: l'architettura decentralizzata rende questo protocollo.
Gli svantaggi di mDNS includono:
-
Sicurezza: mDNS non è provvisto di nessun meccanismo di sicurezza per proteggersi da dispositivi malintenzionati all'interno della rete. Questo significa che è possibile per un dispositivo mascherarsi ed impersonare un altro dispositivo inviando un pacchetto mDNS contraffatto oppure ascoltando il traffico mDNS. Pur essendo dotato di DANE manca di crittografia e confidenzialità dei dati trasmessi. Inoltre questo protocollo è progettato per reti locali generalmente non dotate di firewall e controlli di accesso. Questo rende mDNS vulnerabile ad attacchi di spoofing e eavesdropping.
-
Scalabilità: mDNS is designed for use on small local networks, and may not scale well to larger networks with many devices. This can result in increased network traffic, slow response times, and increased strain on the network and devices.
-
Compatibilità: mDNS non è universalmente supportato su tutte le piattaforme e questo può portare a problemi di compatibilità a quegli utenti provvisti di dispositivi dotati di sistemi eterogenei.
-
Affidabilità: mDNS si basa surelies on all devices on the network being able to receive and respond to mDNS packets, which may not always be the case. For example, some firewalls or routers may block mDNS traffic, which can result in unreliable name resolution.
-
Privacy: mDNS può potenzialmente rivelare informazioni sensibili sui dispositivi dotati di esso, che possono essere usate da utenti malintenzionati.
-
Configurazione: In alcuni casi configurare un server mDNS può risultare complesso e potrebbe richiedere competenze tecniche.
Installazione e Configurazione
L’installazione del server DHCP avviene con il comando:
sudo apt install avahi-daemon avahi-utils libnss-mdns
Con questo comando vengono installati server mDNS, gli strumenti utili per il debug del server stesso e la libreria che consente l'utilizzo di mDNS per la risoluzione di nomi da parte del sistema operativo Linux.
Si passa quindi alla configurazione del demone avahi.
FILE: /etc/avahi/avahi-daemon.conf:
[server]
host-name=raspberrypi
#domain-name=local
#browse-domains=0pointer.de, zeroconf.org
use-ipv4=yes
use-ipv6=yes
#allow-interfaces=eth0
#deny-interfaces=eth1
#check-response-ttl=no
#use-iff-running=no
#enable-dbus=yes
#disallow-other-stacks=no
#allow-point-to-point=no
#cache-entries-max=4096
#clients-max=4096
#objects-per-client-max=1024
#entries-per-entry-group-max=32
ratelimit-interval-usec=20000
ratelimit-burst=1000
[wide-area]
enable-wide-area=yes
[publish]
#disable-publishing=no
#disable-user-service-publishing=no
#add-service-cookie=no
publish-addresses=yes
publish-hinfo=yes
publish-workstation=yes
publish-domain=yes
#publish-dns-servers=192.168.50.1, 192.168.50.2
#publish-resolv-conf-dns-servers=yes
#publish-aaaa-on-ipv4=yes
#publish-a-on-ipv6=no
[reflector]
#enable-reflector=no
#reflect-ipv=no
#reflect-filters=_airplay._tcp.local,_raop._tcp.local
[rlimits]
#rlimit-as=
#rlimit-core=0
#rlimit-data=8388608
#rlimit-fsize=0
#rlimit-nofile=768
#rlimit-stack=8388608
#rlimit-nproc=3
In questa particolare configurazione il server mDNS viene incaricato di pubblicare indirizzo, informazioni sul hardware, hostname e dominio del raspberry pi. (Nel caso di avahi, workstation è usato come sinonimo di hostname).
mDNS e nsswitch
È importante notare che su sistema Ubuntu (22.04) l'installazione della libreria libnss-mdns e la configurazione del file nsswitch.conf non basta per far funzionare la risoluzione dei nomi del sistema con mDNS. In particolare si deve creare il file mdns.allow all'interno della directory /etc. Questa problematica è stata identificata attraverso l'uso del comando shell strace.
sudo tcpdump -i ifacename port 5353 or igmp -w /tmp/tcpdump-port-5353-w.pcap
Lanciando il comando strace ping raspberrypi.local viene stampata l'intero stack di chiamate di sistema in cui è presente la lettura da parte della libreria del file in questione. Il fatto che il file non esista porta la funzione della libreria a ripiegare in errore portando la risoluzione del nome al fallimento. Per risolvere il problema è stato sufficiente creare il file all'interno della directory menzionata in precedenza e scrivere al suo interno una wildcard per evitare di crere una whitelist.
Conclusione
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.