Linux:网桥、VLAN 和 tcpdump

Linux:网桥、VLAN 和 tcpdump

我有一个内核为 5.15.19-2-pve 的 Proxmox 主机。

它有一个由 eth2 和 eth3 组成的 bond0 接口,用于接收 vlan 标记的流量。

我创建了一个 vmbr666 桥,其显示内容如下:

# /etc/network/interfaces:
auto vmbr666
iface vmbr666 inet manual
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094
        mtu 9220

# brctl show
vmbr666         8000.5a0a13a9dd29       no              bond0
                                                        tap151034i1
# ip -d link sh dev vmbr666
66: vmbr666: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9220 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 5a:0a:13:a9:dd:29 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 
    bridge forward_delay 0 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 1 vlan_protocol 802.1Q bridge_id 8000.5a:a:13:a9:dd:29 designated_root 8000.5a:a:13:a9:dd:29 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer    0.00 tcn_timer    0.00 topology_change_timer    0.00 gc_timer  251.81 vlan_default_pvid 1 vlan_stats_enabled 0 vlan_stats_per_port 0 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 16 mcast_hash_max 4096 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3124 mcast_stats_enabled 0 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

注意vlan_filtering1

如果我tcpdump -enlvvv打开 bond0,我会看到 VLAN42 的流量。如果我打开 tcpdumpvmbr666tap151034i1,我看不到 VLAN42 的流量(甚至没有广播或多播,尽管我确实看到了一些其他 VLAN 的广播流量)。问题:为什么不呢?

相关输出来自bridge -c vlan show

bond0             1 PVID Egress Untagged
                  2-99
tap151034i1       1 PVID Egress Untagged
                  2-99
vmbr666           1 PVID Egress Untagged

就像我说的,我确实在所有这些接口上看到了其他 VLAN 的流量,包括标签,例如

15:03:35.293420 00:50:56:b1:24:0c > ff:ff:ff:ff:ff:ff, ethertype 802.1Q (0x8100), length 64: vlan 49, p 0, ethertype ARP (0x0806), Ethernet (len 6), IPv4 (len 4), Request who-has 10.76.155.200 tell 10.76.155.51, length 46

现在让我们将 vlan 42 添加到vmbr666接口,看看是否有区别:

# bridge vlan add vid 42 dev vmbr666 self
# bridge -c vlan show dev vmbr666        
port              vlan-id  
vmbr666           1 PVID Egress Untagged
                  42

tcpdump -enlvvv -i vmbr666仍然没有看到任何与 vlan42 相关的内容,只有其他 VLAN(例如 49 和 50)。

让我们tap151034i1像这样为 vlan42 创建一个子接口:

ip link add link tap151034i1 name test type vlan protocol 802.1q id 42 reorder_hdr on gvrp on mvrp on loose_binding off; ip link set up dev test

跑步时tcpdump -enlvvv -i test我根本看不到任何交通。

有一个vmbr42,可能会产生干扰(但如果是这样,为什么它会干扰?):

vmbr42          8000.9a0f54fe1040       no              bond0.42
                                                        fwpr103p0
                                                        fwpr104p0
                                                        fwpr105p0
                                                        fwpr151034p0
                                                        tap102i0

ip -d link sh

31: vmbr42: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 9a:0f:54:fe:10:40 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535 
    bridge forward_delay 0 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 0 vlan_protocol 802.1Q bridge_id 8000.9a:f:54:fe:10:40 designated_root 8000.9a:f:54:fe:10:40 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer    0.00 tcn_timer    0.00 topology_change_timer    0.00 gc_timer   53.08 vlan_default_pvid 1 vlan_stats_enabled 0 vlan_stats_per_port 0 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 16 mcast_hash_max 4096 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3124 mcast_stats_enabled 0 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

注意vlan_filtering0

在其成员之一的或tcpump -enlvvv上运行,显示VLAN42流量,没有标签——这并不奇怪。vmbr42tap102i0

没有ebtablesarptables规则。

我想我不明白 Linux 中 VLAN 成员资格和桥接接口之间的相互作用。

