我在使用以下桥接设置时遇到 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/;
}