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では、次のコマンドを使用してこれら2つのコマンドの違いを確認できます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整数)が続きます。

関連情報