Networking

linux橋中斷udp數據包流

  • March 21, 2021

我在使用以下橋接設置 (Linux 5.11.6) 時遇到 UDP 問題:

(讓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 上啟動另一個偵聽器,突然兩個偵聽器都不再收到任何消息。有誰知道這裡發生了什麼?讓我知道是否有任何其他資訊可能會有​​所幫助。

萬一有人偶然發現:

問題是 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/;
}

引用自:https://unix.stackexchange.com/questions/639917