菜鸟科技网

OpenVswitch命令有哪些常用操作?

下面我将为你详细介绍 ovs-vsctl 命令,从基本结构到常用操作,并提供清晰的示例。

OpenVswitch命令有哪些常用操作?-图1
(图片来源网络,侵删)

命令基本结构

ovs-vsctl 的基本结构遵循一个模式,可以分解为几个部分:

ovs-vsctl [options] [command]
  • [options]: 全局选项,-t (超时时间), --no-wait (不等待操作完成)。
  • [command]: 具体的操作命令,如 add-br, add-port, set 等。

一个复杂的命令通常由多个子命令组成,通过换行或分号隔开,并用引号括起来,OVS 会按顺序执行这些命令。

ovs-vsctl -- --may-exist add-br br0 \
    -- set bridge br0 datapath_type=netdev \
    -- add-port br0 veth0 -- set port veth0 \
    -- set interface veth0 ofport_request=10

这个例子中, 是一个分隔符,用来告诉 ovs-vsctl 后面的参数是给 OVS 内部命令的,而不是给 ovs-vsctl 工具本身的。


核心概念

在深入命令之前,必须理解 OVS 的几个核心组件:

OpenVswitch命令有哪些常用操作?-图2
(图片来源网络,侵删)
  1. Bridge (网桥): 相当于一个虚拟交换机,你可以创建多个网桥,每个网桥是一个独立的二层交换域,默认网桥名为 br0
  2. Port (端口): 连接到网桥的端点,一个端口可以是一个物理网卡(如 eth0)、一个虚拟接口(如 veth 对的一端)、一个内部接口(如 br0 自身用于管理的 ovs-system),甚至是一个 Geneve、VXLAN 等隧道。
  3. Interface (接口): 端口所代表的网络接口,一个端口通常只包含一个接口,端口和接口的概念在很多情况下可以互换,但 port 更侧重于其在交换机上的角色,而 interface 更侧重于其网络属性。
  4. Flow (流表): OVS 的核心,它定义了交换机的转发行为,流表由多条流规则组成,每条规则包含匹配字段(如源/目的 MAC/IP、入端口等)和动作(如输出到某个端口、丢弃、修改包头等)。
  5. Datapath (数据路径): 执行流表转化的底层实现,可以是内核模块(如 system-datapath),也可以是用户空间的 DPDK(netdev-datapath)。

常用 ovs-vsctl 命令详解

网桥 管理

创建网桥

# 创建一个名为 br0 的网桥
ovs-vsctl add-br br0

删除网桥

# 删除名为 br0 的网桥 (注意:会删除其所有端口)
ovs-vsctl del-br br0

查看网桥信息

# 列出所有网桥
ovs-vsctl list-br
# 显示 br0 的详细信息
ovs-vsctl list br0
# 显示 br0 的配置信息,如 fail-mode, protocols 等
ovs-vsctl br-to-controller br0
ovs-vsctl get bridge br0 datapath_type

设置网桥属性

OpenVswitch命令有哪些常用操作?-图3
(图片来源网络,侵删)
# 设置网桥的 fail-mode 为 secure (不允许没有控制器的连接)
ovs-vsctl set bridge br0 fail-mode=secure
# 设置网桥的 STP 协议为不启用
ovs-vsctl set bridge br0 stp_enable=false
# 设置网桥使用 DPDK 作为数据路径
ovs-vsctl set bridge br0 datapath_type=netdev

端口 管理

添加端口

# 将物理网卡 eth0 添加到 br0 网桥
ovs-vsctl add-port br0 eth0
# 创建一个 veth pair,并将一端 veth0 添加到 br0
ip link add veth0 type veth peer name veth1
ovs-vsctl add-port br0 veth0

删除端口

# 从 br0 网桥删除 eth0 端口
ovs-vsctl del-port br0 eth0

查看端口信息

# 列出 br0 上的所有端口
ovs-vsctl list-ports br0
# 显示端口 eth0 的详细信息
ovs-vsctl list port eth0
# 获取端口绑定的控制器 (通常用于 patch port)
ovs-vsctl get port eth0 interfaces

设置端口属性

# 设置端口 eth0 的 VLAN tag 为 100 (trunk 模式)
ovs-vsctl set port eth0 tag=100
# 设置端口 eth0 为 trunk 模式,允许 VLAN 100 和 200 通过
ovs-vsctl set port eth0 trunks=100,200
# 设置端口 eth0 为 access 模式,PVID 为 300
ovs-vsctl clear port eth0 trunks
ovs-vsctl set port eth0 tag=300
# 设置端口的镜像属性,将流量镜像到另一个端口
ovs-vsctl -- --may-exist mirror-add mirror0 eth0 -- set port mirror0 type=mirror

接口 管理

