Administrator
Administrator
发布于 2024-12-03 / 7 阅读
0
0

Open vSwitch (OVS) 全面指南:命令、操作与实例详解

Open vSwitch(OVS)是一个高性能的多层软件交换机,专为虚拟化环境和云计算架构设计。它支持标准的管理接口和协议,如 NetFlow、sFlow、IPFIX、RSPAN、CLI、LACP、802.1ag 等,使其成为构建复杂网络拓扑的理想选择。

本指南将详细介绍 OVS 的相关命令、详细操作,并通过实例帮助您深入理解和掌握 OVS 的使用。


目录

  1. OVS 简介
  2. 安装与初始配置
  3. ovs-vsctl 命令详解
  4. ovs-ofctl 命令详解
  5. ovs-dpctl 命令详解
  6. ovs-appctl 命令详解
  7. 综合实例
  8. 常见问题与解决方案
  9. 总结
  10. 附录:常用命令速查表

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 ID
  • strip_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>
    


评论