I recently noticed that my IPv6 multicast traffic was being broadcasted to all hosts connected to a switch, even those that had not subscribed to the traffic.
To fix this, I enabled MLD snooping on the switch, and this fixed the issue - now only those hosts that have subscribed to a given multicast group receive traffic for it, great.
However this broke basic IPv6 functionality on the network, and I could no longer connect to (or even ping) hosts connected to the same switch.
The problem turned out to be that the IPv6 neighbour solicitation packets are sent to a multicast address of the form ff02::1:xxxx:xxxx
which the switch was not forwarding as it seemed to decide that nobody had subscribed to those multicast groups.
My question is, is this a bug in the switch's IPv6 firmware, is it because I haven't configured MLD snooping properly, or is it because I need to configure each host to send MLD subscriptions for those particular multicast groups?
I am not sure what the correct behaviour is for MLD snooping and these IPv6 messages. Are hosts meant to subscribe to those groups, or are switches meant to forward on those requests regardless? If they are meant to be forwarded always, are all packets addressed to ff02::/16
meant to be forwarded without subscription, or only ICMP6 traffic? The switch does forward on packets for ff02::1
and similar addresses without any subscription which leads me to think you're not supposed to subscribe to this traffic, but then I find it hard to believe that something that almost immediately breaks all IPv6 traffic would go unnoticed for so long.
The switch unfortunately is long out of support and no longer getting firmware updates (Cisco 2975), but before I go to the effort of replacing it I'd like to make sure it's actually a firmware bug and not something I have just misconfigured that will remain even with a new switch!
ff02::1
. This matches the behaviour of my old Cisco switch. Newer Cisco documentation says thatff02:0:0:0:0:1:ff00::/104
is the "solicited-node multicast group" and is implicitly subscribed, which seems to be the workaround for the problem. I can't see this mentioned in the RFC either.