Skip to main content

Linux Bridge Networking

1. What Is Linux Bridge?

Linux Bridge(网桥) 是 Linux 内核中实现的 二层(Layer 2)虚拟交换机

  • 工作在 数据链路层(Ethernet)
  • 依据 MAC 地址 转发数据帧
  • 行为类似于物理交换机(Switch)

Linux Bridge = 内核里的二层交换机


2. Why Linux Bridge?

典型需求:

  • 多个 网络命名空间(Namespace)/ 容器 / 虚拟机 互通
  • 将虚拟网络接入宿主机物理网络
  • 模拟局域网(二层广播域)

对比:

方案层级特点
Linux BridgeL2简单、稳定、支持广播
veth pairL2点对点,不是交换
Router / ip routeL3需要 IP 路由
OVSL2/L3更复杂,支持 SDN

3. Core Components

一个 Linux Bridge 网络,至少包含:

[ veth / eth ] ─┐
[ veth / tap ] ─┼── br0 (bridge)
[ veth / eth ] ─┘

核心对象:

组件作用
bridge(br0)虚拟交换机
port接入 bridge 的网卡
FDBMAC → port 转发表

4. Basic Usage

1️⃣ 创建 bridge

ip link add br0 type bridge
ip link set br0 up

2️⃣ 创建 veth pair

ip link add veth-a type veth peer name veth-b

3️⃣ 接入 bridge

ip link set veth-a master br0
ip link set veth-a up
ip link set veth-b up

veth-b 通常会被放入 namespace / 容器中


5. Frame Forwarding Mechanics

1️⃣ FDB(Forwarding Database)

Bridge 内核维护一张表:

MAC Address  →  Port
  • 学习(Learning)
    • 收到帧,记录 src MAC → ingress port
  • 转发(Forwarding)
    • dst MAC
    • 命中 → 单播
    • 未命中 → 泛洪(flood)

2️⃣ 广播 / 未知单播

  • ARP
  • DHCP
  • 未学习到 MAC

👉 会 向除入端口外的所有 port 转发


6. End-to-End Frame Path

以容器 A ping 容器 B 为例:

container A
↓ veth
host namespace
↓ bridge br0
↓ 查 FDB
↓ veth
container B

内核路径(简化):

br_handle_frame()
├─ br_fdb_update()
├─ br_fdb_find()
├─ br_forward()

7. Relationship with Layer 3 (IP)

⚠️ Bridge 本身不关心 IP

  • 只处理 Ethernet frame
  • IP / TCP / UDP 是 payload

但:

  • 可以给 bridge 配 IP(三层网关)
ip addr add 192.168.1.1/24 dev br0

用途:

  • 宿主机 ↔ 容器通信
  • bridge 作为默认网关

8. Spanning Tree Protocol (STP)

为什么需要 STP?

  • 多 bridge / 多链路
  • 防止二层环路

启用 STP

ip link set br0 type bridge stp_state 1

Docker 默认关闭 STP(拓扑简单)


9. Linux Bridge vs Open vSwitch

对比项Linux BridgeOpen vSwitch
复杂度
性能更好(DPDK)
可编程强(OpenFlow)
云原生基础主流(K8s/SDN)

10. Containers: Docker / Podman

Docker bridge 网络

docker network create mynet

本质:

  • 创建一个 br-xxxx
  • 容器通过 veth 接入
  • Docker 管理 IPAM + iptables

端口是否冲突?

不会(容器内部端口隔离)

冲突只发生在:

  • -p 8080:80
  • 映射到宿主机端口

11. Bridge and Netfilter

默认情况:

  • L2 流量 不走 iptables

开启 bridge-nf:

sysctl net.bridge.bridge-nf-call-iptables=1

用途:

  • Kubernetes
  • CNI 网络策略

12. Common Questions

Q1:Bridge 是用户态还是内核态?

✅ 内核态(net/bridge)

Q2:性能瓶颈?

  • FDB 查找
  • 广播泛洪
  • iptables / conntrack

