Multicast DNS Daemon

This is early stage documentation, but at least attempts to cover some basic usage, and bring umdns usage out of the dark.

mDNS, also known as Bonjour or zero-configuration networking (ZeroConf) or DNS Service Discovery (DNS-SD), enables automatic discovery of computers, devices, and services on IP networks. It is an internet standard documented in RFC6762.

The umdns package provides a compact implementation of this standard, well integrated with the OpenWrt system environment. In particular, almost all interaction with the daemon is via ubus.

  • mdnsd - provided by Apple's mDNSResponder package
  • avahi - A fairly full, but quite large implementation
/etc/config/umdns
config umdns
        option jail 1
        list network lan
        list network dmz # Provides visibility into both networks, but does not act as a repeater

Note that it may be unsafe to enable umdns on wan interface.

umdns is available starting from OpenWRT 17 and to install it execute opkg install umdns

UDP port 5353 should be opened in firewall:

/etc/config/firewall
config rule
        option src_port '5353'
        option src '*'
        option name 'Allow-mDNS'
        option target 'ACCEPT'
        list dest_ip '224.0.0.251'
        option dest_port '5353'
        list proto 'udp'

To configure from GUI see “Firewall rules” section of Resolving mDNS across VLANs with Avahi on OpenWRT

$ ubus call umdns update
# wait a second or two
$ ubus call umdns browse
# big json dump example...
        ....
	"_printer._tcp": {
		"HP\\032Color\\032LaserJet\\032CP2025dn\\032(28A6CC)": {
			"port": 515,
			"txt": "txtvers=1",
			"txt": "qtotal=1",
			"txt": "rp=RAW",
			"txt": "ty=HP Color LaserJet CP2025dn",
			"txt": "product=(HP Color LaserJet CP2025dn)",
			"txt": "priority=50",
			"txt": "adminurl=http:\/\/NPI28A6CC.local.",
			"txt": "Transparent=T",
			"txt": "Binary=T",
			"txt": "TBCP=T"
		},
		"HP\\032LaserJet\\032P3010\\032Series\\032[46A14F]": {
			"port": 515,
			"txt": "txtvers=1",
			"txt": "qtotal=4",
			"txt": "rp=RAW",
			"txt": "pdl=application\/postscript,application\/vnd.hp-PCL,application\/vnd.hp-PCLXL",
			"txt": "ty=HP LaserJet P3010 Series",
			"txt": "product=(HP LaserJet P3010 Series)",
			"txt": "usb_MFG=Hewlett-Packard",
			"txt": "usb_MDL=HP LaserJet P3010 Series",
			"txt": "priority=52",
			"txt": "adminurl=http:\/\/NPI46A14F.local."
      },
   ....
$ ubus call umdns hosts 
#Show hosts discovered via mDns
        "SteakPrinter.local": {
                "ipv4": "192.168.1.159"
        },
        "Upstairs.local": {
                "ipv4": "192.168.1.151"
        },
  • IP addresses are missing.
  • TXT records aren't valid json in the dump, so jsonfilter can't be used.
  • How long is data cached? What causes it to update? No idea.
  • You may not see locally advertised services with ubus call umdns browse. See the discussion

The umdns scans all the services listed in ubus (ubus call service list) and looks for mdns objects in their data object. You can view this more selectively for example with:

# ubus call service list | jsonfilter -e '@[*].instances[*].data.mdns'
{ "ssh_22": { "service": "_ssh._tcp.local", "port": 22, "txt": [ "daemon=dropbear" ] } }

Here we can see that ssh is being advertised locally.

If you want to advertise your own service, your service needs to be a procd managed service. You can use the procd_add_mdns call to provide a basic definition.

procd_open_instance
....
procd_add_mdns <service> <proto> <port> [<textkey=textvalue> ... ]
...
procd_close_instance

As an example, the following call

procd_add_mdns "webdav" "tcp" "80" "path=/nextcloud/remote.php/dav/files/YOUR_USER/" "u=YOUR_USER"

will result in advertising _webdav._tcp.local with two text records. In the example we published a WebDAV folder from Nextcloud and now it can be seen in Network folder of a file manager in GNOME and KDE and can be discovered from a Kodi media player. The service names may be taken from the IANA register and the txt-records may be taken from the official DNS-SD keys (see ServiceTypes under “Defined TXT keys”.

If you wish to create a more complicated mdns information block, see procd_add_mdns_service in /lib/functions/procd.sh but be warned that umdns probably can't automatically support everything you can represent in json.

umdns advertises the services whose *.json files are found in /etc/umdns. This is similar to how Avahi advertises *.service files in /etc/avahi/services/.

For example the same WebDAV service description:

/etc/umdns/nextcloud_webdav.json
{
  "nextcloud_webdav": {
    "service": "_webdav._tcp.local",
    "port": 80,
    "txt": [
      "path=/nextcloud/remote.php/dav/files/YOUR_USER/",
      "u=YOUR_USER"
    ]
  }
}

See more examples in umdns sources

To see that service was advertised you may use avahi-discover or avahi-browse -d local _webdav._tcp.local

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2021/05/05 17:50
  • by stokito