本文档涵盖 Open vSwitch(OVS)在 SDN 环境中的常用命令,包括网桥管理、端口配置、流表操作、隧道、QoS、监控与调试等。主要使用的工具包括:ovs-vsctl(配置数据库)、ovs-ofctl(OpenFlow 控制)、ovs-dpctl(数据路径管理)、ovs-appctl(运行时控制)等。

1. 网桥管理

1.1 创建网桥

bash

# 创建普通网桥
ovs-vsctl add-br <bridge_name>

# 创建带特定 datapath 类型的网桥(如 netdev)
ovs-vsctl add-br <bridge_name> -- set Bridge <bridge_name> datapath_type=netdev

1.2 列出网桥

bash

# 列出所有网桥
ovs-vsctl list-br

# 查看网桥详细信息(包括端口、流表、控制器等)
ovs-vsctl list bridge <bridge_name>

1.3 删除网桥

bash

ovs-vsctl del-br <bridge_name>

1.4 设置网桥属性

bash

# 设置 OpenFlow 协议版本(例如 1.3)
ovs-vsctl set bridge <bridge_name> protocols=OpenFlow13

# 设置失败模式(独立或安全)
ovs-vsctl set bridge <bridge_name> fail_mode=secure   # 无控制器时丢弃所有包
ovs-vsctl set bridge <bridge_name> fail_mode=standalone  # 无控制器时降级为普通交换机

# 设置控制器连接(见下文)
ovs-vsctl set-controller <bridge_name> tcp:127.0.0.1:6633

# 启用或禁用 STP
ovs-vsctl set bridge <bridge_name> stp_enable=true

2. 端口管理

2.1 添加端口

bash

# 添加物理端口
ovs-vsctl add-port <bridge_name> <port_name> -- set Interface <port_name> ofport_request=<port_number>

# 添加虚拟端口(例如内部端口)
ovs-vsctl add-port <bridge_name> <port_name> -- set Interface <port_name> type=internal

# 添加 patch 端口(成对使用)
ovs-vsctl add-port <bridge_name> patch0 -- set Interface patch0 type=patch options:peer=patch1
ovs-vsctl add-port <bridge2> patch1 -- set Interface patch1 type=patch options:peer=patch0

2.2 列出端口

bash

# 列出网桥上所有端口
ovs-vsctl list-ports <bridge_name>

# 查看端口详细信息
ovs-vsctl list interface <port_name>

# 查看端口统计
ovs-vsctl list interface <port_name> | grep statistics

2.3 删除端口

bash

ovs-vsctl del-port <bridge_name> <port_name>

2.4 配置端口属性

bash

# 设置端口 VLAN tag(access 模式)
ovs-vsctl set port <port_name> tag=100

# 设置端口 VLAN trunk
ovs-vsctl set port <port_name> trunks=100,200,300

# 设置端口链路聚合(bond)
ovs-vsctl add-bond <bridge_name> bond0 eth0 eth1 -- set bond0 bond_mode=balance-slb

# 设置端口的其他选项
ovs-vsctl set Interface <port_name> options:iface-id=<id>   # 用于 OpenStack

3. OpenFlow 控制器配置

3.1 设置控制器

bash

# 设置主控制器(可多个)
ovs-vsctl set-controller <bridge_name> tcp:192.168.1.100:6633
ovs-vsctl set-controller <bridge_name> tcp:192.168.1.101:6633

# 设置备用控制器(通过 ssl/tcp)
ovs-vsctl set-controller <bridge_name> tcp:192.168.1.102:6633

# 清除控制器
ovs-vsctl del-controller <bridge_name>

3.2 查看控制器连接状态

bash

ovs-vsctl get controller <bridge_name> is_connected
ovs-ofctl show <bridge_name>   # 显示连接信息

3.3 设置连接失败模式

bash

ovs-vsctl set bridge <bridge_name> fail_mode=secure

4. 流表操作(ovs-ofctl)

4.1 查看流表

bash

# 查看所有流表
ovs-ofctl dump-flows <bridge_name>

# 查看特定表格的流
ovs-ofctl dump-flows <bridge_name> table=<table_id>

# 显示简要统计
ovs-ofctl dump-flows <bridge_name> -O OpenFlow13

# 使用通配符过滤
ovs-ofctl dump-flows <bridge_name> "in_port=1"

4.2 添加流表项

基本格式:ovs-ofctl add-flow <bridge> "match actions=action"

常见匹配字段
  • in_port=<port> 输入端口

  • dl_src=<MAC>dl_dst=<MAC> 源/目的 MAC

  • dl_type=<ethertype> 如 0x0800 (IPv4), 0x86dd (IPv6)

  • nw_src=<IP>nw_dst=<IP> 源/目的 IP

  • nw_proto=<proto> 如 6 (TCP), 17 (UDP)

  • tp_src=<port>tp_dst=<port> TCP/UDP 端口

  • vlan_vid=<vlan> VLAN ID

  • iparptcpudp 等快捷方式

