SDN 配置 OVS 命令大全(详细版)
本文档提供了OpenvSwitch(OVS)在SDN环境中的完整命令参考,涵盖网桥管理、端口配置、流表操作、隧道设置、QoS策略和监控调试等核心功能。主要内容包括:1)使用ovs-vsctl进行网桥和端口的基础配置;2)通过ovs-ofctl实现OpenFlow流表管理;3)各类隧道(VXLAN/GRE/Geneve)的创建方法;4)QoS策略与流量控制配置;5)系统监控和故障排查工具集。文档还包
本文档涵盖 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 -
ip,arp,tcp,udp等快捷方式
常见动作
-
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/show,ovs-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. 参考资源
-
命令手册:
man ovs-vsctl,man ovs-ofctl,man ovs-dpctl,man ovs-appctl
注:以上命令基于 OVS 2.x 版本,部分高级特性可能需要特定编译选项或更新版本。在实际 SDN 环境中,请根据控制器要求(如 OpenFlow 版本、隧道类型等)进行调整。
更多推荐
所有评论(0)