linux 网桥 docker 网桥 ovs网桥
在 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)指定目标端口(即对端监听的端口)。
接收方:自动监听相同的端口(无需额外配置),等待接收对端发来的数据。