To be a better coder
分类: LINUX
2020-04-14 16:04:25
网桥原理: 传统的中继器,如HUB,是一个单纯的物理层设备,它将每一个收到的数据包,在其所有的端口上广播,由接收主机来判断这个数据包是否是给自己的。 这样,网络资源被极大的浪费掉了。 网桥之所以不同于中继器,主要在于其除了有中继的作用外,还有一个更重要的作用,就是学习MAC地址,然后根据每个数据包的目的MAC与自身端口的对应, 从关联端口发送数据,而不完全地在整个网段中进行广播。所以,网桥的实现中,有两个关键点: 1、 学习MAC地址,起初,网桥是没有任何地址与端口的对应关系的,它发送数据,还是得想HUB一样,但是每发送一个数据, 它都会关心数据包的来源MAC是从自己的哪个端口来的,由于学习,建立地址-端口的对照表(CAM表)。 2、 每发送一个数据包,网桥都会提取其目的MAC地址,从自己的地址-端口对照表(CAM表)中查找由哪个端口把数据包发送出去。
首先,网桥配置好之后就能实现一个简单的交换机,而交换机的特点就是MAC地址学习,那么KVM的网卡设置成网桥之后,也就是相当于连接到了交换机上。
此时如果要实现在二层交换机或三层交换机做端口镜像,并把这个镜像的流量转到这个虚拟机的网卡上,那么会出现无法实现的问题,下面我来分析一下原因:
1、配置好网桥就成了一个交换机,注意,不是集线器。
2、那么镜像端口的流量只会到达物理网卡上,而物理网卡组成的交换机认得也就是物理网卡的MAC地址,那么此时KVM的网卡不会受到任何流量。因为KVM也是有MAC地址,并且这个MAC地址只会认为是交换机中的一台电脑而已。
3、那么如果此时要将物理网卡流量转到KVM的网卡上,实现思路估计也是在虚拟交换机上做端口镜像,而这种实现几乎是不可能的。
4、那换一种思路,将这个网桥做成的交换机做成集线器,集线器没有MAC地址学习,当有流量时会立刻分发到各个端口的主机,也就是实现端口镜像。
通过以上分析,那么只需要这几个命令即可:
# 关闭br1的mac地址学习功能和降低转发延迟
brctl setageing br1 0 brctl setfd br1 0
注意:这几个命令写在开机启动项/etc/rc.local上使其开机生效。研究过了,没别的办法可以实现。
以下内容为转载:
Bridge(桥)是 Linux 上用来做 TCP/IP 二层协议交换的设备,与现实世界中的交换机功能相似。Bridge 设备实例可以和 Linux 上其他网络设备实例连接,既 attach 一个从设备,类似于在现实世界中的交换机和一个用户终端之间连接一根网线。每当这个从物理网卡设备收到数据时都会把数据转发到 bridge 上,当 bridge 接收到此数据时,bridge进行一个和现实世界中的交换机类似的处理过程:判断包的类别(广播/单点),查找内部 MAC 端口映射表,定位目标端口号,将数据转发到目标端口或丢弃,自动更新内部 MAC 端口映射表以自我学习。而我们关闭br1的mac地址学习功能,把br1作为一个hub来使用,使其直接把流量转发到连接到br1的虚拟网卡vnet1。如果不关闭mac地址学习功能,由于br1收到的镜像流量中数据包的目的mac地址不是虚拟机的mac地址,故会直接把收到的流量丢弃,不再进行转发。