常见动作
  • output:<port> 从指定端口输出

  • drop 丢弃

  • mod_dl_src:<MAC> 修改源 MAC

  • mod_dl_dst:<MAC> 修改目的 MAC

  • mod_nw_src:<IP> 修改源 IP

  • mod_nw_dst:<IP> 修改目的 IP

  • mod_tp_src:<port> 修改 TCP/UDP 源端口

  • mod_tp_dst:<port> 修改 TCP/UDP 目的端口

  • push_vlan:<ethertype> 插入 VLAN 头

  • pop_vlan 弹出 VLAN 头

  • set_field:<value>-><field> 设置任意字段(OpenFlow 1.2+)

  • goto_table:<table> 跳转到指定表

  • resubmit(<port>,<table>) 重新提交(OVS 扩展)

示例

bash

# 从端口 1 收到的包从端口 2 转发
ovs-ofctl add-flow br0 "in_port=1 actions=output:2"

# 丢弃所有包(默认规则)
ovs-ofctl add-flow br0 "priority=0 actions=drop"

# 匹配特定 MAC 并修改目的 MAC
ovs-ofctl add-flow br0 "dl_src=00:11:22:33:44:55 actions=mod_dl_dst=00:aa:bb:cc:dd:ee,output:2"

# 匹配 IP 并修改源 IP
ovs-ofctl add-flow br0 "ip,nw_src=192.168.1.100 actions=mod_nw_src=10.0.0.1,output:3"

# 匹配 TCP 端口 80 并转发
ovs-ofctl add-flow br0 "tcp,tp_dst=80 actions=output:4"

# VLAN 处理:添加 VLAN 100 后从端口 5 转发
ovs-ofctl add-flow br0 "in_port=1 actions=push_vlan:0x8100,set_field:100->vlan_vid,output:5"

# 跳转到表 10
ovs-ofctl add-flow br0 "priority=100 actions=goto_table:10"

# 使用 set_field(OpenFlow 1.3+)
ovs-ofctl add-flow br0 -O OpenFlow13 "ip actions=set_field:10.0.0.2->nw_dst,output:2"

4.3 删除流表项

bash

# 删除所有流
ovs-ofctl del-flows <bridge_name>

# 删除匹配特定条件的流
ovs-ofctl del-flows <bridge_name> "in_port=1"
ovs-ofctl del-flows <bridge_name> "dl_type=0x0800"

4.4 修改流表项

bash

# 替换现有的流(如果存在则修改)
ovs-ofctl add-flow <bridge_name> "in_port=1 actions=output:2"  # 会覆盖已存在的相同流

4.5 设置默认表行为

bash

# 设置流表默认动作(如 drop)
ovs-ofctl add-flow <bridge_name> "table=0,priority=0 actions=drop"

5. 组表操作(Group Table)

组表用于实现多播、聚合、快速故障切换等。

5.1 查看组表

bash

ovs-ofctl dump-groups <bridge_name>

5.2 添加组

bash

# 添加 all 组(广播)
ovs-ofctl add-group <bridge_name> "group_id=1,type=all,bucket=output:1,bucket=output:2"

# 添加 select 组(负载均衡)
ovs-ofctl add-group <bridge_name> "group_id=2,type=select,bucket=output:1,bucket=output:2"

# 添加 failover 组(故障切换)
ovs-ofctl add-group <bridge_name> "group_id=3,type=ff,bucket=watch_port:1,output:1,bucket=watch_port:2,output:2"

# 添加 indirect 组(间接转发)
ovs-ofctl add-group <bridge_name> "group_id=4,type=indirect,bucket=output:3"

5.3 使用组动作

bash

# 流表项指向组
ovs-ofctl add-flow <bridge_name> "in_port=1 actions=group:1"

6. 隧道配置

OVS 支持多种隧道协议:GRE、VXLAN、Geneve、STT 等。

6.1 创建 VXLAN 隧道端口

bash

# 创建 VXLAN 端口,远端为 192.168.1.200
ovs-vsctl add-port br0 vxlan0 -- set Interface vxlan0 type=vxlan options:remote_ip=192.168.1.200

# 多播 VXLAN
ovs-vsctl add-port br0 vxlan_mcast -- set Interface vxlan_mcast type=vxlan options:remote_ip=239.1.1.1

# 指定 VXLAN 本地 IP
ovs-vsctl add-port br0 vxlan0 -- set Interface vxlan0 type=vxlan options:local_ip=10.0.0.1 options:remote_ip=192.168.1.200

6.2 创建 GRE 隧道

bash

ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.1.200

6.3 创建 Geneve 隧道(带选项)

bash

ovs-vsctl add-port br0 geneve0 -- set Interface geneve0 type=geneve options:remote_ip=192.168.1.200 options:key=100

6.4 查看隧道端口状态

bash

ovs-vsctl list interface <tunnel_port>
ovs-appctl tnl/arp/show   # 查看 ARP 缓存
ovs-appctl tnl/neigh/show # 查看邻居表

7. QoS 与流量控制

7.1 创建 QoS 策略

bash

