用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为例,我们需要在创建虚拟机时指定网络连接方式。
步骤详解:
- 首先确保libvirt服务正在运行:
sudo systemctl status libvirtd- 创建虚拟机时使用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- 验证虚拟机网络连接:
# 在虚拟机内部检查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)
配置流程:
- 为每台虚拟机创建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 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>- 配置网络地址转换(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 ACCEPT5. 高级功能与性能优化
基础网络搭建完成后,我们可以进一步探索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_rmem | TCP接收窗口 | 4096 87380 4194304 |
| net.ipv4.tcp_wmem | TCP发送窗口 | 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"