Bridge 不转发所有流量(Ubuntu Xenial)

Bridge 不转发所有流量(Ubuntu Xenial)

我对桥接世界还很陌生。我遇到了一个问题,我费了九牛二虎之力才解决,但我失败了。

我有一台安装了 (Ubuntu xenial 16.04) 的机器,上面有一个客户虚拟机。我创建了一个桥接器 (virbr - 绑定到 vnet1) 来转发从主机到虚拟机的所有流量。

似乎并非所有流量都能正常转发。我们错过了许多流量。例如 Trace-1 到达了网桥,但在 vnet1 上看不到(没有转发任何内容)Trace-1 Trace-1 的流量样本 有什么想法吗?对于 Trace-2,在 vnet0 上看到的所有数据包(100% 转发)在此处输入图像描述 Trace-2 的流量样本

我还没接触过 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# 

答案1

我找到了问题的解决方案。网桥需要了解哪些计算机连接到哪些 LAN。更正式地说,它们需要了解是否转发到每个地址。​​为了了解哪些地址正在使用,以及理论上哪些端口(网桥上的接口)最接近,网桥会观察收到的以太网帧的报头。通过检查每个收到的帧的 MAC 源地址并记录接收该帧的端口,网桥可以了解哪些地址属于通过每个端口连接的计算机。这称为“学习”。在下图中,考虑三台计算机 X、Y、Z。假设每台计算机都向其他计算机发送帧。观察到源地址 X、Y 在网络 A 上,而计算机 Z 的地址将在网络 B 上。

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

  1. 如果未找到该地址,则表示未从源接收到任何帧。源可能不存在,或者可能未使用此地址发送任何帧。(该地址也可能已被网桥删除,因为网桥软件最近重新启动、接口表中的地址条目不足或地址太旧而被删除)。由于网桥不知道使用哪个端口转发帧,因此它会将其发送到所有输出端口,但接收该帧的端口除外。(显然没有必要将其发送回接收该帧的同一电缆段,因为此电缆上的任何其他计算机/网桥肯定已经接收到该数据包。)这称为泛洪。

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

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

由于计算机 Y 直接连接到 LAN A,因此源为 X、目的地为 Y 的数据包被接收并丢弃,而来自 X 且目的地为 Z 的数据包则通过网桥转发到网络 B。

解决此问题的方法: 使用以下命令将老化时间设置为零 $ brctl setageing br0 0

在此处输入图片描述

相关内容