TLDR:「ip route」を使用して複数のNICのマルチキャストルートを追加する方法はありますか?
2つのマルチキャストグループを使用して、2つの異なる物理ネットワーク上の2つの異なるデバイスグループと通信するソフトウェアがあります。このアプリケーションを除いて、1つのネットワーク上のデバイスは、他のネットワーク上のデバイスと通信するためにデバイス全体で通信する必要はありません。
これを行うために、ソフトウェアは2つのソケットを作成します。それぞれが個別のNICSのIPアドレスの1つにバインドされています。次に、そのソケットはそのネットワーク上に存在するマルチキャストグループに参加します。たとえば、ソケット1は192.168.0.2にバインドされてマルチキャストグループ233.255.10.1に参加し、ソケット2は10.57.31.2にバインドされてマルチキャストグループ239.255.100.1に参加します。
現在、bashスクリプト(Linuxカーネル3.14.39)を使用して、ルートを使用して2つのネットワークインターフェイスにマルチキャストルートを設定しています。
route add -net 224.0.0.0 netmask 240.0.0.0 eth0
route add -net 224.0.0.0 netmask 240.0.0.0 eth1
ルート-nで確認
Destination Gateway Genmask Flags Metric Ref Use Iface
224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth0
224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth1
私は最近、ルートが非推奨/廃止であり、代わりにip routeを使用する必要があることを読みました。
ip route add 224.0.0.0/4 dev eth0
ip route add 224.0.0.0/4 dev eth1
残念ながら、2番目の呼び出しは「RTNETLINK応答:ファイルが存在します」で失敗します。もちろん、これらの呼び出しの後、2番目のルートは表示されません。
Ip routeを使用してマルチキャストルートを複数のNICに追加する方法はありますか?
ネットマスクとして/ 8を使用できますか?例えば
ip route add 233.0.0.0/8 dev eth0
そして
ip route add 239.0.0.0/8 dev eth1
しかし、これを行うスクリプトはどのマルチキャストアドレスがどのデバイスに関連付けられているかを認識しておらず、システム構成によっては常に同じであることが保証されていないため、これには問題があります。ルート追加の最初の例を使用すると、これは問題になりません。
[〜#〜]更新[〜#〜]@Ron Maupinとの拡張ディスカッションのおかげで、エラーがコードにあることに気付きました。 IP_MULTICAST_IFを使用したマルチキャストに使用するインターフェースを設定していませんでした。 setsockopt呼び出しを追加してIP_MULTICAST_IFを設定すると、ルーティングテーブルを追加する必要がなくなりました。
struct in_addr multicastInterface = {};
multicastInterface.s_addr = interfaceAddressNetworkOrder;
// Set which outgoing interface to use
int result = setsockopt(m_socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)&multicastInterface, sizeof(struct in_addr));
ユニキャストルーティングを使用してLinuxボックスをマルチキャストするということは、いくつかの幸運な状況の組み合わせです。
マルチキャストルーティングは、ユニキャストルーティングと同じではありません。ユニキャストルーティングは、トラフィックが単一のアドレスに送信されるという面に基づいていますが、マルチキャストトラフィックは、マルチキャストグループにサブスクライブするホストを表すグループアドレスに送信されます。
ホストはIGMPを使用して、マルチキャストグループに参加することをマルチキャストルーターに通知し、マルチキャストルーターは、そのグループのマルチキャストトラフィックを、これを要求するホストのネットワークに送信し始めます。
最新のスイッチはIGMPスヌーピングを使用して、特定のマルチキャストグループへの参加を要求するホストを持つスイッチポートを判別し、ホストがマルチキャストグループへの参加を要求したスイッチポートにのみ、そのマルチキャストグループのトラフィックを送信します。
Linux自体はマルチキャストルーティングをサポートしていないため、Linuxデバイスに何かを追加してマルチキャストルーティングをサポートする必要があります。以下の図を参照してください。
マルチキャストソースがマルチキャストグループのマルチキャストトラフィックの送信を開始したとき、スイッチはおそらくマルチキャストグループに参加するためのIGMP要求を認識していないため、そのグループのマルチキャストトラフィックはどこにも行きません。
同じスイッチ上のPCの1つがマルチキャストグループに参加する場合、それはIGMP Joinメッセージを送信し、スイッチはその上でスヌープして、要求元のPCが接続されているポートにマルチキャストトラフィックを送信します。
Linuxルーターの反対側にあるPCがマルチキャストグループに参加したい場合、マルチキャストトラフィックがLinuxルーターのその側に流れていないため、それは不運です。 Linuxルーターはマルチキャストグループにも参加していないため、スイッチはマルチキャストトラフィックを送信しません。
ルーターでマルチキャストルーティングを実行すると、ルーターはホストIGMP要求に応答し、スイッチはそれがマルチキャストルーターであることを認識し、マルチキャストルーターが接続されているスイッチポートにマルチキャストトラフィックを送信します。簡単に言えば、ルーターは、別のインターフェースにアクティブなレシーバーがない限り、マルチキャストトラフィックを別のインターフェースに送信しません(これは、マルチキャストバージョンに依存します。たとえば、PIM-DMは送信を開始しますが、IGMP要求が見られない場合はオフになります)。 。
ルーターでマルチキャストルーティングを有効にすると、他のインターフェイスに接続されたPCがIGMP加入メッセージを送信し、Linuxルーターが要求されたグループのマルチキャストトラフィックをインターフェイスに送信し始めます。スイッチは要求をスヌープし、マルチキャストグループへの参加を要求したPCが接続されているスイッチポートにマルチキャストトラフィックを送信します。
複数のルーターを経由してルーティングする必要がある場合は、さらに複雑になります。 IGMPは、ホストとローカルマルチキャストルーターの間で使用されます。 PIM(または他のマルチキャストルーティングプロトコル)は、マルチキャストルーター間で使用されます。
これにより、マルチキャストトラフィックが不要な場所に移動するのを防ぎます。
Linuxには、IGMPおよびマルチキャストルーティングを適切に処理するのに役立つアドオンがあります。