桥不转发所有stream量(Ubuntu Xenial)

我对这个桥梁世界相当陌生。 我遇到了一个问题,我打破了我的脖子修复,但我失败了。

我有一台机器(Ubuntu xenial 16.04)安装了一个访客虚拟机。 我创build了一个桥(virbr – 绑定到vnet1)来转发来自主机 – >虚拟机的所有stream量。

似乎并非所有的stream量都能正常转发。 我们错过了很多交通。 例如Trace-1到达网桥,但在vnet1上没有看到(没有任何转发)Trace-1 Trace-1的stream量示例有什么想法吗? 在Trace-2的情况下,在vnet0上看到的所有数据包(100%转发)在这里input图像描述Trace-2的stream量采样

我没有触及iptables

root@physc_host:/proc/sys/net/unix# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere udp dpt:domain ACCEPT tcp -- anywhere anywhere tcp dpt:domain ACCEPT udp -- anywhere anywhere udp dpt:bootps ACCEPT tcp -- anywhere anywhere tcp dpt:bootps ACCEPT all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere 192.168.122.0/24 ctstate RELATED,ESTABLISHED ACCEPT all -- 192.168.122.0/24 anywhere ACCEPT all -- anywhere anywhere REJECT all -- anywhere anywhere reject-with icmp-port-unreachable REJECT all -- anywhere anywhere reject-with icmp-port-unreachable ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere ACCEPT tcp -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere udp dpt:bootpc root@physc_host:/proc/sys/net/unix# 

我find了解决我的问题。 网桥需要了解哪台计算机连接到哪个局域网。 更正式的,他们需要了解是否转发到每个地址。 要了解哪些地址正在使用以及哪些端口(网桥上的接口)理论最接近,网桥会观察收到的以太网帧的标头。 通过检查每个接收帧的MAC源地址,并logging接收到的帧的端口,桥可以知道哪些地址属于通过每个端口连接的计算机。 这就是所谓的“学习”。 在下图中,考虑三台电脑X,Y,Z。 假设每个发送帧到其他计算机。 观察到源地址X,Y在networkingA上,而计算机Z的地址将观察到在networkingB上。

学习到的地址存储在与每个端口(接口)关联的接口地址表中。 一旦build立了这个表,桥会检查所有接收到的帧的目的地址,然后扫描接口表以查看是否从相同的地址(即源地址与当前目的地址匹配的数据包) 。 存在三种可能性:

  1. 如果没有find地址,则没有从源接收到帧。 源可能不存在,或者可能没有使用此地址发送任何帧。 (该地址也可能已被桥接器删除,因为桥接软件最近重新启动,缺less接口表中的地址条目,或者由于太旧而删除地址。 由于桥不知道使用哪个端口来转发帧,所以它将把它发送到所有的输出端口,除了它被接收的端口之外。 (显然没有必要把它发回到收到的电缆段,因为这根电缆上的任何其他计算机/网桥必须已经收到了这个数据包。)这就是所谓的泛洪。

  2. 如果在接口表中find地址,并且地址与接收到该地址的端口相关联,则该帧将被丢弃。 (它必须已经被目的地收到了。)

  3. 如果在接口表中find该地址,并且该地址与接收到该地址的端口没有关联,则网桥将该帧转发到与该地址关联的端口。

因为计算机Y直接连接到局域网A,而来自目的地为Z的X的数据包被桥接器转发到networkingB,所以具有源X和目的地Y的数据包被接收和丢弃。

要解决这个问题:通过下面的命令将老化时间设置为零$ brctl setageing br0 0

在这里input图像说明