用Open vSwitch给你的Ubuntu虚拟机搭个“软交换机”:从创建网桥到连接VM实战 用Open vSwitch构建Ubuntu虚拟网络从网桥配置到多虚拟机互联实战虚拟化技术正在重塑现代开发环境的基础架构而网络虚拟化作为其中的关键环节直接决定了虚拟机之间的通信效率与灵活性。Open vSwitchOVS作为一款生产级虚拟交换机以其丰富的功能和接近物理交换机的性能表现成为搭建虚拟网络的理想选择。本文将带您从零开始在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为例我们需要在创建虚拟机时指定网络连接方式。步骤详解首先确保libvirt服务正在运行sudo systemctl status libvirtd创建虚拟机时使用OVS网桥sudo virt-install \ --namevm1 \ --ram2048 \ --vcpus2 \ --disk path/var/lib/libvirt/images/vm1.qcow2,size20 \ --os-typelinux \ --os-variantubuntu20.04 \ --network bridgebr0,modelvirtio \ --graphics spice \ --console pty,target_typeserial \ --cdrom ~/Downloads/ubuntu-20.04.3-live-server-amd64.iso验证虚拟机网络连接# 在虚拟机内部检查IP地址 ip addr show # 在宿主机上查看OVS端口 sudo ovs-vsctl list-ports br0注意如果虚拟机无法获取IP地址请检查宿主机上的DHCP服务是否正常运行或者尝试手动配置静态IP。4. 实现多虚拟机互联与外部通信单一虚拟机的网络配置相对简单真正的挑战在于构建多虚拟机互联的环境同时保持与外部网络的连通性。我们将通过一个典型的三层网络拓扑来演示这一场景。网络拓扑设计宿主机物理网卡ens33 (连接外部网络)OVS网桥br0虚拟机1vm1 (IP: 192.168.1.101)虚拟机2vm2 (IP: 192.168.1.102)虚拟机3vm3 (IP: 192.168.1.103)配置流程为每台虚拟机创建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在KVM虚拟机配置中指定使用对应的tap设备interface typeethernet mac address52:54:00:12:34:56/ source devtap0/ model typevirtio/ address typepci domain0x0000 bus0x00 slot0x03 function0x0/ /interface配置网络地址转换(NAT)实现外部访问# 启用IP转发 sudo sysctl -w net.ipv4.ip_forward1 # 设置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 ACCEPT5. 高级功能与性能优化基础网络搭建完成后我们可以进一步探索OVS的高级功能来提升网络性能和安全性。VLAN隔离配置# 为端口设置VLAN tag sudo ovs-vsctl set port tap0 tag100 sudo ovs-vsctl set port tap1 tag200 # 创建trunk端口(允许多个VLAN通过) sudo ovs-vsctl set port ens33 vlan_modetrunk sudo ovs-vsctl set port ens33 trunks100,200流量监控与QoS# 监控端口流量 sudo ovs-vsctl -- --idsflow create sflow agentens33 target\127.0.0.1:6343\ \ sampling10 polling20 -- set bridge br0 sflowsflow # 设置带宽限制 sudo ovs-vsctl set interface tap0 ingress_policing_rate100000 sudo ovs-vsctl set interface tap0 ingress_policing_burst10000性能优化参数参数说明推荐值net.core.rmem_max接收缓冲区大小4194304net.core.wmem_max发送缓冲区大小4194304net.ipv4.tcp_rmemTCP接收窗口4096 87380 4194304net.ipv4.tcp_wmemTCP发送窗口4096 16384 4194304在实际项目中我发现OVS的流表功能特别适合实现精细化的网络策略控制。例如可以通过以下命令实现基于MAC地址的访问控制# 只允许特定MAC地址的流量通过 sudo ovs-ofctl add-flow br0 priority400,in_port1,dl_src52:54:00:12:34:56,actionsoutput:2 sudo ovs-ofctl add-flow br0 priority300,in_port1,actionsdrop