The UDM-Pro is an impressive piece of networking hardware. However, Ubiquiti has moved away from some of the internals present in their USG, and as such a few things aren't working quite as expected; one of those being the mDNS Reflector.
If you're using a separate network and VLAN for your IoT devices, which you should be if you're not, you will need to setup an mDNS reflector to allow for discovery and communication between those devices and those on your primary network. This helps keep your primary network more secure, as well as giving you opportunities to lock down your IoT VLAN and prevent rogue devices from gaining more access than they need.
UniFi has a built-in mDNS Service that uses Avahi behind the scenes. However, the functionality does not appear to work as expected on the UDM-Pro (opposed to the USG, which seems to work as advertised). To properly configure the UDM-Pro, some work is needed.
This guide assumes you already have your networks (primary, VLAN, etc) and WiFI networks already configured, in addition to firewall rules between them for standard access. vNinja.net has a great write-up on this already; though, I will probably write up my own guide after I finalize my own personal network.
Before we apply our custom configuration, we need to disable some of the built-in UniFi services and configuration. To do that, login to your UDM-Pro and make these changes (these are all using the new settings interface):
Next, we'll login to the UDM-Pro using SSH and install a few custom services.
If you haven't configured your UDM-Pro for SSH, do that first.
Now we can install our custom mDNS Reflector.
SSH into the UDM-Pro.
ssh email@example.com # or whatever your controller's IP address is
Log into the UniFi OS Shell.
curl -L https://raw.githubusercontent.com/boostchicken/udm-utilities/master/on-boot-script/packages/udm-boot_1.0.1-1_all.deb -o udm-boot_1.0.1-1_all.deb dpkg -i udm-boot_1.0.1-1_all.deb exit
multicast-relay docker image and create a container. Notice the
podman versus the standard
podman run -it -d --restart=always --name="multicast-relay" --network=host -e OPTS=" --verbose" -e INTERFACES="br0 br2" docker.io/scyto/multicast-relay
br0 br2 parameter; this should match your VLAN's network
ifconfig from the SSH session to see available
interfaces; add your VLANs as space-delimited entries to the command.
Add a startup script to re-execute the container on startup.
touch 01-multicast-relay.sh chmod +x 01-multicast-relay.sh
vim 01-multicast-relay.sh to edit the file. Hit
i to enter edit
mode, paste the following contents, then hit
:w to save the file.
:q to quit.
#!/bin/sh # kill all instances of avahi-daemon (UDM spins an instance up even with mDNS services disabled) killall avahi-daemon # start the multicast-relay container image podman start multicast-relay
Reboot the UDM and test your HomeKit devices.
After following these steps, you should be able to use your HomeKit devices segregated by a VLAN. In my personal setup, I have my hub (an AppleTV 4th Generation) on the primary LAN, with all of my IoT devices in the VLAN. I'm able to control them all directly with no issues now. Additionally, Chromecast devices work a majority of the time, though they appear to be occasionally limited due to UPnP being disabled.
Ideally, the built-in mDNS service should be good enough for what we need. However, until Ubiquiti fixes their mDNS service, this custom workaround will be required.