netcat은 UDP IPv6 멀티캐스트로 전송할 때 EINVAL을 생성합니다.

netcat은 UDP IPv6 멀티캐스트로 전송할 때 EINVAL을 생성합니다.

저는 IPv6 UDP 멀티캐스트 주소를 테스트하기 위해 Fedora에서 netcat을 사용하고 있습니다. 명령은

echo hi | nc -6 -u ff02::777:777:777 7777

netcat은 "인수가 유효하지 않습니다."라고 응답합니다.

실행 중인 추적 결과

connect(3, {sa_family=AF_INET6, sin6_port=htons(7777), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "ff02::777:777:777", &sin6_addr), sin6_scope_id=0}, 28) = -1 EINVAL

IPv6 없이 유사한 명령을 실행합니다.

echo hi | nc -u 192.168.255.255 7777

훌륭하게 작동합니다.

답변1

예비 설명: IPv4 네트워크는 192.168.0.0/16으로 설정되지 않았지만 192.168.0.0/24 또는 기타 /24 범위로 설정되었을 가능성이 높습니다. 따라서 192.168.255.255는 브로드캐스트가 아니며 그렇지 않으면 echo hi | nc -u 192.168.255.255 7777실패합니다. IPv6에서는 지원되지 않고 IPv4에서만 지원되는 브로드캐스트의 경우 애플리케이션은 SO_BROADCAST소켓 옵션을 사용해야 합니다. 이는 -bnetcat 옵션을 통해 달성됩니다. 실제로 네트워크 192.168.0.0/24(/16 아님)에 있다고 가정하면 다음과 같습니다.

nc -b -u 192.168.0.255 7777

브로드캐스트는 멀티캐스트가 아닙니다.


이 문제에 대해. 전체 ff02::/16범위는로컬 링크멀티캐스트 범위. 이 범위의 경우 주소는 인터페이스가 연결되어 있는 경우에만 완전합니다.협회- 로컬 범위). 이 범위의 유효한 주소는 ff02::777:777:777LAN 인터페이스가 호출된다고 가정할 때 eth0ff02::777:777:777%eth0정의된 대로 유효한 주소일 수 없습니다.RFC 4007:

nc -6 -u ff02::777:777:777%eth0 7777

nc이는 명령 자체 가 아닌 라이브러리에 의해 자동으로 처리될 수 있습니다 . 인터페이스가 필요하지 않은 범위를 사용하면 인터페이스가 주소의 일부가 아니어야 하기 때문에 일반적으로 실패합니다.

이 인터페이스를 요구하지 않으려면 링크-로컬(또는 노드-로컬) 범위를 사용하지 마세요. site-local: ff05로 전환하면 인터페이스를 지정하지 않고도 작동합니다.

nc -6 -u ff05::777:777:777 7777

Linux에서는 다음 명령을 사용하여 이 두 명령의 차이점을 확인할 수 있습니다 ss.

$ ss -aun dport == 7777
State  Recv-Q  Send-Q                     Local Address:Port          Peer Address:Port
ESTAB  0       0           [2001:db8:900d:cafe:0:1:2:3]:58092  [ff05::777:777:777]:7777        
ESTAB  0       0       [fe80::8c5f:87ff:fe50:d08a]%eth0:60937  [ff02::777:777:777]:7777        

여기에 글로벌 주소가 있습니다이더넷 0링크 로컬 범위가 아니며 해당 주소가 소스로 선택됩니다. 링크-로컬 범위 주소의 경우 소켓이 인터페이스에 바인딩됩니다. Linux의 경우 IPV6_MULTICAST_IF전송 시(사용하지 않을 때) 인터페이스 선택과 관련된 추가 고려 사항은 이 Q/A를 참조하세요.기본 IPv6 인터페이스를 설정하는 방법


최종 참고 사항: 다음으로 전환하는 것을 고려해야 합니다.소캇비율이 있음인터넷 고양이, 포함하다멀티캐스트 그룹에 가입IPv4의 경우. IPv6를 지원하지만 IPv6 멀티캐스트를 직접 지원하지는 않지만 setsockopt(2)IPv6 멀티캐스트 처리를 포함하여 지원되지 않는 기능을 구현하기 위해 임의 호출을 사용할 수 있습니다. 그래도 이것보단 낫네인터넷 고양이이전 트래픽으로부터 멀티캐스트 트래픽 수신을 지원하지 않습니다.인터넷 고양이주문하다.

그래서소캇, 여기에 적어도 amd64(x86_64) 아키텍처를 사용하는 Linux에서 작동하고 다른 *nix에서도 작동할 수 있는 예가 있습니다. 가능하면 아래 값 20과 해당 대체( IPV6_ADD_MEMBERSHIP/ IPV6_JOIN_GROUP)를 변경하고 원래 setsockopt(2)옵션을 사용하여 인터페이스를 활성화한 후 가능합니다. 인덱스 2(다음 첫 번째 인터페이스)루오), 먼저 보낸 사람인터넷 고양이주문하다:

socat udp6-recv:7777,setsockopt-listen=41:20:xff020000000000000000077707770777i2 -

이 옵션은 다음을 사용하여 디코딩됩니다 strace.

setsockopt(5, SOL_IPV6, IPV6_ADD_MEMBERSHIP, {inet_pton(AF_INET6, "ff02::777:777:777", &ipv6mr_multiaddr), ipv6mr_interface=if_nametoindex("eth0")}, 20) = 0

여기서는 소위 "dalan" 형식을 사용하여 임의의 소켓 옵션을 전달합니다.ipv6_mreq구조: IPv6 주소( x16진수 값의 경우 16바이트 IPv6 주소), 그 뒤에 인터페이스 인덱스( i정수)가 옵니다.

관련 정보