我正在我的 Proxmox 服务器上进行实验。实验的目的是在两台控制工业设备的 PC 之间建立可靠且容错的通信。但我对实验结果感到困惑。
实验 1
网络布局如下:
+-------------------------------------------+
| ens21 x | SRV1
| | | 172.16.1.2
| br0 |
| | |
|bond0.10. * - - - + - - - - - * bond0.20|
| | | |
| ens19 x...................x ens20 |
+-------------------------------------------+
| |
vlan10 | | vlan20
| |
+-------------------------------------------+
| eth3.10 x x eth4.20 | SW1
| |
| eth1.10 x x eth2.20 |
+-------------------------------------------+
| |
| |
other |
vlan10 bridges | vlan20
or |
switches |
| |
+-------------------------------------------+
| eth3.10 x x| eth4.20 | SW2
| |
| eth1.10 x eth2 x eth3.20 |
+-------------------------------------------+
| |
vlan10 | | vlan20
| |
+-------------------------------------------+ SRV2
| ens19 ...................x ens20 | 172.16.1.1
| | | |
|bond0.10. * - - - + - - - - - * bond0.20|
| | |
| br0 |
| | |
| ens21 x |
+-------------------------------------------+
Note:
x: NIC
*: Bonding interface
....: Bonding connection
- or | seperated by space: Bridging connection
- SRV1 是 Debian VM。它有三个接口,ens19 和 ens20。ens21 为其他 VM 保留。我将 ens19 和 ens20 绑定到 bond0。Bond0 处于广播模式。IP 为 172.16.1.1 的 Br0 是 Bond0.10、Bond0.20 和 ens21 之间的桥梁。SRV2 与 SRV1 类似。br0 的 IP 为 172.16.1.2。
这是我的 SRV1 配置:
auto bond0
iface bond0 inet manual
up ifconfig $IFACE promisc
up ifconfig bond0 0.0.0.0 up
bond-slaves ens19 ens20
#bond-miimon 100
bond-downdelay 200
bond-updelay 200
#arp_interval 100
#arp_ip_target 172.16.1.2
#bond-mode active-backup
bond-mode broadcast
#bond-mode balance-alb
#pre-up echo 100 > /sys/class/net/bond0/bonding/arp_interval
#pre-up echo +172.16.1.2 > /sys/class/net/bond0/bonding/arp_ip_target
auto bond0.10
iface bond0.10 inet manual
#iface bond0.10 inet static
# address 192.168.100.11
# netmask 2558.255.255.0
# vlan-raw_device bond0
auto bond0.20
iface bond0.20 inet manual
#iface bond0.20 inet static
# address 192.168.200.12
# netmask 255.255.255.0
# vlan-raw_device bond0
auto ens21
iface ens21 inet manual
up ifconfig $IFACE promisc
auto br0
iface br0 inet static
#bridge_ports bond0 ens21
bridge_ports bond0.10 bond0.20 ens21
address 172.16.1.1
broadcast 172.16.255.255
netmask 16
bridge_stp off
bridge_fd 0
- SW1 是 Openwrt VM。SW1 有四个端口(eth1~4)。我创建了两个桥接器:br-lan10 跨 eth1.10 和 eth3.30,br-lan20 跨 eth2.20 和 eth4.20。SW2 与 SW1 类似。
SW1 上的 /etc/config/network:
config interface 'eth1_10'
option proto 'none'
option ifname 'eth1.10'
option auto '1'
config interface 'eth2_20'
option proto 'none'
option ifname 'eth2.20'
option auto '1'
config interface 'eth3_10'
option proto 'none'
option ifname 'eth3.10'
option auto '1'
config interface 'eth4_20'
option proto 'none'
option ifname 'eth4.20'
option auto '1'
config interface 'lan10'
option proto 'static'
option type 'bridge'
option ifname 'eth1.10 eth3.10'
config interface 'lan20'
option type 'bridge'
option proto 'none'
option auto '1'
option ifname 'eth2.20 eth4.20'
- 在 SW1 和 SW2 之间,可能还有其他虚拟机充当交换机。
当我从 SRV1 ping 到 SRV2 时,出现大约 40ms 的延迟,并且没有收到重复的数据包:
root@SRV1:~# ping 172.16.1.2 -c 5
PING 172.16.1.2 (172.16.1.2) 56(84) bytes of data.
64 bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=37.7 ms
64 bytes from 172.16.1.2: icmp_seq=2 ttl=64 time=44.0 ms
64 bytes from 172.16.1.2: icmp_seq=3 ttl=64 time=36.9 ms
64 bytes from 172.16.1.2: icmp_seq=4 ttl=64 time=46.1 ms
64 bytes from 172.16.1.2: icmp_seq=5 ttl=64 time=45.8 ms
--- 172.16.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 14ms
rtt min/avg/max/mdev = 36.864/42.085/46.071/3.986 ms
我还发现PROXMOX和SRV1的CPU使用率分别接近98%和86%。 监控到的流量从4KB迅速增加到120MB左右。
实验 2
我做了以下更改:
- 在 SRV1 和 SRV2 上,br0 位于 ens21 和 bond0 之上。
SRV1 上的 /etc/network/interfaces:
auto br0
iface br0 inet static
bridge_ports bond0 ens21
#bridge_ports bond0.10 bond0.20 ens21
address 172.16.1.1
broadcast 172.16.255.255
netmask 16
bridge_stp off
bridge_fd 0
- 在 SW1 上,br-lan10 位于 eth1 和 eth3.10 上方,br-lan20 位于 eth3 和 eth4.20 上方。
SW2 具有类似的配置。
这是 SW1 上的 /etc/config/network:
config interface 'lan10'
option proto 'static'
option type 'bridge'
option ifname 'eth1 eth3.10'
config interface 'lan20'
option type 'bridge'
option proto 'none'
option auto '1'
option ifname 'eth2 eth4.20
这次,整个系统运行良好:我得到了三重数据包和低延迟:
root@SRV1:~# ping 172.16.1.2 -c 5
PING 172.16.1.2 (172.16.1.2) 56(84) bytes of data.
64 bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=0.989 ms
64 bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=1.00 ms (DUP!)
64 bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=1.05 ms (DUP!)
64 bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=1.06 ms (DUP!)
<Other outputs ommited here>
64 bytes from 172.16.1.2: icmp_seq=5 ttl=64 time=0.825 ms
--- 172.16.1.2 ping statistics ---
5 packets transmitted, 5 received, +12 duplicates, 0% packet loss, time 10ms
rtt min/avg/max/mdev = 0.811/1.022/1.310/0.143 ms
问题
在做这两个实验之前我的预期是:
实验一——不会发生广播风暴,因为从SRV1的ens19到SRV2的ens19的接口和连接都在vlan10中,而从SRV1的ens20到SRV2的ens20的接口和连接都在vlan20中。
实验2——会出现广播风暴,因为存在一个环路(ens19@SRV1 -- ens19@SRV2 -- ens20@SRV2 -- ens20@SRV1 -- ens19@SRV1)。但我得到的结果却相反。
请问为什么实验一中网络出现广播风暴,而实验二中却没有呢?
多谢!
答案1
也许我对描述有点迷失......让我试试 ;-)。
SRV1/ens19 is access VLAN 10 on switch (untagged)
SRV1/ens20 is access VLAN 20 on switch (untagged)
您正在使用不同的设置通过连接/端口创建绑定接口。在我看来,这……可以说是不寻常的。接下来,一旦您创建了此绑定,您就会将 VLAN 桥接在一起……我不确定您到底想做什么。您正在逻辑上将 VLAN 修补在一起并创建循环。
我会考虑在交换机的端口上设置中继,并在端口上标记 VLAN 和相同的配置。然后在这些端口上创建绑定。然后您可以使用 bond0.10 和 bond0.20。
顺便说一句,如果你在两端都放置桥接器,就会出现很好的逻辑循环 - 你确定要这种设置吗?是否有一些 STP 可以消除这种情况?
祝你好运。