不止是安装:用Open vSwitch在Ubuntu上快速搭建一个隔离的虚拟网络实验环境
2026/6/10 21:50:23 网站建设 项目流程

从零构建虚拟网络:Open vSwitch实战隔离环境搭建

在虚拟化技术日益普及的今天,网络隔离与灵活配置成为开发测试环境中的核心需求。许多初学者在完成Open vSwitch(OVS)基础安装后,往往陷入"然后呢?"的困惑——这正是本文要解决的痛点。我们将跳过那些重复的安装指南,直接带您进入实战环节:在单台Ubuntu主机上,利用OVS构建一个完全隔离的虚拟网络实验环境。

这个实验环境将模拟真实网络中的多个子网,通过OVS网桥连接不同的网络命名空间(network namespace),最终实现跨命名空间的通信控制。不同于简单的安装教程,我们将重点放在OVS的实际网络构建能力上,让您真正理解软件定义网络(SDN)的核心价值。

1. 实验环境准备与基础概念

在开始动手之前,我们需要明确几个关键概念。网络命名空间是Linux内核提供的网络隔离机制,每个命名空间拥有独立的网络设备、IP地址、路由表等。而OVS作为虚拟交换机,可以在这些隔离的命名空间之间建立连接通道。

实验环境要求

  • Ubuntu 20.04 LTS或更新版本(本文以22.04为例)
  • 已安装Open vSwitch(可通过apt install openvswitch-switch完成)
  • 管理员权限(所有命令需以sudo执行)
  • 基本的Linux命令行操作经验

验证OVS安装是否成功:

sudo ovs-vsctl show

正常输出应显示空的OVS配置,包含一个"ovs-system"的内部接口。

为什么选择OVS而不是传统Linux网桥?OVS提供了更丰富的流量控制功能,支持OpenFlow协议,并且能够轻松扩展到分布式环境。对于学习SDN原理而言,它是理想的起点。

2. 构建基础网络拓扑

我们将创建一个包含两个子网的实验环境:子网A(10.0.1.0/24)和子网B(10.0.2.0/24),通过OVS网桥互联。每个子网对应一个独立的网络命名空间,模拟不同的网络节点。

2.1 创建网络命名空间

首先创建两个命名空间,分别命名为ns1和ns2:

sudo ip netns add ns1 sudo ip netns add ns2

验证命名空间创建:

sudo ip netns list

应看到ns1和ns2在输出列表中。

2.2 初始化OVS网桥

创建一个名为br0的OVS网桥,这将作为我们的核心交换设备:

sudo ovs-vsctl add-br br0

查看网桥状态:

sudo ovs-vsctl show

现在输出中应包含br0网桥信息。

3. 连接命名空间到OVS网桥

单纯的命名空间和网桥都是孤立的,我们需要创建虚拟以太网(veth)对来连接它们。veth设备总是成对出现,就像一根虚拟网线的两端。

3.1 创建veth设备对

为ns1创建veth对veth1-br和veth1-ns:

sudo ip link add veth1-br type veth peer name veth1-ns

同样为ns2创建veth对:

sudo ip link add veth2-br type veth peer name veth2-ns

3.2 配置命名空间端

将veth的一端移动到对应的命名空间中:

sudo ip link set veth1-ns netns ns1 sudo ip link set veth2-ns netns ns2

在各自命名空间中启用并配置IP地址:

sudo ip netns exec ns1 ip addr add 10.0.1.1/24 dev veth1-ns sudo ip netns exec ns1 ip link set veth1-ns up sudo ip netns exec ns1 ip link set lo up sudo ip netns exec ns2 ip addr add 10.0.2.1/24 dev veth2-ns sudo ip netns exec ns2 ip link set veth2-ns up sudo ip netns exec ns2 ip link set lo up

3.3 连接OVS端

将veth的另一端连接到OVS网桥:

sudo ovs-vsctl add-port br0 veth1-br sudo ovs-vsctl add-port br0 veth2-br sudo ip link set veth1-br up sudo ip link set veth2-br up

4. 网络连通性测试

现在,我们的基础拓扑已经建立完成。让我们测试一下当前的网络状态。

4.1 检查OVS端口状态

查看网桥端口配置:

sudo ovs-vsctl show

应看到br0网桥下有两个端口veth1-br和veth2-br。

4.2 测试命名空间内连通性

首先测试ns1自身的回环:

sudo ip netns exec ns1 ping -c 3 10.0.1.1

同样测试ns2:

sudo ip netns exec ns2 ping -c 3 10.0.2.1

4.3 测试跨命名空间通信

尝试从ns1 ping ns2:

sudo ip netns exec ns1 ping -c 3 10.0.2.1

此时会发现ping不通,这是因为我们还没有配置任何路由或流表规则。

5. 实现跨子网通信

默认情况下,不同子网之间无法直接通信。我们需要在OVS上配置流表规则来实现这一功能。

5.1 添加流表规则

允许子网A到子网B的通信:

sudo ovs-ofctl add-flow br0 "priority=100,in_port=1,actions=output:2"

允许子网B到子网A的通信:

sudo ovs-ofctl add-flow br0 "priority=100,in_port=2,actions=output:1"

5.2 验证跨子网连通性

再次从ns1 ping ns2:

sudo ip netns exec ns1 ping -c 3 10.0.2.1

现在应该能够成功收到回复。

5.3 查看流表统计

检查流表规则的使用情况:

sudo ovs-ofctl dump-flows br0

输出将显示我们添加的规则及其匹配数据包计数。

6. 高级流量控制实战

基本的连通性已经实现,现在让我们探索OVS更强大的流量控制能力。

6.1 限制带宽

假设我们需要限制ns1到ns2的带宽为1Mbps:

sudo ovs-vsctl set port veth1-br qos=@newqos -- \ --id=@newqos create qos type=linux-htb \ queues:1=@q1 -- \ --id=@q1 create queue other-config:max-rate=1000000

6.2 实现简单ACL

阻止从ns1到ns2的ICMP流量(ping):

sudo ovs-ofctl add-flow br0 "priority=200,in_port=1,icmp,actions=drop"

测试规则是否生效:

sudo ip netns exec ns1 ping -c 3 10.0.2.1

现在ping应该再次失败,而其他流量(如TCP)仍然可以通过。

7. 环境清理与复用

实验完成后,应当正确清理环境以便下次使用。

7.1 删除流表规则

清除所有流表规则:

sudo ovs-ofctl del-flows br0

7.2 移除OVS配置

删除网桥(会自动移除所有端口):

sudo ovs-vsctl del-br br0

7.3 清理网络命名空间

删除命名空间及其中的所有配置:

sudo ip netns del ns1 sudo ip netns del ns2

在实际项目中,我发现OVS的流表规则有时会意外残留。彻底清理的一个技巧是重启openvswitch-switch服务:

sudo systemctl restart openvswitch-switch

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

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

立即咨询