mDNS repeater#
The third tab of DNS, at /dns. It owns service mdns repeater.
Printers, speakers and casting devices announce themselves with multicast DNS, which is link-local by design: it does not cross a router. Put the televisions on an IoT VLAN and the laptops on the LAN and they stop seeing each other, which is usually the moment somebody discovers this tab. The repeater re-announces multicast traffic between the interfaces you name, and discovery works across them again.
Where the data comes from#
GET /api/config?path=service mdns repeater, tolerating an unset path, plus
GET /api/interfaces/detail for the interface list with lo removed —
ui/src/pages/DnsExtras.tsx.
Note that this tab, like the rest of the DNS page, only renders on a router where
service dns forwarding is configured. See
the warning on the DNS page.
When it is configured#
| Field | Node | When unset |
|---|---|---|
| Between | interface | — |
| IP version | ip-version | both |
| Allowed services | allow-service | all |
| Extra browse domains | browse-domain | — |
| State | disable | enabled |
Below the values, each repeating interface appears as a chip. A chip carries a small
× that stages the removal of that one interface — but only while more than two are
configured, because a repeater with fewer than two interfaces has nothing to repeat
between:
delete service mdns repeater interface eth0.20Remove repeater stages a delete of the parent node, not just the repeater:
delete service mdnsThat is worth knowing if the router ever grows another service mdns child.
The editor#
Visible only when no repeater is configured and the principal may write. It is a checkbox per interface, an IP-version menu, and a preview.
| Control | Command |
|---|---|
| interface checkboxes | set service mdns repeater interface <if> per ticked interface |
| IP version menu | set service mdns repeater ip-version ipv4 or … ip-version ipv6 — the first entry, IPv4 and IPv6, writes nothing |
At least two interfaces must be ticked or nothing is staged; the preview says
# pick at least two interfaces until they are.
set service mdns repeater interface eth0
set service mdns repeater interface eth0.20allow-service and browse-domain are displayed when configured and are not written by
this editor. Restricting the repeater to particular service types — allowing AirPlay and
printing but not file shares — is a CLI command.
The interface list, and the VLAN problem#
The pickers are built from GET /api/interfaces/detail, which enumerates one entry per
configured interface node and does not expand VLAN sub-interfaces. The commonest use
of this feature is repeating between a LAN and an IoT VLAN, and the VLAN will not be in
the list.
Configure it from the CLI, or from the config tree, and this tab will display the result correctly afterwards — reading is not affected, only the picker. See what the Interfaces table does not show.
What it costs#
Two smaller costs: multicast traffic from both segments now appears on both, which on a noisy IoT network is not nothing; and every repeated announcement is one more thing on the wire for a device that was working fine without it.
What breaks if you get it wrong#
- One interface. Nothing is repeated. The editor refuses to stage it; the CLI does not.
- The wrong pair. Repeating between the LAN and the WAN puts your internal service announcements on the provider's segment.
- Firewall rules that do not follow. Discovery works, connecting does not, and the symptom is a device that appears in the list and times out when selected.
- Expecting it to fix a subnet-routing problem. The repeater carries discovery. If the two segments cannot route to each other, discovering a service does not let you use it.
See also#
- DNS — the resolver tab, and why this one needs it configured.
- Adding an interface — creating the VLAN in the first place.
- Interfaces — why the VLAN is not in the picker.
- DHCP — addressing the segment you are bridging discovery to.
Checked against ui/src/pages/DnsExtras.tsx
(MdnsTab), ui/src/pages/Dns.tsx,
agent/opmode.go (collectInterfaces),
ui/src/lib/api.ts.