Sonos en mDNS: Een gelukkig huwelijk!

Sonos maakt mooie apparaten, het moet je smaak zijn maar de apparatuur integreert in vrijwel ieder interieur en ook de geluidskwaliteit is naar mijn mening meer dan acceptabel.

Het gebruiksgemak en de integratie in de bestaande ecosystemen van Apple en Android is fantastisch.

Netwerktechnisch steekt het Sonos ecosysteem helaas wat minder ‘netjes’ in elkaar.

De filosofie van Sonos is volgens mij “het moet altijd werken” in plaats van “het moet goed en vooral efficiënt werken”.

Zo zijn er weinig instellingen te vinden om een Sonos apparaat naar je eigen wensen in te stellen. Sonos leunt zwaar op dynamische protocollen als DHCP en Multicast DNS (mDNS), dit alles om er maar voor te zorgen dat de Sonos ‘altijd’ werkt zonder de gebruiker tot last te zijn.


Voor mij als hobbyist een extra uitdaging dus bij het integreren van Sonos apparatuur in mijn netwerk. Thuis heb ik mijn netwerk gesegmenteerd in diverse VLAN’s:

VLAN10Private
VLAN20IoT
VLAN30IPTV
VLAN40Guest

En sinds kort is daar dus VLAN50 bijgekomen voor de Sonos speakers. Dit alles om verkeersstromen te kunnen scheiden en overbodig broadcast- en multicastverkeer te voorkomen. Ook wil ik niet dat apparaten op het ‘Guest’ netwerk zich gaan bemoeien met de Sonos speakers. Resumé, VLANs!

Om vanuit mijn Private VLAN de Sonos te kunnen bedienen moest ik dus met een oplossing komen omdat mDNS verkeer gelimiteerd wordt binnen het VLAN. Na succesvol getest te hebben met een mDNS reflector op basis van Avahi uiteindelijk toch besloten om mijn router dit verkeer af te laten handelen, scheelt toch weer een Docker container en bovendien wil ik netwerkgerelateerde zaken door mijn router laten afhandelen en niet afhankelijk zijn van mijn home-server.

Cisco biedt sinds IOS versie 15.2 de optie van mDNS-SD gateway. De router luistert simpelweg naar SSDP pakketjes en voegt de informatie hierin toe aan zijn eigen cache om deze informatie vervolgens te kunnen delen met anderen die juist mDNS info opvragen.

Hieronder de mDNS gateway configuratie op mijn Cisco router stap voor stap uitgelegd.


Als eerste moeten we multicast globaal aanzetten op de router:

!
ip multicast-routing
!

Vanuit VLAN10 staan we enkel queries toe om de mDNS cache van de router op te vragen.

!
service-list mdns-sd MDNS-VLAN10-IN permit 10
 match message-type query
!
service-list mdns-sd MDNS-VLAN10-IN deny 20
!

Let goed op de volgorde van de service-list en het volgnummer.


Vanuit VLAN50 staan we enkel de services toe welke gebruikt worden door Sonos, dit zijn:

_airplay._tcp.localZorgt ervoor dat de Apple-apps de Sonos apparaten kan vinden als ‘extern apparaat’.
_raop._tcp.localRemote Audio Output Protocol, Apple variant van het industriebrede RTSP streaming-protocol.
_sonos._tcp.localZorgt ervoor dat de Sonos S2-app de Sonos apparaten kan vinden als ‘extern apparaat’.
_spotify-connect._tcp.localZorgt ervoor dat de Spotify-apps de Sonos apparaten kan vinden als ‘extern apparaat’.
!
service-list mdns-sd MDNS-VLAN50-IN permit 10
 match message-type announcement
 match service-type _airplay._tcp.local
!         
service-list mdns-sd MDNS-VLAN50-IN permit 20
 match message-type announcement
 match service-type _raop._tcp.local
!
service-list mdns-sd MDNS-VLAN50-IN permit 30
 match message-type announcement
 match service-type _sonos._tcp.local
!
service-list mdns-sd MDNS-VLAN50-IN permit 40
 match message-type announcement
 match service-type _spotify-connect._tcp.local
!
service-list mdns-sd MDNS-VLAN50-IN deny 50
!

Omdat we op beide VLANs INbound al filteren, staan we OUTbound alles toe:

!
service-list mdns-sd MDNS-VLAN10-OUT permit 10
!
service-list mdns-sd MDNS-VLAN50-OUT permit 10
!

Als laatste configureren we een ‘query’ service-list. Dit zorgt ervoor dat de router altijd voorzien is van een actuele mDNS cache waardoor iPhone en Sonos elkaar sneller zullen vinden.

Ik laat mijn router elke 60 seconden een query doen op de betrokken service-types:

!
service-list mdns-sd MDNS-QUERY query
 service-type _airplay._tcp.local
 service-type _raop._tcp.local
 service-type _sonos._tcp.local
 service-type _spotify-connect._tcp.local
!
service-routing mdns-sd
 service-policy-query MDNS-QUERY 60
!

Nu alle mDNS gerelateerde configuratie op zijn plek staat is het tijd om de interfaces te configureren en de gehele mDNS Gateway tot leven te wekken:

!
interface vlan10
 ip pim sparse-dense-mode
 service-routing mdns-sd
  service-policy MDNS-VLAN10-IN IN
  service-policy MDNS-VLAN10-OUT OUT
