다음 브리지 설정을 사용하는 경우 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 내에서 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/;
}