Linux ブリッジが UDP パケットフローを停止します。

Linux ブリッジが UDP パケットフローを停止します。

次のブリッジ設定を使用している場合は、UDP(Linux 5.11.6)に問題があります。

ns${i}名前空間を表し、left${i}/right${i}vethペアになるようにする)

ns1{right1(x.x.x.1)---}---ns2{---left1::bridge(x.x.x.2)::right2---}--ns3{---left2(x.x.x.3)}

つまり、veth インターフェイスのペアで接続された 3 つのネームスペースがあり、中間ネームスペース left1 と right2 はブリッジの下で制御されます。

名前空間3内でxxx1とxxx2に送信するためにudp送信者を設定し、ブリッジのns2内で受信機を設定すると、すべてが正常に機能し、パケットが受信されます(xxx2から)。しかし、xxx1で別のリスナーを起動すると、突然両方のリスナーはもはやメッセージを受信しなくなります。何が起こっているのか知っている人はいますか?役立つ追加情報がある場合はお知らせください。

答え1

誰もがこれを偶然発見した場合:

問題は、vethペアはすべて基本的に同じMACアドレスを使用するため、ブリッジを介してパケットをルーティングするときに広範な混乱を引き起こすことです。今実行中の設定は、次のスクリプトによって生成されました(注:競合を防ぐための任意のmacアドレス)。

#!/usr/bin/perl
use strict;
use warnings;
use v5.32;

my @nodes;
my @ifaces;
my $num_nodes = 7;

sub rand_mac {
    my $mac = "200";
    $mac .= sprintf( "%x", rand 16 ) for 1 .. 9;
    $mac =~ s/(..)/$1:/g;
    return $mac =~ s/:$//r;
}

foreach ( 1 .. $num_nodes ) {
    my $n = "ns$_";
    qx/ip netns add $n/;
    push @nodes, $n;
}

foreach my $i (1 .. ($num_nodes + 1) ) {
    my ( $lnode,  $rnode )  = ( $nodes[ $i - 1 ], $nodes[$i] );
    my ( $left,   $right )  = ( "right", "left" );    # INDEED
    my ( $l_mac,  $r_mac )  = ( rand_mac(), rand_mac() );
   
    say "init $left ($lnode: $l_mac) -- $right ($rnode: $r_mac)";

    qx/ip link add $left type veth peer name $right/;
    qx/ip link set $left netns $lnode/;
    qx/ip link set $right netns $rnode/;
    qx/ip netns exec $lnode ip link set $left address $l_mac/;
    qx/ip netns exec $rnode ip link set $right address $r_mac/;
}

関連情報