在 Linux 中,网桥(Bridge) 是一种虚拟网络设备,用于连接多个网络接口(物理或虚拟),实现二层(数据链路层)通信。常见的网桥类型包括 Linux 原生网桥、Docker 网桥 和 Open vSwitch (OVS) 网桥,它们在实现和用途上有显著差异。以下是详细对比和配置指南:
1. Linux 原生网桥
特点
内核实现:由 bridge 内核模块驱动。
轻量级:功能简单,适合基础网络隔离。
管理工具:ip 命令或 brctl(旧版)。
常用命令
# 创建网桥
ip link add br0 type bridge
ip link set br0 up
# 将接口加入网桥
ip link set eth0 master br0
# 查看网桥信息
bridge link show # 查看网桥端口
ip -d link show br0 # 查看网桥详情
典型用途
虚拟机网络(如 KVM 的虚拟网桥)。
简单的容器网络隔离。
2. Docker 网桥
特点
Docker 自动创建:默认使用 bridge 驱动生成 docker0 网桥。
隔离性:每个容器通过 veth pair 连接到网桥。
NAT 支持:容器通过 iptables NAT 规则访问外网。
管理命令
# 查看 Docker 网桥
docker network ls
docker network inspect bridge
# 自定义网桥
docker network create --driver bridge my-bridge
# 查看网桥详情
ip link show docker0
bridge link show
配置示例
# 启动容器并连接到自定义网桥
docker run -d --net=my-bridge nginx
数据路径
容器 → veth pair → docker0 网桥 → 主机 eth0 → 外网
3. Open vSwitch (OVS) 网桥
特点
高级功能:支持 VLAN、VXLAN、流量控制、SDN 等。
用户态+内核态:ovs-vswitchd 守护进程 + openvswitch 内核模块。
云原生支持:广泛用于 OpenStack、Kubernetes。
管理命令
# 创建 OVS 网桥
ovs-vsctl add-br ovs-br0
# 添加端口(物理接口或虚拟接口)
ovs-vsctl add-port ovs-br0 eth0
ovs-vsctl add-port ovs-br0 vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=10.0.0.2
# 查看网桥信息
ovs-vsctl show
ovs-ofctl dump-flows ovs-br0 # 查看流表规则
典型用途
云计算平台(如 OpenStack Neutron)。
Kubernetes 的 Overlay 网络(如 Flannel 的 VXLAN 模式)。
复杂网络策略(ACL、QoS)。
4. 三者的核心区别
特性
Linux 原生网桥
Docker 网桥
OVS 网桥
实现层级
内核模块 (bridge)
Docker 引擎 + 内核
用户态 + 内核模块
功能
基础二层交换
容器网络 + NAT
高级 SDN 功能(流表、隧道)
性能
高
中(NAT 开销)
中高(依赖配置)
VLAN 支持
是(需手动配置)
是(通过 --network 参数)
是(原生支持)
VXLAN 支持
否
否
是
典型场景
虚拟机网络
容器网络
云平台、SDN
5. 混合使用案例
场景:在 OVS 网桥上运行 Docker 容器
# 1. 创建 OVS 网桥
ovs-vsctl add-br ovs-br0
# 2. 将物理接口加入 OVS 网桥(可选)
ovs-vsctl add-port ovs-br0 eth0
# 3. 启动 Docker 并使用 OVS 网桥
docker network create -d macvlan --subnet=192.168.1.0/24 \
--gateway=192.168.1.1 -o parent=ovs-br0 ovs-net
# 4. 运行容器
docker run --net=ovs-net nginx
6. 常见问题
Q1:如何选择网桥类型?
简单容器网络 → Docker 默认网桥。
虚拟机或基础隔离 → Linux 原生网桥。
云平台或高级网络 → OVS 网桥。
Q2:OVS 网桥能否替代 Docker 网桥?
可以,但需手动配置(如通过 macvlan 驱动或 CNI 插件)。
Q3:如何监控网桥流量?
# Linux 网桥
tc -s qdisc show dev br0
# OVS 网桥
ovs-vsctl list interface ovs-br0
ovs-ofctl dump-ports ovs-br0
7. 总结
Linux 原生网桥:简单、高效,适合基础场景。
Docker 网桥:开箱即用,默认支持容器 NAT 网络。
OVS 网桥:功能强大,适合复杂网络架构。
根据需求灵活选择,三者甚至可以协同工作(如 OVS 管理底层网络,Docker 运行其上)!
如果双方配置相同的 VNI 但不同的 UDP 端口,默认情况下无法互通。
必须满足以下条件才能互通:
VNI(Virtual Network Identifier)相同(如 VNI=42)。
UDP 端口一致(默认 4789,或手动指定相同端口)。
底层 IP 网络可达(VTEP 之间能互相通信)。
在 VXLAN 配置中,“监听端口”和“目标端口”是同一个值,即:
发送方:将 VXLAN 封装的 UDP 包发送到对端指定的目标端口(如 4789)。
接收方:监听本地相同的端口(如 4789)以接收对端发来的 VXLAN 包。
因此,双方必须使用相同的 UDP 端口才能互通
发送和监听是同一端口
发送方:通过 dstport(Linux)或 options:dst_port(OVS)指定目标端口(即对端监听的端口)。
接收方:自动监听相同的端口(无需额外配置),等待接收对端发来的数据。