我有一个内核为 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_filtering
是1
。
如果我tcpdump -enlvvv
打开 bond0,我会看到 VLAN42 的流量。如果我打开 tcpdumpvmbr666
或tap151034i1
,我看不到 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_filtering
是0
。
在其成员之一的或tcpump -enlvvv
上运行,显示VLAN42流量,没有标签——这并不奇怪。vmbr42
tap102i0
没有ebtables
或arptables
规则。
我想我不明白 Linux 中 VLAN 成员资格和桥接接口之间的相互作用。
一些理论问题:
self
使用关键字 in将 VLAN 添加到网桥主接口会产生什么效果bridge vlan add
?- 创建网桥成员接口的 VLAN 子接口有什么作用?
- 如果物理接口有 VLAN 子接口,并且已将其添加到网桥,那么该 VLAN 的任何帧是否应该在相同物理接口所属的其他网桥上可见?如果不是,原因是什么?
- 从理论和实践角度来看,一方面创建物理接口的 VLAN 子接口并桥接这些接口,另一方面
vlan_filtering
在桥接器上启用并用来bridge vlan pvid untagged
将一些成员接口放置在特定的 VLAN 中,这两者之间有什么区别? - 你能混合这两种方法吗?
编辑:删除了评论中显示不相关的内容,并添加了理论问题,希望有助于更好地构建答案。
答案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