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 接口链接的三个命名空间,中间的命名空间 left1 和 right2 被控制在桥下。

现在,当我在命名空间 3 内设置一个 udp 发送方发送到 xxx1 和 xxx2 并在网桥上的 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/;
}

相关内容