У меня возникла проблема 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 подчинены мосту.

Теперь, когда я настраиваю отправителя udp внутри пространства имен 3, отправляющего на x.x.x.1 и x.x.x.2, и настраиваю прослушиватель внутри ns2 на мосту, все работает нормально, и пакеты принимаются (на x.x.x.2). Но если я запущу еще один слушатель на x.x.x.1, вдруг оба слушателя перестанут получать сообщения. Кто-нибудь знает, что здесь происходит? Дайте мне знать, если есть какая-либо дополнительная информация, которая может оказаться полезной.

0
rednexela1941 18 Мар 2021 в 17:46
2
Не могли бы вы дать точные команды, которые вы используете для своей установки, чтобы ее можно было воспроизвести?
 – 
A.B
18 Мар 2021 в 18:42

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/;
}
0
rednexela1941 21 Мар 2021 в 06:54