우리는 Linux를 실행하는 통신 인터페이스 변환기를 개발 중입니다.
이 장치는 유니캐스트 또는 멀티캐스트 IP를 수신하고 이를 다른 물리적 계층으로 변환할 수 있습니다. 반면, 이 장치는 첫 번째 장치가 수신한 내용을 변경하지 않고 데이터를 수신하고 유니캐스트/멀티캐스트 IP를 보냅니다. 데이터는 애플리케이션 구성에 따라 전송됩니다.
또한 첫 번째 장치에는 두 번째 장치로 전송될 일부 멀티캐스트 데이터를 생성하는 일부 내부 장비가 있습니다.
내 문제는 tcpdump를 수행할 때만 두 번째 장치가 이 장치로부터 멀티캐스트를 수신한다는 것입니다.
'tcpdump -i 모든 호스트'
어떻게 되어가나요? tcpdump는 무엇을 합니까?
답변1
핵심요약: ip link set dev eth0 allmulticast on
문제를 해결하려면 실행하세요(카드 이름 조정). 이 문제를 올바르게 수정한다는 것은 멀티캐스트를 인식하고 관심 있는 (IPv4) 멀티캐스트 그룹에 가입하도록 애플리케이션을 수정하는 것을 의미할 수 있습니다.
tcpdump
인터페이스를 넣습니다.무차별 모드달리 명시하지 않는 한( -p
), 이는 카드(MAC 주소)에 특별히 전송되지 않은 경우에도 시스템에 보이는 모든 이더넷 프레임을 전송한다는 의미입니다. tcpdump
추가 -p
옵션을 사용해도 설정이 더 이상 작동하지 않는지 확인할 수 있습니다 .
이를 바탕으로, 이는 인터페이스가 멀티캐스트 트래픽을 수신하라는 지시를 받지 않고 자체 MAC 주소만 대상 주소로 사용하는 유니캐스트 이더넷 프레임(브로드캐스트 프레임도 포함)만 수신한다는 의미입니다. 일반적으로 애플리케이션은 IPv4 멀티캐스트 그룹에 가입하기 위해 소켓 옵션을 사용해야 합니다.스트레스:
setsockopt(5, SOL_IP, IP_ADD_MEMBERSHIP, {imr_multiaddr=inet_addr("239.255.1.5"), imr_interface=inet_addr("192.0.2.2")}, 12) = 0
...다른 효과 중에서도이더넷 MAC에 매핑된 IP 해시카드의 특정 멀티캐스트 MAC 테이블로 포맷합니다. 멀티캐스트 이더넷 프레임은 카드에서 쉽게 인식됩니다. 대상 MAC 주소의 첫 번째 바이트의 하위 비트를 가장 중요한 1로 설정합니다.대상 MAC 먼저전선으로 전송됩니다.
사용 중인 모든 (IPv4) 멀티캐스트 그룹을 미리 알고 있고 그 수가 제한되어 있는 경우 결과를 직접 계산할 수 있습니다.멀티캐스트 이더넷 MAC 주소그런 다음 다음과 유사한 명령을 사용하여 카드의 멀티캐스트 테이블에 직접 추가합니다(239.255.1.5에 대한 해시).
ip maddress add dev eth0 01:00:5e:7f:01:05
이렇게 할 수 없는 경우에도 카드를 수신하도록 구성할 수 있습니다.모두멀티캐스트 트래픽:
ip link set dev eth0 allmulticast on
나중에 전환하면IGMP 스누핑삽입 후에는 적절한 애플리케이션 변경 없이는 충분하지 않을 수 있습니다.
당신은 그것을 사용할 수 있습니다socat
도착하다멀티캐스트를 사용한 테스트.