!
interface vlan50
 ip pim sparse-dense-mode
 service-routing mdns-sd
  service-policy MDNS-VLAN50-IN IN
  service-policy MDNS-VLAN50-OUT OUT
!

Tijd om de mDNS Gateway te controleren op functionaliteit!

Beide interfaces zijn connected op group 239.255.255.250:

Router#sh ip mroute 239.255.255.250
IP Multicast Routing Table
Flags: D - Dense, S - Sparse, B - Bidir Group, s - SSM Group, C - Connected,
       L - Local, P - Pruned, R - RP-bit set, F - Register flag,
       T - SPT-bit set, J - Join SPT, M - MSDP created entry, E - Extranet,
       X - Proxy Join Timer Running, A - Candidate for MSDP Advertisement,
       U - URD, I - Received Source Specific Host Report, 
       Z - Multicast Tunnel, z - MDT-data group sender, 
       Y - Joined MDT-data group, y - Sending to MDT-data group, 
       G - Received BGP C-Mroute, g - Sent BGP C-Mroute, 
       N - Received BGP Shared-Tree Prune, n - BGP C-Mroute suppressed, 
       Q - Received BGP S-A Route, q - Sent BGP S-A Route, 
       V - RD & Vector, v - Vector, p - PIM Joins on route, 
       x - VxLAN group
Outgoing interface flags: H - Hardware switched, A - Assert winner, p - PIM Join
 Timers: Uptime/Expires
 Interface state: Interface, Next-Hop or VCD, State/Mode

(*, 239.255.255.250), 5d16h/stopped, RP 0.0.0.0, flags: DC
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Vlan10, Forward/Sparse-Dense, 00:02:39/stopped
    Vlan50, Forward/Sparse-Dense, 5d16h/stopped

Nu Multicast-routing werkt kunnen we de mDNS cache opvragen:

Router#sh mdns cache interface vlan50

                                                    mDNS CACHE 
=================================================================================================================================
[<NAME>]                                             [<TYPE>][<CLASS>] [<TTL>/Remaining] [Accessed] [If-name] [Mac Address] [<RR Record Data>]


_airplay._tcp.local                                     PTR     IN      4500/4450       1       Vlan50 48a6.b8fb.a72f  Keuken._airplay._tcp.local                                  

_spotify-connect._tcp.local                             PTR     IN      4500/4450       1       Vlan50 48a6.b8fb.a72f  sonos48A6B8FBA72F._spotify-connect._tcp.local               

_raop._tcp.local                                        PTR     IN      4500/4450       1       Vlan50 48a6.b8fb.a72f  48A6B8FBA72F@Keuken._raop._tcp.local                        

_sonos._tcp.local                                       PTR     IN      4500/4450       1       Vlan50 48a6.b8fb.a72f  Sonos-48A6B8FBA72F._sonos._tcp.local                        

48A6B8FBA72F@Keuken._raop._tcp.local                    SRV     IN       120/70         1       Vlan50 48a6.b8fb.a72f  0       0  7000     Sonos-48A6B8FBA72F.local                                    

Sonos-48A6B8FBA72F._sonos._tcp.local                    SRV     IN       120/70         1       Vlan50 48a6.b8fb.a72f  0       0  1443     Sonos-48A6B8FBA72F.local                                    

Sonos-48A6B8FBA72F.local                                A       IN       120/70         1       Vlan50 48a6.b8fb.a72f  10.10.50.1

Keuken._airplay._tcp.local                              TXT     IN      4500/4450       1       Vlan50 48a6.b8fb.a72f  (343)'acl=0''deviceid=48:A6:B8:FB:A7:2F''features=0x445F8A00,0x1C340''rsf=0x0''~'~

sonos48A6B8FBA72F._spotify-connect._tcp.local           TXT     IN      4500/4450       1       Vlan50 48a6.b8fb.a72f  (27)'VERSION=1''CPath=/spotifyzc'

48A6B8FBA72F@Keuken._raop._tcp.local                    TXT     IN      4500/4450       1       Vlan50 48a6.b8fb.a72f  (178)'cn=0,1''da=true''et=0,4''ft=0x445F8A00,0x1C340''fv=p20.61.1-83220''md=0,1,~'~

Sonos-48A6B8FBA72F._sonos._tcp.local                    TXT     IN      4500/4450       1       Vlan50 48a6.b8fb.a72f  (282)'info=/api/v1/players/RINCON_48A6B8FBA72F01400/info''vers=2''protovers=1~'~

Keuken._airplay._tcp.local                              SRV     IN       120/70         1       Vlan50 48a6.b8fb.a72f  0       0  7000     Sonos-48A6B8FBA72F.local                                    

sonos48A6B8FBA72F._spotify-connect._tcp.local           SRV     IN       120/70         1       Vlan50 48a6.b8fb.a72f  0       0  1400     Sonos-48A6B8FBA72F.local                                    

Kijk! Bewijs dat de mDNS Gateway functioneert! Als het goed is kun je nu vanuit VLAN10 de Sonos speaker in VLAN50 benaderen en aansturen middels Airplay, Spotify Connect en de Sonos S2 app.


Vragen? Opmerkingen? Bedankjes? Zet ze hieronder neer!

/eindbaas out.

Leave a Reply

Your email address will not be published. Required fields are marked *