# 创建 QoS 类型为 linux-htb(或 linux-ingress),附在端口上
ovs-vsctl set port eth0 qos=@newqos -- \
  --id=@newqos create qos type=linux-htb other-config:max-rate=10000000 queues=0=@q0,1=@q1 -- \
  --id=@q0 create queue other-config:min-rate=1000000 other-config:max-rate=5000000 -- \
  --id=@q1 create queue other-config:min-rate=1000000 other-config:max-rate=5000000

7.2 设置队列映射

bash

# 将特定流量映射到队列(通过 OpenFlow 设置队列)
ovs-ofctl add-flow br0 "in_port=1,ip,nw_src=192.168.1.0/24 actions=set_queue:0,output:2"

7.3 查看 QoS

bash

ovs-vsctl list qos
ovs-vsctl list queue

8. 监控与调试

8.1 查看网桥状态

bash

# 显示网桥基本信息
ovs-vsctl show

# 显示网桥的统计信息
ovs-vsctl list bridge <bridge_name> statistics

8.2 数据路径(datapath)查看

bash

# 查看数据路径中的所有流(内核转发)
ovs-dpctl dump-flows

# 显示数据路径
ovs-dpctl show

# 查看数据路径统计
ovs-dpctl dump-flows | grep -v "packets:0"

8.3 查看接口统计

bash

ovs-vsctl get interface <port_name> statistics
ovs-ofctl dump-ports <bridge_name>   # 端口统计
ovs-ofctl dump-ports-desc <bridge_name>  # 端口描述及统计

8.4 查看 OVS 版本和模块

bash

ovs-vsctl --version
ovs-appctl version
lsmod | grep openvswitch

8.5 日志调试

bash

# 设置日志级别(如 ofproto 模块)
ovs-appctl vlog/set ofproto:dbg

# 查看当前日志级别
ovs-appctl vlog/list

# 查看日志文件(通常 /var/log/openvswitch/)
tail -f /var/log/openvswitch/ovs-vswitchd.log

8.6 抓包

bash

# 在 OVS 端口上抓包(需要 root)
ovs-tcpdump -i <bridge_name> -w capture.pcap

# 或在指定端口
ovs-tcpdump -i <port_name> -n

8.7 查看 OpenFlow 连接状态

bash

ovs-ofctl show <bridge_name>
ovs-ofctl dump-ports <bridge_name>

8.8 检查 OVS 数据库

bash

# 直接操作 OVSDB
ovsdb-client dump
ovsdb-client list-tables

9. 高级与常用组合命令

9.1 清除所有配置

bash

ovs-vsctl del-br br0   # 删除网桥会自动清理相关配置

9.2 批量配置(使用事务)

bash

ovs-vsctl -- --id=@br create Bridge name=br0 -- set bridge br0 datapath_type=netdev \
  -- add-port br0 eth0 -- set Interface eth0 ofport_request=1

9.3 安全策略示例(模拟 MAC 学习)

bash

# 让流表模拟 MAC 学习,但需要控制器辅助,这里展示纯 OVS 实现简单 MAC 学习(通过流表不完美,但可配置)
ovs-ofctl add-flow br0 "table=0,priority=1,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,1)"
ovs-ofctl add-flow br0 "table=1,priority=10,dl_dst=01:23:45:67:89:ab actions=output:2"
# 需要更多规则... 实际上 MAC 学习通常由控制器完成

9.4 绑定多网卡(bond)

bash

# 创建 bond 端口
ovs-vsctl add-bond br0 bond0 eth0 eth1
# 设置 bond 模式(balance-slb, active-backup, balance-tcp)
ovs-vsctl set port bond0 bond_mode=balance-slb

9.5 使用 VLAN 隔离

bash

# 创建 access 端口
ovs-vsctl set port eth0 tag=100
# 创建 trunk 端口
ovs-vsctl set port eth1 trunks=100,200,300
# 在流表中处理 VLAN
ovs-ofctl add-flow br0 "vlan_vid=100 actions=output:eth1"

10. 常见故障排查

问题 命令
查看网桥是否创建成功 ovs-vsctl show
端口未显示 ovs-vsctl list-ports <br>
流表未生效 ovs-ofctl dump-flows <br>
查看控制器连接状态 ovs-ofctl show <br> 查看 "Controller" 行
隧道不通 ovs-appctl tnl/arp/showovs-appctl tnl/neigh/show,检查 MTU
数据包是否命中流表 ovs-appctl ofproto/trace <br> <packet> 模拟
查看日志 tail -f /var/log/openvswitch/ovs-vswitchd.log
重置 OVS service openvswitch-switch restart 或 systemctl restart openvswitch

11. 常用选项与参数说明

  • --may-exist:在添加端口/网桥时,若已存在则忽略错误。

  • --if-exists:删除时若不存在则忽略错误。

  • -O OpenFlow13:指定 OpenFlow 协议版本。

  • --strict:严格匹配流表项删除。

  • --all:应用于所有对象。


12. 参考资源


:以上命令基于 OVS 2.x 版本,部分高级特性可能需要特定编译选项或更新版本。在实际 SDN 环境中,请根据控制器要求(如 OpenFlow 版本、隧道类型等)进行调整。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