用Open vSwitch给你的Ubuntu虚拟机搭个“软交换机”:从创建网桥到连接VM实战
2026/6/10 21:36:13 网站建设 项目流程

用Open vSwitch构建Ubuntu虚拟网络:从网桥配置到多虚拟机互联实战

虚拟化技术正在重塑现代开发环境的基础架构,而网络虚拟化作为其中的关键环节,直接决定了虚拟机之间的通信效率与灵活性。Open vSwitch(OVS)作为一款生产级虚拟交换机,以其丰富的功能和接近物理交换机的性能表现,成为搭建虚拟网络的理想选择。本文将带您从零开始,在Ubuntu系统上通过OVS构建一个完整的虚拟网络环境,实现多台KVM或VirtualBox虚拟机的互联互通。

1. 环境准备与基础概念

在开始动手之前,让我们先理清几个核心概念。OVS本质上是一个运行在操作系统内核中的虚拟交换机,它能够创建虚拟网桥(bridge)来连接不同的网络接口,包括物理网卡和虚拟机的虚拟网卡。与传统的Linux bridge相比,OVS支持更丰富的功能,如VLAN隔离、流量监控、QoS策略等。

准备工作清单

  • 已安装Ubuntu 20.04或更高版本的物理机或虚拟机
  • 已安装KVM或VirtualBox虚拟化平台
  • 具备sudo权限的用户账户
  • 基本的命令行操作经验

提示:虽然本文以Ubuntu为例,但大部分OVS命令在其他Linux发行版上同样适用,只需注意包管理工具的不同。

2. 创建并配置OVS网桥

网桥是OVS的核心组件,相当于物理网络中的交换机。我们将首先创建一个名为br0的网桥,并配置其网络参数。

# 创建新网桥 sudo ovs-vsctl add-br br0 # 将物理网卡(假设为ens33)添加到网桥 sudo ovs-vsctl add-port br0 ens33 # 查看网桥状态 sudo ovs-vsctl show

执行上述命令后,您将看到类似如下的输出,表明网桥创建成功:

Bridge br0 Port br0 Interface br0 type: internal Port ens33 Interface ens33

关键参数说明

参数说明典型值
add-br创建新网桥br0, br1等
add-port添加接口到网桥物理网卡或虚拟接口
del-br删除网桥后接网桥名
list-ports列出网桥所有端口后接网桥名

3. 连接KVM虚拟机到OVS网络

现在我们已经有了一个工作的OVS网桥,接下来要将虚拟机接入这个虚拟网络。以KVM为例,我们需要在创建虚拟机时指定网络连接方式。

步骤详解

  1. 首先确保libvirt服务正在运行:
sudo systemctl status libvirtd
  1. 创建虚拟机时使用OVS网桥:
sudo virt-install \ --name=vm1 \ --ram=2048 \ --vcpus=2 \ --disk path=/var/lib/libvirt/images/vm1.qcow2,size=20 \ --os-type=linux \ --os-variant=ubuntu20.04 \ --network bridge=br0,model=virtio \ --graphics spice \ --console pty,target_type=serial \ --cdrom ~/Downloads/ubuntu-20.04.3-live-server-amd64.iso
  1. 验证虚拟机网络连接:
# 在虚拟机内部检查IP地址 ip addr show # 在宿主机上查看OVS端口 sudo ovs-vsctl list-ports br0

注意:如果虚拟机无法获取IP地址,请检查宿主机上的DHCP服务是否正常运行,或者尝试手动配置静态IP。

4. 实现多虚拟机互联与外部通信

单一虚拟机的网络配置相对简单,真正的挑战在于构建多虚拟机互联的环境,同时保持与外部网络的连通性。我们将通过一个典型的三层网络拓扑来演示这一场景。

网络拓扑设计

  • 宿主机物理网卡:ens33 (连接外部网络)
  • OVS网桥:br0
  • 虚拟机1:vm1 (IP: 192.168.1.101)
  • 虚拟机2:vm2 (IP: 192.168.1.102)
  • 虚拟机3:vm3 (IP: 192.168.1.103)

配置流程

  1. 为每台虚拟机创建tap设备并连接到OVS网桥:
# 创建tap设备 sudo ip tuntap add mode tap tap0 sudo ip tuntap add mode tap tap1 sudo ip tuntap add mode tap tap2 # 将tap设备添加到OVS网桥 sudo ovs-vsctl add-port br0 tap0 sudo ovs-vsctl add-port br0 tap1 sudo ovs-vsctl add-port br0 tap2
  1. 在KVM虚拟机配置中指定使用对应的tap设备:
<interface type='ethernet'> <mac address='52:54:00:12:34:56'/> <source dev='tap0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
  1. 配置网络地址转换(NAT)实现外部访问:
# 启用IP转发 sudo sysctl -w net.ipv4.ip_forward=1 # 设置NAT规则 sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE sudo iptables -A FORWARD -i br0 -o ens33 -j ACCEPT sudo iptables -A FORWARD -i ens33 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT

5. 高级功能与性能优化

基础网络搭建完成后,我们可以进一步探索OVS的高级功能来提升网络性能和安全性。

VLAN隔离配置

# 为端口设置VLAN tag sudo ovs-vsctl set port tap0 tag=100 sudo ovs-vsctl set port tap1 tag=200 # 创建trunk端口(允许多个VLAN通过) sudo ovs-vsctl set port ens33 vlan_mode=trunk sudo ovs-vsctl set port ens33 trunks=100,200

流量监控与QoS

# 监控端口流量 sudo ovs-vsctl -- --id=@sflow create sflow agent=ens33 target=\"127.0.0.1:6343\" \ sampling=10 polling=20 -- set bridge br0 sflow=@sflow # 设置带宽限制 sudo ovs-vsctl set interface tap0 ingress_policing_rate=100000 sudo ovs-vsctl set interface tap0 ingress_policing_burst=10000

性能优化参数

参数说明推荐值
net.core.rmem_max接收缓冲区大小4194304
net.core.wmem_max发送缓冲区大小4194304
net.ipv4.tcp_rmemTCP接收窗口4096 87380 4194304
net.ipv4.tcp_wmemTCP发送窗口4096 16384 4194304

在实际项目中,我发现OVS的流表功能特别适合实现精细化的网络策略控制。例如,可以通过以下命令实现基于MAC地址的访问控制:

# 只允许特定MAC地址的流量通过 sudo ovs-ofctl add-flow br0 "priority=400,in_port=1,dl_src=52:54:00:12:34:56,actions=output:2" sudo ovs-ofctl add-flow br0 "priority=300,in_port=1,actions=drop"

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询