Open vSwitch(OVS)是一个高性能的多层软件交换机,专为虚拟化环境和云计算架构设计。它支持标准的管理接口和协议,如 NetFlow、sFlow、IPFIX、RSPAN、CLI、LACP、802.1ag 等,使其成为构建复杂网络拓扑的理想选择。
本指南将详细介绍 OVS 的相关命令、详细操作,并通过实例帮助您深入理解和掌握 OVS 的使用。
目录
- OVS 简介
- 安装与初始配置
- ovs-vsctl 命令详解
- ovs-ofctl 命令详解
- ovs-dpctl 命令详解
- ovs-appctl 命令详解
- 综合实例
- 常见问题与解决方案
- 总结
- 附录:常用命令速查表
1. OVS 简介
什么是 Open vSwitch?
Open vSwitch(OVS)是一个开源的虚拟交换机,旨在在虚拟化环境中提供高性能的网络连接。它支持 OpenFlow 协议,可以与 SDN 控制器集成,实现灵活的网络管理。
OVS 的主要特性
- 跨平台支持:支持 Linux、FreeBSD、Windows 等操作系统。
- OpenFlow 支持:支持 OpenFlow 1.0、1.1、1.2、1.3、1.4、1.5 协议。
- 丰富的网络功能:支持 VLAN、隧道、QoS、镜像等高级网络功能。
- 可扩展性强:可以与多种网络管理工具和 SDN 控制器集成。
2. 安装与初始配置
2.1 安装 OVS
在 Ubuntu 上,可以使用以下命令安装 OVS:
sudo apt-get update
sudo apt-get install openvswitch-switch
在 CentOS 或 RHEL 上:
sudo yum install openvswitch
2.2 启动 OVS 服务
安装完成后,启动并启用 OVS 服务:
# 在 Ubuntu 上
sudo systemctl start openvswitch-switch
sudo systemctl enable openvswitch-switch
# 在 CentOS/RHEL 上
sudo systemctl start openvswitch
sudo systemctl enable openvswitch
2.3 验证安装
使用以下命令验证 OVS 是否正确安装和运行:
sudo ovs-vsctl show
如果输出中显示了 ovs_version
等信息,表示 OVS 已成功安装并运行。
3. ovs-vsctl 命令详解
ovs-vsctl
是 OVS 的主要配置工具,用于管理 OVS 数据库,包括桥接、端口、接口等的配置。
3.1 基本桥接操作
3.1.1 创建桥接
sudo ovs-vsctl add-br <bridge_name>
示例:
sudo ovs-vsctl add-br br0
3.1.2 删除桥接
sudo ovs-vsctl del-br <bridge_name>
示例:
sudo ovs-vsctl del-br br0
3.1.3 查看桥接
sudo ovs-vsctl list-br
3.1.4 显示桥接详细信息
sudo ovs-vsctl show
3.2 端口和接口管理
3.2.1 添加端口到桥接
sudo ovs-vsctl add-port <bridge_name> <port_name>
示例:
sudo ovs-vsctl add-port br0 eth1
3.2.2 从桥接中删除端口
sudo ovs-vsctl del-port <bridge_name> <port_name>
示例:
sudo ovs-vsctl del-port br0 eth1
3.2.3 列出桥接的所有端口
sudo ovs-vsctl list-ports <bridge_name>
3.2.4 配置接口类型
指定接口类型(如 internal
):
sudo ovs-vsctl add-port <bridge_name> <interface_name> -- set Interface <interface_name> type=internal
示例:
sudo ovs-vsctl add-port br0 tap0 -- set Interface tap0 type=internal
3.3 VLAN 配置
3.3.1 为端口设置 Access VLAN
sudo ovs-vsctl set port <port_name> tag=<vlan_id>
示例:
sudo ovs-vsctl set port eth1 tag=100
3.3.2 配置 Trunk 端口
sudo ovs-vsctl set port <port_name> trunks=<vlan_id_list>
示例:
sudo ovs-vsctl set port eth2 trunks=100,200,300
3.4 隧道配置
3.4.1 创建 GRE 隧道
sudo ovs-vsctl add-port <bridge_name> <port_name> -- set interface <port_name> type=gre options:remote_ip=<remote_ip>
示例:
sudo ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.1.2
3.4.2 创建 VXLAN 隧道
sudo ovs-vsctl add-port <bridge_name> <port_name> -- set interface <port_name> type=vxlan options:remote_ip=<remote_ip>
示例:
sudo ovs-vsctl add-port br0 vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=192.168.1.3
3.5 QoS 和流量控制
3.5.1 配置 QoS 规则
sudo ovs-vsctl set port <port_name> qos=@newqos -- \
--id=@newqos create QoS type=linux-htb other-config:max-rate=<max_rate> queues:0=@q0 -- \
--id=@q0 create Queue other-config:min-rate=<min_rate>
示例:
限制端口 eth1
的最大带宽为 10Mbps:
sudo ovs-vsctl set port eth1 qos=@newqos -- \
--id=@newqos create QoS type=linux-htb other-config:max-rate=10000000 queues:0=@q0 -- \
--id=@q0 create Queue other-config:min-rate=10000000
3.5.2 查看 QoS 配置
sudo ovs-vsctl list qos
sudo ovs-vsctl list queue
3.5.3 删除 QoS 配置
sudo ovs-vsctl destroy QoS <qos_uuid>
sudo ovs-vsctl destroy Queue <queue_uuid>
4. ovs-ofctl 命令详解
ovs-ofctl
命令用于管理 OpenFlow 流表,包括添加、删除和查看流表规则。
4.1 流表管理
4.1.1 查看流表
sudo ovs-ofctl dump-flows <bridge_name>
示例:
sudo ovs-ofctl dump-flows br0
4.1.2 添加流表
sudo ovs-ofctl add-flow <bridge_name> "<flow_rule>"
示例:
sudo ovs-ofctl add-flow br0 "in_port=1,actions=output:2"
4.1.3 删除流表
删除特定流表:
sudo ovs-ofctl del-flows <bridge_name> "<flow_rule>"
删除所有流表:
sudo ovs-ofctl del-flows <bridge_name>
示例:
删除所有流表:
sudo ovs-ofctl del-flows br0
4.2 流表匹配和动作
4.2.1 流表匹配字段
in_port
:输入端口dl_src
:源 MAC 地址dl_dst
:目的 MAC 地址dl_type
:以太网类型(如 IPv4 为0x0800
)nw_src
:源 IP 地址nw_dst
:目的 IP 地址tp_src
:源端口号(TCP/UDP)tp_dst
:目的端口号(TCP/UDP)ip_proto
:IP 协议(如 TCP 为6
,UDP 为17
)
4.2.2 流表动作
output:<port>
:将数据包输出到指定端口drop
:丢弃数据包normal
:按正常的 L2/L3 转发mod_vlan_vid:<vlan_id>
:修改 VLAN IDstrip_vlan
:去除 VLAN 标签
4.3 实例讲解
4.3.1 允许特定 IP 地址的流量
允许从源 IP 为 192.168.1.100
的流量通过:
sudo ovs-ofctl add-flow br0 "priority=100,nw_src=192.168.1.100,actions=normal"
4.3.2 阻止特定端口的流量
阻止所有访问 TCP 端口 80 的流量:
sudo ovs-ofctl add-flow br0 "priority=100,tp_dst=80,actions=drop"
5. ovs-dpctl 命令详解
ovs-dpctl
用于管理 OVS 内核数据路径,包括查看和修改数据路径信息。
5.1 数据路径管理
5.1.1 列出数据路径
sudo ovs-dpctl show
5.1.2 添加数据路径
sudo ovs-dpctl add-dp <datapath_name>
5.1.3 删除数据路径
sudo ovs-dpctl del-dp <datapath_name>
5.1.4 查看数据路径中的端口
sudo ovs-dpctl dump-ports <datapath_name>
6. ovs-appctl 命令详解
ovs-appctl
命令用于与 OVS 守护进程通信,进行调试和监控。
6.1 调试和监控
6.1.1 查看 OpenFlow 连接
sudo ovs-appctl bridge/dump-flows <bridge_name>
6.1.2 查看日志级别
sudo ovs-appctl vlog/list
6.1.3 设置日志级别
sudo ovs-appctl vlog/set <module>:<level>
示例:
将 ofproto
模块的日志级别设置为 dbg
(debug):
sudo ovs-appctl vlog/set ofproto:dbg
7. 综合实例
7.1 创建桥接并添加端口
7.1.1 创建桥接 br0
sudo ovs-vsctl add-br br0
7.1.2 将物理网卡 eth1
添加到 br0
sudo ovs-vsctl add-port br0 eth1
7.1.3 创建内部接口 int0
并添加到 br0
sudo ovs-vsctl add-port br0 int0 -- set Interface int0 type=internal
7.2 配置 VLAN
7.2.1 将端口 eth1
配置为 Access VLAN 100
sudo ovs-vsctl set port eth1 tag=100
7.2.2 将端口 eth2
配置为 Trunk,允许 VLAN 100 和 200
sudo ovs-vsctl set port eth2 trunks=100,200
7.3 配置 GRE 隧道
7.3.1 在本地主机上创建 GRE 隧道接口
sudo ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.1.2
7.3.2 在远程主机上创建对应的 GRE 隧道接口
sudo ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.1.1
7.4 流量控制与 QoS
7.4.1 限制端口 eth1
的带宽为 10Mbps
sudo ovs-vsctl set port eth1 qos=@newqos -- \
--id=@newqos create QoS type=linux-htb other-config:max-rate=10000000 queues:0=@q0 -- \
--id=@q0 create Queue other-config:min-rate=10000000
7.5 配置 OpenFlow 流表
7.5.1 实现简单的 L2 转发
sudo ovs-ofctl add-flow br0 "priority=0,actions=flood"
7.5.2 根据源 MAC 地址转发
sudo ovs-ofctl add-flow br0 "priority=100,dl_src=00:11:22:33:44:55,actions=output:2"
7.5.3 配置 VLAN 转发
将 VLAN 100 的流量转发到端口 2:
sudo ovs-ofctl add-flow br0 "priority=100,vlan_tci=0x1000/0x1fff,actions=output:2"
8. 常见问题与解决方案
8.1 OVS 无法启动或服务异常
解决方案:
检查 OVS 服务状态:
sudo systemctl status openvswitch-switch
查看日志文件
/var/log/openvswitch/ovs-vswitchd.log
和/var/log/openvswitch/ovsdb-server.log
,查找错误信息。确认内核模块已加载:
lsmod | grep openvswitch
如果未加载,可以手动加载:
sudo modprobe openvswitch
8.2 网络连接中断或数据包无法转发
解决方案:
检查桥接和端口配置是否正确:
sudo ovs-vsctl show
确认流表规则是否正确:
sudo ovs-ofctl dump-flows <bridge_name>
检查防火墙设置,确保相关端口未被阻塞。
8.3 流量限制不生效
解决方案:
确认 QoS 配置正确:
sudo ovs-vsctl list qos sudo ovs-vsctl list queue
检查内核是否支持
htb
队列策略:lsmod | grep sch_htb
如果未加载,可以手动加载:
sudo modprobe sch_htb
9. 总结
通过本指南,您应该对 OVS 的基本原理、常用命令和配置方法有了全面的了解。OVS 是一个功能强大的虚拟交换机,适用于构建复杂的网络拓扑和实现高级网络功能。熟练掌握 OVS 的使用,可以帮助您在虚拟化环境中实现高效、灵活和可管理的网络架构。
10. 附录:常用命令速查表
ovs-vsctl 命令
创建桥接:
sudo ovs-vsctl add-br <bridge_name>
删除桥接:
sudo ovs-vsctl del-br <bridge_name>
添加端口到桥接:
sudo ovs-vsctl add-port <bridge_name> <port_name>
设置端口 VLAN:
sudo ovs-vsctl set port <port_name> tag=<vlan_id>
配置 Trunk 端口:
sudo ovs-vsctl set port <port_name> trunks=<vlan_id_list>
创建隧道接口:
sudo ovs-vsctl add-port <bridge_name> <port_name> -- set interface <port_name> type=<tunnel_type> options:remote_ip=<remote_ip>
ovs-ofctl 命令
查看流表:
sudo ovs-ofctl dump-flows <bridge_name>
添加流表:
sudo ovs-ofctl add-flow <bridge_name> "<flow_rule>"
删除流表:
sudo ovs-ofctl del-flows <bridge_name> "<flow_rule>"
ovs-dpctl 命令
查看数据路径:
sudo ovs-dpctl show
ovs-appctl 命令
查看日志级别:
sudo ovs-appctl vlog/list
设置日志级别:
sudo ovs-appctl vlog/set <module>:<level>