知识卡片

Linux Bridge靠一条特殊转发规则同时充当交换机与三层网关入口

结构图卡

内容

多个容器互相通信,逐个建立[[tun-tap与veth两种虚拟网卡方案的适用场景 差异]]里的veth pair很不现实,需要虚拟交换机来收拢。Linux Bridge是这个 角色,行为和物理交换机高度一致:收到广播帧转发给所有接入设备;收到 单播帧,MAC地址在转发表里就直接转发,不在就泛洪(Flooding)并做MAC 学习;出现环路时靠生成树协议(STP)切断。但Linux Bridge比物理交换机 多一个特殊能力:它本身连着创建它的那台Linux主机(有一个隐藏端口), 可以像普通设备一样被设置IP地址——一旦设置了IP,当收到目标MAC是网桥 自己的数据包,就不再转发给任何设备,而是直接交给本机的三层协议栈处理。 这条特殊规则让Linux Bridge同时兼任了二层交换机和面向三层协议栈的入口 (相当于取代了eth0设备),只要配合简单的NAT转换,就能搭出一个最基本 的单IP容器网络:容器发出的包先到网桥(网桥即是网关),触发特殊转发 规则交给主机协议栈;主机靠Netfilter做SNAT把源IP换成物理网卡地址再发 出去;外部响应回来时再靠DNAT换回容器的内网IP。这个流程体现了本章反复 出现的分工原则:Linux Bridge负责二层转发,真正的三层路由工作则完全 由Linux内核(天然的虚拟路由器)依靠Netfilter完成,不需要专门再造一个 虚拟路由设备。

结构图

flowchart LR
    A[容器发出数据包] -->|veth pair| B[Linux Bridge]
    B -->|目标MAC非网桥自身| C[二层转发/泛洪/MAC学习]
    B -->|目标MAC是网桥自身且网桥有IP| D[交给主机三层协议栈]
    D -->|Netfilter做SNAT| E[从物理网卡eth0发出到外网]
    E -.响应返回.-> F[Netfilter做DNAT换回容器内网IP]
    F --> B

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第12章"容器间网络"12.1.3节 "虚拟化网络设备"(源文件:_epub-src对应OEBPS/Text/chapter147.xhtml) - 结论依据:原文说明Linux Bridge的二层转发规则与普通交换机一致,同时 说明它设置IP后能触发特殊转发规则、把发往自身的数据包交给三层协议栈 处理,并用单IP容器网络的完整SNAT/DNAT流程说明Linux主机作为虚拟路由器 的角色,直接支撑本卡片的结构梳理。 - 原始内容:如果数据包的目的MAC地址为网桥本身,并且网桥设置了IP地址 的话,那该数据包即被认为是收到发往创建网桥那台主机的数据包……你也 可以这样理解:Linux Bridge是一个人工创建的虚拟交换机,而Linux内核 则是一个天然的虚拟路由器。