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)指定目标端口(即对端监听的端口)。

接收方:自动监听相同的端口(无需额外配置),等待接收对端发来的数据。

posted @ 2025-04-28 20:16  mofy  阅读(181)  评论(0)    收藏  举报