fragen stichworte

Der OS X-Netzwerkstack ignoriert IGMP-Mitgliedschaftsabfragen

Wir haben eine Remote-Site, an der die Macs nicht auf IGMP-Mitgliedschaftsabfragen antworten, die Windows-Boxen antworten jedoch. Daher schaltet der IGMP-fähige Netzwerk-Switch nach etwa 10 Minuten den Multicast-Stream auf den Macs ab.

Hier ist ein Screenshot von Wireshark, der das Problem zeigt:

Wireshark IGMP packet capture

Das erste Paket ist die App, die anfordert, dass das Netzwerk die IGMP-Pakete von 239.255.20.1 bis zum Mac zulässt. Dann sehen Sie etwa alle 125 Sekunden danach, dass der als IGMP-Querier (10.1.254.254) konfigurierte Netzwerk-Switch fragt, ob wir noch an diesem Stream interessiert sind. Beachten Sie das auffällige Fehlen einer Antwort.

Zum Vergleich hier im lokalen Netzwerk:

good IGMP packet capture

Hier fragt der IGMP-Querier (172.20.0.2) etwa alle 95 Sekunden, ob der Stream immer noch gewünscht wird, und der betreffende Mac (172.20.0.144) sagt: "Ja, senden Sie ihn weiter."

Die Firewall ist bei den problematischen Macs in der GUI deaktiviert, und ich habe sie in der Befehlszeile überprüft:

$/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
Firewall is disabled. (State = 0)
$/usr/libexec/ApplicationFirewall/socketfilterfw --getblockall
Block all DISABLED! 
$/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode
Stealth mode disabled 
$/usr/libexec/ApplicationFirewall/socketfilterfw --getappblocked/Applications/mumblemutter.app/...
The application is not part of the firewall 

Die App spielt keine Rolle, da der Stack IGMP-Abfragen verarbeitet, nachdem die Gruppe hinzugefügt wurde.

Das Problem für Macs ist 10.11.5, aber ich kann nicht glauben, dass das Problem durch ein Upgrade auf das absolut Neueste behoben werden würde, da dies bedeutet, dass ein BSD-basiertes Betriebssystem 2016 ernsthafte Fehler in seinem Netzwerkstapel behebt. Möglich , aber extrem geringe Wahrscheinlichkeit.

antworten

Das Problem wird in der ersten Paketerfassung angezeigt. Dabei werden Sie feststellen, dass das IGMP-Gruppen-Join-Paket ein IGMPv2-Paket ist. Die Antworten aus dem IGMP-Querier sind jedoch alle v3.

Dies mag in Ordnung sein, da Mac OS X IGMPv3 schon sehr lange unterstützt, aber wenn Sie sich die IGMP-Implementierung im Darwin-Open-Source-Kernel (unten in igmp_input_v3_query()) ansehen, sind Sie dabei Finde dieses aufklärende Codebit:

/*
 * Discard the v3 query if we're in Compatibility Mode.
 * The RFC is not obviously worded that hosts need to stay in
 * compatibility mode until the Old Version Querier Present
 * timer expires.
 */
if (igi->igi_version != IGMP_VERSION_3) {
    ...etc...

Dies bedeutet, dass Mac OS X (oder MacOS, wenn Sie möchten) die IGMPv3-Spezifikation befolgt und jede Netzwerkschnittstelle, an der IGMPv2-Pakete gesehen wurden, in den "Kompatibilitätsmodus" versetzt wird weder IGMPv3-Pakete bestätigen noch IGMPv3 an dieser Netzwerkschnittstelle sprechen. In Bezug auf den obigen Code wird die Schnittstelle als igi_version = 2 bezeichnet. Wir werden also diesen Test durchführen und v3 die Gruppenzugehörigkeitsabfrage ignorieren. Dabei wird davon ausgegangen, dass es nicht sicher ist, v3 in diesem Netzwerk zu sprechen, damit die v2-Geräte nicht in der Lage sind zu verstehen, was los ist

Ich sehe drei praktikable Hilfsmittel:

  1. Bitten Sie die Verantwortlichen des Netzwerks am Remote-Standort, ihre Switches neu zu konfigurieren, um IGMPv2-Abfragen an Clients zu senden, die nach einem IGMPv2-Gruppenbeitrag gefragt haben.

  2. Deaktivieren Sie die IGMPv3-Unterstützung in den IGMP-fähigen Netzwerk-Switches vollständig, sodass nur IGMPv2-Mitgliedschaftsabfragen gesendet werden.

  3. Überwachen Sie das Netzwerk auf IGMPv2-Pakete, finden Sie die Quelle, und beheben Sie diese, reparieren oder aktualisieren Sie sie, oder entfernen Sie sie. Wenn das Netzwerk nicht dazu gebracht werden kann, v3 durch und durch zu sprechen, fahren Sie mit # 1 oder # 2 fort.

Dies kann nicht durch eine Änderung des Anwendungscodes behoben werden. Die Option IP_ADD_MEMBERSHIP bis setsockopt() enthält keine Versionsnummer, sodass die App nicht in der Lage ist, IGMPv3 zu fordern. Diese Entscheidung liegt am Stapel.

Es ist zwar möglich, dass es eine Betriebssystemeinstellung gibt, die dies beeinflussen könnte, dies könnte jedoch nur der Fall sein, wenn sich die IGMP-Implementierung von Mac OS X von den oben in igmp.c gezeigten Links unterscheidet.

Wenn Sie das Netzwerk für IGMP unter Windows überprüfen, werden Sie feststellen, dass IGMPv3-Mitgliedschaftsabfragen mit v3-Antworten beantwortet werden, obwohl v2 im Netzwerk vorhanden ist. Es verstößt daher gegen die RFC. Einige Netzwerkadministratoren, die sagen: "Nun, es funktioniert, oder?", muss die richtige Antwort sein: Da Sie OS X nicht zwingen können, den RFC nicht zu beachten, bleibt die Lösung, das Netzwerk zu reparieren.