Q3:一个 bridge 多大规模?

  • 几百到上千端口可行
  • 超大规模 → OVS / SDN

13. Debugging Cheat Sheet

bridge link           # 查看端口
bridge fdb show # MAC 表
ip -d link show br0 # bridge 详细信息
brctl show # 传统工具

14. One-Sentence Summary

Linux Bridge 是内核里的二层交换机,通过 veth/tap 把 namespace、容器、虚拟机连接成一个虚拟局域网。


15. Teaching Diagrams

图 1:Bridge + veth + namespace 拓扑图

+-------------------+        +-------------------+
| container A | | container B |
| netns A | | netns B |
| eth0 | | eth0 |
+----|--------------+ +-------|-----------+
| veth-a | veth-b
| |
---------------- host namespace -----------------
| |
| +-----------------+ |
+--------| br0 |----+
| Linux Bridge |
+-----------------+

要点:

  • Bridge 只看 MAC
  • 所有 veth 端口处于同一二层广播域

图 2:单个数据帧的内核转发路径

NIC / veth RX

br_handle_frame()
↓ 学习 src MAC
br_fdb_update()
↓ 查找 dst MAC
br_fdb_find()

命中 → br_forward()
未知 → br_flood()

16. Teaching Demo: Mini Docker Bridge

目标:不用 Docker / Podman,只用 ip 命令,理解 bridge 网络

Step 1:创建 bridge

ip link add br-demo type bridge
ip link set br-demo up

Step 2:创建两个 namespace

ip netns add ns1
ip netns add ns2

Step 3:创建 veth 并接入 bridge

ip link add veth1 type veth peer name veth1-br
ip link add veth2 type veth peer name veth2-br

ip link set veth1 netns ns1
ip link set veth2 netns ns2

ip link set veth1-br master br-demo
ip link set veth2-br master br-demo

ip link set veth1-br up
ip link set veth2-br up

ip netns exec ns1 ip link set lo up
ip netns exec ns2 ip link set lo up

Step 4:配置 IP

ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth1
ip netns exec ns2 ip addr add 10.0.0.3/24 dev veth2

ip netns exec ns1 ip link set veth1 up
ip netns exec ns2 ip link set veth2 up

Step 5:验证

ip netns exec ns1 ping 10.0.0.3
bridge fdb show br-demo

你已经复刻了:

Docker bridge 网络的 80% 本质


17. Bridge / OVS / macvlan / ipvlan Comparison

1️⃣ 总览对比表

方案工作层是否二层是否广播典型场景
Linux BridgeL2Docker / VM
Open vSwitchL2/L3K8s / 云网络
macvlanL2高性能直通
ipvlanL3大规模容器

2️⃣ Linux Bridge

优点:

  • 简单、稳定、内核原生
  • 支持广播、ARP、DHCP

缺点:

  • 广播风暴风险
  • 可编程性弱

适合:

  • 单机容器
  • 教学 / 学习网络原理

3️⃣ Open vSwitch(OVS)

veth → ovs datapath → flow table → action

特点:

  • Flow-based forwarding
  • OpenFlow / eBPF / DPDK

适合:

  • Kubernetes CNI
  • 云厂商 VPC

一句话:

Bridge 的「可编程 + 工业级版本」


4️⃣ macvlan

eth0
├─ macvlan A (独立 MAC)
├─ macvlan B

特点:

  • 每个容器一个 MAC
  • 绕过 bridge

限制:

  • 父接口无法和子接口通信(默认)

适合:

  • 极致性能
  • 直连物理网络

5️⃣ ipvlan

eth0 (一个 MAC)
├─ ipvlan A (IP 区分)
├─ ipvlan B

特点:

  • 不学习 MAC
  • 依赖 L3 转发

适合:

  • 大规模容器
  • 云原生高密度节点

18. Selection Summary

  • 🧪 学习 / 教学:Linux Bridge
  • 🐳 Docker 默认:Linux Bridge
  • ☁️ 云 / K8s:OVS / eBPF CNI
  • 🚀 极致性能:macvlan / ipvlan