Centos 8 マシンから IGMP マルチキャスト ストリームに参加しようとしていますが、JOIN を送信した後、スイッチからのトラフィックが来ません。
簡単な接続:
MUX <-----------> cisco3850 <--------> Centos8
192.168.117.13 192.168.117.21
アップストリーム スイッチ (cisco catalyst 3850) には、MUX から 239.1.1.1:4000 への MPEG-TS が供給されます。
私は両方socat
のプログラムと自分のプログラムを試して、ソケットを開き、ストリームに参加し、ソケットを開いたままにしました。両方とも、Wireshark によって確認されたように、同じ IGMP 参加メッセージを送信します。
Internet Group Management Protocol
[IGMP Version: 3]
Type: Membership Report (0x22)
Reserved: 00
Checksum: 0xe9fb [correct]
[Checksum Status: Good]
Reserved: 0000
Num Group Records: 1
Group Record : 239.1.1.1 Change To Exclude Mode
Record Type: Change To Exclude Mode (4)
Aux Data Len: 0
Num Src: 0
Multicast Address: 239.1.1.1
次のようにして、ip route add
インターフェイスへのマルチキャスト グループのルートを作成しました。
224.0.0.0/4 dev eth1 scope link
225.0.0.0/8 dev eth1 scope link
239.0.0.0/8 dev eth1 scope link
cat /proc/net/igmp
グループに参加したことが表示されます:
cat /proc/net/igmp
Idx Device : Count Querier Group Users Timer Reporter
3 eth1 : 2 V3
030101E1 1 0:00000000 0
010000E0 1 0:00000000 0
私容疑者これは Linux の問題ではなくスイッチの問題ですが、顧客 (スイッチを所有) はすべて正常であると述べています。
この問題を調査/修正するために Linux 側で他に何ができるでしょうか?
スイッチの問題であれば、どうなりますか? そこで何を設定する必要がありますか? (顧客に説明する必要があります)
参考までに、ソケットに参加して開いたままにする私のプログラムは次のようになります。
// Error checking omitted for brevity
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes);
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = PF_INET;
saddr.sin_addr.s_addr = mcastAddr;
saddr.sin_port = htons(port);
bind(fd, (struct sockaddr *)&saddr, sizeof(saddr);
struct ip_mreq mcastReq;
mcastReq.imr_multiaddr.s_addr = mcastAddr;
&mcastReq.imr_interface.s_addr = interfaceAddr;
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcastReq, sizeof(mcastReq);
答え1
結局、顧客のスイッチは IGMPv3 をアクティブ化できなかったため、 の下にファイルを作成して、マシンが IGMP v2 を使用するように設定しました/etc/sysctl.d
。
その後、JOIN は機能しましたが、Linux はマルチキャスト メンバーシップ クエリに応答しなかったため、スイッチは 1 ~ 2 分後にストリームをドロップしました (net.ipv4.conf.default.rp_filter
ゼロに設定していたにもかかわらず)。
リターンパスの検証を完全に無効にするには、すべての設定をゼロに設定する必要がありましたrp_filter
(インターフェイスを明示的にリストすることを含む)
# Set IGMP Version for eth1
# Set to '2' or '3' depending on what is enabled in the switch
net.ipv4.conf.eth1.force_igmp_version = 2
# Disable source route verification
# In addition to 90-torque.conf, also explicitly set eth1 to ignore
# return path validation
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0