Networking
linux橋中斷udp數據包流
我在使用以下橋接設置 (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/; }