3.5.3 虚拟网桥 Linux Bridge

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

Linux Bridge 是 Linux 内核 2.2 版本开始提供的二层转发工具。Linux Bridge 创建以后,一头连着内核协议栈,另一端可以连接多个二层网络设备(Veth、TAP,宿主的物理网卡 eth0 也可以)。

如图 3-23 所示,网络命名空间内的 Veth 设备的另一端桥接到 Linux Bridge,它们之间的通信与物理交换机的转发行为是完全一致的,当二层数据包(帧)进入 Linux Bridge 时,它就会根据数据包的类型和目标 MAC 地址,按照如下规则处理:

  1. 如果数据包是广播帧,转发给所有桥接到该 Linux Bridge 的设备。
  2. 如果数据包是单播帧:
    • 地址转发表(FDB,Forwarding Database)中找不到该 MAC 地址(网桥与交换机类似,会学习 MAC 地址与端口的映射),则洪泛(Flooding)给所有接入网桥的设备,并把响应设备的接口与 MAC 地址学习到自己的 MAC 地址转发表中;
    • 地址转发表中找到了 MAC 地址,则直接转发到地址表中指定的设备。


图 3-23 veth 网卡与 Linux Bridge

Linux Bridge 还有一个重要的特点,它除了最基本的交换机功能,还能够将数据包送到宿主机的内核协议栈进行进一步处理。

这一点,是实现容器间通信第一步“将数据包从容器内发出去”的关键。

举个例子,某个容器 A 向另外一台节点中的容器 B 发起通信,容器 A 发出去的数据包先到达 Linux bridge,因为目的地 IP 不属于 Linux bridge 转发的范畴,因此 Linux bridge 将数据包送到宿主机协议栈,宿主机根据路由规则再送至 VETP 设备或者 TUN 设备封装成一个新的数据包(假设容器之间使用的 Overlay 网络)。

新数据包的目的 IP 属于另外一台节点,且宿主机开启了 IP forward 功能,最后数据包通过宿主机的 eth0 发送出去。

总字数:603
Last Updated:
Contributors: isno