IPv6を介してマルチキャストトラフィックを送信するプログラムがあります。プライマリネットワークインターフェイスからトラフィックを送信します。正常に動作しますが(トラフィックは消えますeth0
)、Dockerをロードするとインターフェイスの外部にトラフィックが送信され、docker0
ネットワークeth0
にトラフィックが表示されなくなります。
たとえば、コマンドの実行および実行中に as またはping ff05::1
as を使用してインターフェイスを確認する場合、パケットは常に期待どおりに離れません。tcpdump -n host ff05::1 -i XXX
XXX
eth0
docker0
eth0
これで、使用している各プログラムを確認し、バインドするインターフェイスを指定して(たとえば、上記-I
のpingオプションを使用して)この問題を解決できますが、複数のコンピュータ構成ファイルで同じ内容を共有したいので問題が発生します。各アドレスに異なるIPv6アドレスとインターフェイス名を設定し、動的IPアドレスが変更された場合はそれを更新することを忘れないでください。
代わりに、各システムで好むインターフェースを手動で設定できることを望みながら、Linuxがソケットにバインドするときに使用するインターフェースを選択する方法を理解したいと思います。これにより、私が使用しているプログラムは、特別な設定なしで正しいインターフェイスでマルチキャストトラフィックを送受信します。
ネットワークパス()を追加してみましip -6 route add ff05::/16 dev eth0
たが、違いはありません。問題は、Linuxがバインドするインターフェイスを選択し(ルーティングが発生する前に)、そのインターフェイスのIPアドレスを発信パケットの送信元アドレスとして使用して、ルーティングルールに関係なくそのインターフェイスにロックするようです。
それではping
、上記のコマンドを例に挙げると、デフォルトのアウトバウンドインターフェイスはどのように選択され(-I
使用されていない場合)、どのように変更できますか?
ベストアンサー1
注:FF05::2(サイトローカルのすべてのルータマルチキャストアドレス)またはFF02::1(リンクローカルのすべてのノードマルチキャストアドレス、おそらくインターフェイススコープを使用する必要があります)を使用する必要があります。ローカルすべてのルーターマルチキャストアドレスマルチキャストアドレス)ノードマルチキャストアドレス)いいえ 限られたそしておそらく答えは得られません(ip -6 maddress
少なくともルータにff05::2が表示されているLinuxシステムでは答えが得られません)。
新しいインターフェイスが追加および表示されるたびに、さまざまな自動アドレスのうちIPv6マルチキャストパスがローカルテーブルに追加されるため、ローカルテーブルには表示されません。基本ルーティングテーブル:
$ ip route get ff05::02
multicast ff05::2 from :: dev dummy0 table local proto kernel src fe80::8c5f:87ff:fe50:d08a metric 256 pref medium
$ ip -6 route show type multicast table local
multicast ff00::/8 dev dummy0 proto kernel metric 256 pref medium
multicast ff00::/8 dev lxcbr0 proto kernel metric 256 pref medium
multicast ff00::/8 dev eth0 proto kernel metric 256 pref medium
...
等しい間の順序は非常にランダムで、再現するのは難しいです。マルチキャストエントリは、インターフェイスが閉じられるか開かれるたびに削除され、再度追加されますが、順序は変更される可能性があります。カーネルだけがこれらの「等価パス」を追加でき、ユーザーはそれを行うことはできません(=> RTNETLINK answers: File exists
)。これ地元のルール優先順位(優先順位0)で他のテーブルの前に使用されるテーブル。基本テーブルは何の影響も与えないかもしれません。
$ ip -6 rule
0: from all lookup local
32766: from all lookup main
それでも。 「デフォルト」マルチキャストパスを確実に決定するには、メトリックの低いマルチキャストパスをローカルテーブルに手動で追加するだけです。
# ip route add multicast ff00::/8 dev eth0 table local metric 100
$ ip route get ff05::02
multicast ff05::2 from :: dev eth0 table local src 2001:db8:123:4567:52fb:e94:d3b7:5ba8 metric 100 pref medium
このパスは、インターフェイスが停止(および動作)すると消えるので、このインターフェイスを設定するツールと一緒に追加する必要があります。
注:デフォルトでは、IPv4にはどこにも定義されたマルチキャストパスがなく、アドレスがマルチキャストであることを確認するためにいくつかのカーネル組み込みロジックに従います。したがって、マルチキャストパスはデフォルトパスに従います。マルチキャストブロックを除外したい場合(たとえば、マルチキャストストリームを生成するツールを使用しているがIGMPスヌーピング機能を持たないスイッチの対応するストリームにLANを溢れさせたくない場合)、逆の場合を実行できます。そのストリームにマルチキャストタイプを追加します。ルーティングフローは別の(ここでは仮想)インターフェイスにあります。なぜなら何もないからローカルテーブル相互作用、すなわち基本テーブルは十分ですが、table local
追加できます。
# ip route add multicast 239.255.16.0/20 dev dummy0
$ ip route get 239.255.16.2
multicast 239.255.16.2 dev dummy0 src 172.20.21.22 uid 0
cache <mc>