设置接口属性

# 设置接口 veth0 的请求端口号为 10
ovs-vsctl set interface veth0 ofport_request=10
# 启用或禁用接口的混杂模式
ovs-vsctl set interface veth0 options:rxq_pcap_rx=veth0.pcap
ovs-vsctl set interface veth0 options:rxq_pcap_tx=veth0.pcap
# 获取接口的当前端口号
ovs-vsctl get interface veth0 ofport

流表 管理

添加流规则

# 在 br0 上添加一条流规则:匹配从端口 10 进来的包,动作是从端口 20 发出去
ovs-ofctl add-flow br0 "in_port=10,actions=output:20"
# 使用 ovs-vsctl 添加流 (更底层的方式,通常用 ovs-ofctl)
ovs-vsctl add-flow br0 "priority=100,ip,in_port=10,actions=mod_vlan_vid:100,output:20"

注意:直接操作流表通常使用 ovs-ofctlovs-appctlovs-vsctl 更多是用于配置交换机本身。

查看流表

# 使用 ovs-ofctl 查看流表
ovs-ofctl dump-flows br0

控制器 管理

添加控制器

# 添加一个远程控制器,IP 为 192.168.1.100,端口 6653
ovs-vsctl set-controller br0 tcp:192.168.1.100:6653
# 添加本地控制器的 Unix socket
ovs-vsctl set-controller br0 unix:/var/run/openvswitch/db.sock

删除控制器

# 删除 br0 的所有控制器
ovs-vsctl del-controller br0

查看控制器连接状态

# 查看控制器信息
ovs-vsctl list controller br0
# 使用 ovs-appctl 查看详细连接状态
ovs-appctl controller/list-connections

镜像 和 Patch Port

创建 Patch Port Patch Port 用于连接两个 OVS 网桥,实现跨网桥通信。

# 创建一对 patch port,连接 br0 和 br1
ovs-vsctl add-port br0 patch0 -- set interface patch0 type=patch options:peer=patch1
ovs-vsctl add-port br1 patch1 -- set interface patch1 type=patch options:peer=patch0

综合示例

场景:创建一个 OVS 网桥,连接一个物理网卡和一个虚拟机 veth 接口,并配置 VLAN。

  1. 创建 OVS 网桥

    ovs-vsctl add-br br-vlan
  2. 将物理网卡 eth1 加入网桥,并配置为 Trunk 模式

    ovs-vsctl add-port br-vlan eth1
    ovs-vsctl set port eth1 trunks=100,200
  3. 创建 veth pair 并加入网桥,配置为 Access 模式

    ip link add vvm-veth type veth peer name vm-veth
    ovs-vsctl add-port br-vlan vvm-veth
    ovs-vsctl set port vvm-veth tag=100
  4. 启动并配置接口

    ip link set br-vlan up
    ip link set eth1 up
    ip link set vvm-veth up
    ip link set vm-veth up
    # 为 vm-veth 分配一个 IP 地址,模拟虚拟机
    ip addr add 192.168.100.10/24 dev vm-veth
  5. 验证配置

    # 查看网桥和端口
    ovs-vsctl show

    输出结果可能如下:

    4f6b8c9e-5a2b-4c3d-9e0f-1a2b3c4d5e6f
    Bridge br-vlan
        Port br-vlan
            Interface br-vlan
                type: internal
        Port eth1
            Interface eth1
        Port vvm-veth
            tag: 100
            Interface vvm-veth
    ovs_version: "2.17.0"

其他重要工具

除了 ovs-vsctl,你还应该了解这些辅助工具:

  • ovs-ofctl: 用于直接操作 OpenFlow 流表,查看、添加、删除流规则。

    • ovs-ofctl show br0: 显示网桥端口和 OpenFlow 版本。
    • ovs-ofctl dump-flows br0: 打印所有流规则。
    • ovs-ofctl add-flow br0 "dl_type=0x0800,nw_proto=6,actions=drop": 添加一条丢弃所有 TCP 流量的规则。
  • ovs-appctl: 用于与 OVS 的内部进程(如 ovs-vswitchd, ovsdb-server)通信,获取调试信息和发送控制命令。

    • ovs-appctl -t /var/run/openvswitch/ovs-vswitchd.pid.ctl vlog/set:any:dbg: 设置日志级别为调试。
    • ovs-appctl dpif/show-dp-features br0: 显示网桥的数据路径特性。
  • ovs-dpctl: 用于检查和管理数据路径内核模块。

    • ovs-dpctl show: 显示所有数据路径及其端口。
  • ovs-appflowctl: 用于监控和管理 AppFlow。

希望这份详细的指南能帮助你更好地理解和使用 Open vSwitch!

分享:
扫描分享到社交APP
上一篇
下一篇