已发送 IGMP v3 JOIN,但交换机没有流量

已发送 IGMP v3 JOIN,但交换机没有流量

我尝试从 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我自己的程序来打开套接字,加入流并保持套接字打开。两者都发送相同的 IGMP 加入消息,经wireshark确认:

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,因此我们通过在/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

相关内容