web-dev-qa-db-ja.com

OSXネットワークスタックはIGMPメンバーシップクエリを無視します

Macが応答しないリモートサイトがあります IGMPメンバーシップクエリ が、Windowsボックスは応答します。その結果、約10分後、IGMP対応ネットワークスイッチはMacへのマルチキャストストリームを遮断します。

問題を示すWiresharkのスクリーンショットを次に示します。

Wireshark IGMP packet capture

最初のパケットは、ネットワークが239.255.20.1からMacへのIGMPパケットの許可を開始することを要求するアプリです。その後、約125秒ごとに、IGMPクエリア(10.1.254.254)として構成されたネットワークスイッチが、そのストリームにまだ関心があるかどうかを尋ねます。目立った反応の欠如に注意してください。

比較のために、ここでローカルネットワーク上で何が起こるかを次に示します。

good IGMP packet capture

ここでは、約95秒ごとにIGMPクエリア(172.20.0.2)がそのストリームが必要かどうかを尋ね、問題のMac(172.20.0.144)は「はい、送信し続けます」と言います。

GUIで問題のあるMacのファイアウォールがオフになっているので、コマンドラインで確認しました。

 $/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 
ファイアウォールが無効になっています。 (状態= 0)
 $/usr/libexec/ApplicationFirewall/socketfilterfw --getblockall 
すべての無効化をブロックします! 
 $/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode 
ステルスモードが無効
 $/usr/libexec/ApplicationFirewall/socketfilterfw --getappblocked/Applications/mumblemutter.app /。 .. 
アプリケーションはファイアウォールの一部ではありません

グループが参加した後、スタックがIGMPクエリを処理するため、アプリは重要ではありません。

問題のあるMacは10.11.5を実行していますが、最新のものにアップグレードすることで問題が修正されるとは信じられません。これは、BSDベースのOSが2016年にネットワークスタックの重大なバグを修正することを意味するためです。可能ですが、非常に確率が低い。

2
Warren Young

この問題は最初のパケットキャプチャに示されています。IGMPグループ参加パケットはIGMPv2パケットですが、IGMPクエリアからの応答はすべてv3です。

MacOSは非常に長い間IGMPv3をサポートしているので、これは問題ないように思われるかもしれませんが、 DarwinオープンソースカーネルでのIGMP実装 を掘り下げると、igmp_input_v3_query()でこの啓発的なコードを見つけてください:

_/*
 * 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...
_

これが意味するのは、macOSが IGMPv3仕様 に従い、IGMPv2パケットを確認したネットワークインターフェイスを「互換モード」にすることです。つまり、そのネットワークインターフェイスでIGMPv3パケットを確認したり、IGMPv3を話したりすることはありません。 。上記のコードに関しては、インターフェイスを_igi_version = 2_としてマークしているため、このテストを実行し、このネットワークでv3を話すことは安全ではないという理論に基づいて、v3グループメンバーシップクエリを無視します。何が起こっているのか理解できません。

私は3つの実行可能な救済策を見ます:

  1. ネットワークの担当者にスイッチを再構成して、IGMPv2グループへの参加を要求したクライアントにIGMPv2クエリを返送してもらいます。

  2. IGMPv2メンバーシップクエリのみを送信するように、IGMP対応ネットワークスイッチでIGMPv3サポートを完全にオフにします。

  3. ネットワークでIGMPv2パケットを監視し、それらの送信元を見つけて、修正、アップグレード、または削除します。ネットワークでv3をスルーアンドスルーで話すことができない場合は、#1または#2を使用してください。

これは、アプリケーションコードの変更で修正できるものではありません。 _IP_ADD_MEMBERSHIP_オプション から setsockopt() にはバージョン番号が含まれていないため、アプリはIGMPv3を要求する立場にありません。その決定はスタック次第です。

これに影響を与えるOS設定がある可能性はありますが、それは、macOSのIGMP実装が上記の_igmp.c_に表示されているものと異なる場合にのみ当てはまります。

WindowsボックスでIGMPのネットワークをスニッフィングすると、ネットワーク上にv2が存在するにもかかわらず、v3応答でIGMPv3メンバーシップクエリに応答することがわかります。したがって、RFCに違反しています。 「まあ、それは機能しますね」と言うネットワーク管理者もいますが、macOSにRFCも無視させることはできないため、解決策はネットワークを修正することに変わりはありません。

3
Warren Young