一些理论问题:

  1. self使用关键字 in将 VLAN 添加到网桥主接口会产生什么效果bridge vlan add
  2. 创建网桥成员接口的 VLAN 子接口有什么作用?
  3. 如果物理接口有 VLAN 子接口,并且已将其添加到网桥,那么该 VLAN 的任何帧是否应该在相同物理接口所属的其他网桥上可见?如果不是,原因是什么?
  4. 从理论和实践角度来看,一方面创建物理接口的 VLAN 子接口并桥接这些接口,另一方面vlan_filtering在桥接器上启用并用来bridge vlan pvid untagged将一些成员接口放置在特定的 VLAN 中,这两者之间有什么区别?
  5. 你能混合这两种方法吗?

编辑:删除了评论中显示不相关的内容,并添加了理论问题,希望有助于更好地构建答案。

答案1

但是为什么它会出现于桥接接口上呢?

可以将 Linux 桥视为“虚拟管理的 L2 交换机”,其中桥接接口是主机本身连接到交换机的一种方式。因此,桥接接口被认为是主机“连接”的“交换机端口”。

现在,让我们暂时将“虚拟”交换机改为真实交换机。某个端口正在与其他端口通信。交换机的特性是,这种流量不应该在其他端口上可见:只有当它不知道目标 MAC 地址位于哪个端口,或者地址被广播时,它才会泛洪流量。

回到我们的“虚拟”设置:虚拟机分接端口与“物理”端口 bond0 通信,为什么应该在第三个不相关的端口(即“主机”端口,以网桥本身命名)上看到此流量?ARP 查询是网络上出现的唯一广播数据包,并且这些数据包已正确广播,因此您可以看到它们;其余的则看不到。

STP BPDU 是不同的野兽。启用了 STP 处理的网桥会自行生成它们并发送到每个(启用 STP 的)端口。如果您在服务器上看到它,则可能意味着您配置错误。最好禁用网桥上的 STP,并将另一侧的端口(绑定接口,例如 Cisco 的 Port-Channel 等)配置为 STP 的被动端口(不向端口发送任何 BPDU,如果收到 BPDU,则阻止端口)。


更新型多巴胺

PVE 不会在主机端口上启用随机 VLAN。这是我的bridve -c vlan show界面:

root@vh2:~# bridge -c vlan show
port              vlan-id  
enp5s0f0          1 PVID Egress Untagged
                  2-4094
vmbr0             1 PVID Egress Untagged
veth105i0         111 PVID Egress Untagged
veth110i0         1 PVID Egress Untagged
                  2-4094
veth107i0         1 PVID Egress Untagged
                  2-4094

(这是完整的)。此网桥的配置/etc/network/interfaces基本与您的类似。如您所见,vmbr0(这是此主机上唯一的网桥)除了 1(实际上是此网络中未标记的 108)之外没有任何 VLAN。因此,即使我创建 vmbr0.111(网桥的 VLAN ID 111 子接口),它也不会看到任何流量,直到我将该 VLAN 添加到 vmbr0 接口,尽管 VLAN 111 那里非常吵闹。


你为什么要和我争论?我做这些事情至少有 14 年了:

root@vh2:~# ip link add testbr type bridge vlan_filtering 1 vlan_protocol 802.1Q
root@vh2:~# ip tuntap add tap0 mode tap
root@vh2:~# ip link set tap0 master testbr
root@vh2:~# bridge -c vlan show dev testbr
port              vlan-id  
testbr            1 PVID Egress Untagged
root@vh2:~# bridge -c vlan show dev tap0
port              vlan-id  
tap0              1 PVID Egress Untagged
root@vh2:~# bridge vlan add vid 100 dev testbr self pvid untagged
root@vh2:~# bridge vlan add vid 100 dev tap0 pvid untagged
root@vh2:~# bridge vlan del vid 1 dev testbr self
root@vh2:~# bridge vlan del vid 1 dev tap0
root@vh2:~# bridge vlan add vid 200 dev testbr self
root@vh2:~# bridge -c vlan show dev testbr
port              vlan-id  
testbr            100 PVID Egress Untagged
                  200
root@vh2:~# bridge -c vlan show dev tap0
port              vlan-id  
tap0              100 PVID Egress Untagged
root@vh2:~# ip tuntap del tap0 mode tap
root@vh2:~# ip link del testbr

相关内容