我对桥接世界还很陌生。我遇到了一个问题,我费了九牛二虎之力才解决,但我失败了。
我有一台安装了 (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 上。
学习到的地址存储在与每个端口(接口)关联的接口地址表中。设置此表后,网桥将检查所有收到的帧的目标地址,然后扫描接口表以查看是否已从同一地址收到帧(即,源地址与当前目标地址匹配的数据包)。存在三种可能性:
如果未找到该地址,则表示未从源接收到任何帧。源可能不存在,或者可能未使用此地址发送任何帧。(该地址也可能已被网桥删除,因为网桥软件最近重新启动、接口表中的地址条目不足或地址太旧而被删除)。由于网桥不知道使用哪个端口转发帧,因此它会将其发送到所有输出端口,但接收该帧的端口除外。(显然没有必要将其发送回接收该帧的同一电缆段,因为此电缆上的任何其他计算机/网桥肯定已经接收到该数据包。)这称为泛洪。
如果在接口表中找到该地址,并且该地址与接收该帧的端口相关联,则丢弃该帧。(该帧必须已被目的地接收。)
- 如果在接口表中找到该地址,并且该地址与接收该地址的端口不关联,则网桥会将帧转发到与该地址关联的端口。
由于计算机 Y 直接连接到 LAN A,因此源为 X、目的地为 Y 的数据包被接收并丢弃,而来自 X 且目的地为 Z 的数据包则通过网桥转发到网络 B。
解决此问题的方法: 使用以下命令将老化时间设置为零 $ brctl setageing br0 0