wangyilin
发布于 2024-10-04 / 24 阅读
0
0

虚拟网桥

在物理机环境中,我们通过交换机和路由器来连接不同的机器或者不同的子网,但是对于虚拟机环境或者容器环境中,同一台物理机器可能也会有很多个不同的网络环境,对于这些环境我们显然无法通过交换机来将它们连接起来,因此我们需要一个有一个功能来充当交换机的角色,将主机中的多个不同网络环境连接起来。

我们可以意识到,本质上网桥是Linux内核对于网络设备的一个高度抽象。用以对桥接到网桥上的网络之间的数据转发。可以将主机上真实的物理网卡(如eth0,eth1),或虚拟的网卡(tap0,tap1,vnet0,vnet1)桥接上来。桥接上来的网卡就相当于网桥上的端口。 端口收到的数据包都提交给这个虚拟的”网桥“,让其进行转发。

我们给网桥配置一个IP地址,是为了让网桥所在的主机以及所有与网桥桥接的网卡进行进行通信。

在我们常见的物理交换机中,有可以配置IP和不能配置IP两种,不能配置IP的交换机一般通过com口连上去做配置(更简单的交换机连com口的没有,不支持任何配置),而能配置IP的交换机可以在配置好IP之后,通过该IP远程连接上去做配置,从而更方便。

bridge就属于后一种交换机,自带虚拟网卡,可以配置IP,该虚拟网卡一端连在bridge上,另一端跟协议栈相连。和物理交换机一样,bridge的工作不依赖于该虚拟网卡,但bridge工作不代表机器能连上网,要看组网方式。

需要注意的是:必须给网桥br0配制IP地址,且保持和tap0所对应的虚拟机网卡上配制的ip地址在同一网段,这样才能从主机中直接访问到虚拟机

网桥的基本工作原理

  • 缓存:会首先对收到的数据帧进行缓存处理。

  • 学习:当帧经过网桥,网桥首先在表中查找帧的源MAC地址,若找不到,则将MAC地址以及端口信息记录到表中。

  • 过滤:如果数据帧的目标节点与当前帧位于同一个网段即出口等于入口,那么不进行转发

  • 转发:如果帧的目标节点位于另一个网络,如果目标网段已知,那么直接发往正确端口,否则进行广播发送

网桥工作流程

image.png

网桥维护了一个基于MAC地址的过滤数据库,库中保存了目标MAC地址以及到达它需要发往哪一个端口,即LAN所对应的输出线路。这个表项还有一个超时设置,超时后重新学习目标MAC地址。

当A尝试给B发送数据帧的时候,会发生以下的几个场景:

1、学习:站点A给B发送数据,网桥查看源地址知道通过端口1可以将帧发送给A,如果数据库中没有A的数据,那么增加表项<A,1>

2、转发:网桥不知道B在何处,因此把帧向所有自己连接的端口(除去A的源端口)广播。

3、转发:B收到A发过来的帧之后,可能会进行回应,这个过程就是B发送数据帧给A,这个时候网桥查看源地址了解到B在端口2上,过滤数据库中加入表项<B,2>,此时在过滤数据库中已有A位于端口1,因此直接向端口1转发数据。

4、过滤:现在站点C向A发送数据,由于A、C和网桥连接到同一个集线器上,网桥也会收到数据,查看源地址C,发现数据库中没有C,记录<C,1>。同时目的地A与C位于同一端口,不进行转发。

5、老化:数据库中的表项TTL超过某个值后会失效删除,一般缺省值为300秒,老化的目的是防止节点移动带来的变化。

如果在学习时发现库中已经有表项,但是对应端口变化,那么就会更新表项

使用场景

网桥通常搭配veth-pair等虚拟网络设备来保证虚拟机和容器网路的正常运行,这两种网络在数据传输流程上会有一些不同,主要区别是在与发送的数据是否要经过主机的协议栈。

虚拟机

当虚拟机的网卡和bro0连接起来之后,就可以通过tun/tap设备来对外通信,例如虚拟机发送数据的过程在主机的视角中等于用户进程使用文件描述符向某个设备写入了数据,文件描述符会与虚拟网卡tap相连接,虚拟网卡又与网桥相连接,因此这个数据包会到达网桥并由网桥决定下一步的路径,网桥将数据包通过物理网卡直接送出,因此我们可以看到,在虚拟机的网络中,数据包并没有经过主机的协议栈,而是直接通过主机网卡到达了外网。

img

容器网络

我们接着来看容器网络,在容器网络中,网桥并没有直接连接物理机的网卡,因此数据在到达网桥之后会经过物理机的协议栈再通过网卡发送出去,由于请求经过了物理机的协议栈同时又做了NAT转换,因此性能没有虚拟机方案更好,但是安全性会更强。

img


评论