3.5.3 Linux 网桥

物理网络中,如果需要连接多个主机,我们会使用网桥(也可以理解为交换机)设备组成一个小型局域网。在 Linux 网络虚拟化系统中,也提供了网桥虚拟实现 Linux Bridge。

Linux Bridge 是 Linux 内核 2.2 版本开始提供的二层转发工具,由 brctl 命令创建和管理。Linux Bridge 创建以后,就能够接入任何位于二层的网络设备,无论是真实的物理设备(比如 eth0),还是虚拟的设备(比如 veth 或者 tap),都能与 Linux Bridge 配合工作。

图 3-23 veth 网卡与 Linux Bridge

对于通过 brctl 命令显式接入网桥的设备,Linux Bridge 与物理交换机的转发行为是完全一致的,当有二层数据包(以太帧)从网卡进入 Linux Bridge,它就会根据数据包的类型和目标 MAC 地址,按照如下规则转发处理:

  1. 如果数据包是广播帧,转发给所有接入网桥的设备。
  2. 如果数据包是单播帧,且 MAC 地址在地址转发表中不存在(网桥与交换机类似,会学习 mac 地址与端口的映射),则洪泛(Flooding)给所有接入网桥的设备,并把响应设备的接口与 MAC 地址学习到自己的 MAC 地址转发表中。
  3. 如果数据包是单播帧,且 MAC 地址在地址转发表中已存在,则直接转发到地址表中指定的设备。
  4. 如果数据包是此前转发过的,又重新发回到此 Bridge,说明冗余链路产生了环路。由于以太帧不像 IP 报文那样有 TTL 来约束,所以一旦出现环路,如果没有额外措施来处理的话,就会永不停歇地转发下去。那么对于这种数据包,就需要交换机实现生成树协议(Spanning Tree Protocol,STP)来交换拓扑信息,生成唯一拓扑链路以切断环路。

不过 Linux Bridge 与普通物理交换机还有有一点不同,普通的交换机只会单纯地做二层转发,Linux Bridge 却还能把发给它的数据包再发送到主机的三层协议栈中。因为 Linux Bridge 本身肯定是在某台 Linux 主机上创建的,我们可以看作是 Linux Bridge 有一个与自己名字相同的隐藏端口,隐式地连接了创建它的那台 Linux 主机。因此,Linux Bridge 允许给自己设置 IP 地址,这样就比普通交换机多出了一种特殊的转发情况:如果数据包的目的 MAC 地址为网桥本身,并且网桥设置了 IP 地址的话,那该数据包就会被认为是收到发往创建网桥那台主机的数据包,这个数据包将不会转发到任何设备,而是直接交给上层(三层)协议栈去处理。这时,网桥就取代了物理网卡 eth0 设备来对接协议栈,进行三层协议的处理。

读者们是否还记得 3.3.2 节提到的设置 bridge-nf-call-iptables 参数?就是因为 Linux Bridge 与普通交换机的一点不同。

总字数:837
Last Updated:
Contributors: isno