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 측에서 또 무엇을 할 수 있습니까?
스위치에 문제가 있다면 어떻게 될까요? 거기에서 무엇을 구성해야 합니까? (고객에게 설명해야 함)
참고로 소켓을 조인하고 열린 상태로 유지하는 내 프로그램은 다음과 같습니다.
// 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
0으로 설정했음에도 불구하고).
반환 경로 유효성 검사를 완전히 비활성화하려면 모든 설정을 rp_filter
0으로 설정해야 했습니다(인터페이스 명시적 나열 포함).
# 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