openvswitch 流表操作(四十八)

2023-05-16

流表组成

每条流表规则由一些列字段组成,可以分为基础字段、匹配字段和动作字段三部分。 在打印流表时,在流表中还存在一些显示字段,如duration,idle_age等,此处把这些字段也暂时归之于基础字段之中.

流表组成部分字段说明

基础字段

  • cookie=value 流表标识字段,cookie字段有两种书写方式:cookie=value和cookie=value/mask。mask中对应位为1时cookie中值相应的位须严格匹配,为0时cookie中值对应的位通配,当mask为-1时,必须严格匹配cookie值。
  • duration=value 流表生效时间,标识流表从下发到现在所持续的时间
  • table=tableid 流表所属表项,标识流表所属的表,默认为0
  • priority=priority 标识流表的优先级,范围为0-65535,值越大,优先级越高
  • n_packets 标识流表匹配包数
  • n_bytes 标识流表匹配字节数
  • idle_timeout=sec 流表空闲超时时间,流表会在空闲时间达到给定的时间时被删除。设置为0(默认值)时,流表不会因空闲时间被删除。
  • hard_timeout=sec 流表可存在的时间。设置此值后,流表会在到达给定时间后被删除。
  • idle_age=sec 流表空闲时间
  • hard_age=sec 流表存在时间。此字段与duration字段的区别在当流表被修改后,会重新设置hard_timer但是不会重置duration
  • ip_frag=frag_type 当dl_type指定为IP或者IPv6,frag_type指定匹配的IP分片包或者非分片包的匹配
    frag_type支持的值为: no: 仅匹配非分片报文 yes:匹配所有分片报文 first:仅匹配offset为0的分片报文
    later: 仅匹配offset非0的分片报文 not_later:匹配非分片报文和offset为0的分片报文

匹配字段

  • in_port=port 标识匹配接收数据包的端口号
  • dl_type=ethertype 匹配数据包的二层协议类型,IP数据包为0x0800,IPv6数据包为0x86dd,ARP数据包为0x0806
  • dl_src=xx:xx:xx:xx:xx:xx
  • dl_dst=xx:xx:xx:xx:xx:xx 匹配指定的链路层源或者目的MAC地址
  • dl_src=xx:xx:xx:xx:xx:xx/xx:xx:xx:xx:xx:xx
  • dl_dst=xx:xx:xx:xx:xx:xx/xx:xx:xx:xx:xx:xx 匹配指定的链路层MAC地址,MAC地址格式为ADDR/MASK,当MASK值为01:00:00:00:00:00时,仅匹配多播位。当dl_dst=01:00:00:00:00:00/01:00:00:00:00:00时,匹配所有的组播报文和广播报文。dl_dst=00:00:00:00:00:00/01:00:00:00:00:00匹配所有的单播报文。
  • nw_src=ip[/mask]
  • nw_dst=ip[/mask] 当dl_type=0x0800或指定ip时,匹配数据包的源、目的IP地址 当dl_type=0x0806或指定arp时,匹配ARP数据包的ar_spa或者ar_tpa字段
  • dl_vlan=vlan 匹配802.1Q类型(即vlan)数据包
  • nw_proto=proto 匹配数据包协议类型。当dl_type=0x0800时,匹配IP协议族的协议,例如tcp,udp,icmp等
  • nw_tos=tos 匹配IP Tos/DSCP或者IPv6的tos字段,值为0-255
  • nw_ecn=ecn 匹配IP或者IPv6的ecn字段,值为0~3
  • nw_ttl=ttl 匹配TTL值
  • tp_src=port
  • tp_dst=port 若指定了udp或者tcp协议,则匹配udp/tcp的端口号
  • icmp_type=type
  • icmp_code=code 若指定了icmp或者icmpv6协议,则匹配对应的icmp 类型或者code字段
  • arp_sha=xx:xx:xx:xx:xx:xx
  • arp_tha=xx:xx:xx:xx:xx:xx 当设置dl_type为ARP或者RARP,则arp_sha和arp_tha匹配数据包的源、目的MAC地址

动作字段

  • output:port 将数据包从port接口发送
  • enqueue:port:queue 将数据包入队到指定端口的指定队列里
  • normal 将数据包按照设备上的正常L2/L3层处理方式进行处理
  • flood 将数据包发送到交换机上除接收接口和禁止flood的接口外的所有接口
  • all 将数据包发送到除接收接口外的所有接口
  • controller(key=value…) 将数据包作为PACKET IN消息发送到OpenFlow控制器。 支持的键值对: max_len=nbytes:限制发送到控制器的数据包长度字节数,默认情况是发送整个数据包;reason=reason:在PACKET IN消息中指明发送消息的原因,支持的reason为action(default),no_match和invalid_ttl; id=controller-id:指明控制器ID
  • in_port 将数据包从接收的接口发送出去
  • drop 丢弃数据包
  • mod_vlan_vid:vlan_vid 修改数据包的vlan id
  • mod_vlan_pcp:vlan_pcp 修改数据包的vlan priority
  • strip_vlan 如果数据包中存在vlan tag,则剥离vlan tag
  • push_vlan:ethertype 为数据包添加新的vlan tag
  • mod_dl_src:mac 设置数据包的源MAC地址
  • mod_dl_dst:mac 设置数据包的目的MAC地址
  • mod_nw_src:ip 设置数据包的源IP地址
  • mod_nw_dsp:ip 设置数据包的目的IP地址
  • mod_tp_src:port 设置TCP或者UDP的源端口
  • mod_tp_dst:port 设置TCP或UDP的目的端口

下发流表

查询对应的网口序号

对应网口名称已知
如果明确的知道对应网口的名称,如vnet1,可以通过如下方式查询其对应的OpenFlow接口序号:

[root@localhost ~]$ ovs-vsctl get interface vnet1 ofport

对应网口名称未知
如果不知道对应网口的名称,但是知道其对应的MAC地址,则可以通过如下命令查找对应的网口序号:

[root@localhost ~]$ ovs-ofctl show ovsBusiness 
OFPT_FEATURES_REPLY (xid=0x2): dpid:000090e2ba0115e4
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 1(vnet1): addr:fe:ea:4a:e6:01:db
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 2(vnet2): addr:fe:ea:4a:e6:01:dc
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 3(vnet3): addr:fe:ea:4a:e6:01:5b
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 4(vnet4): addr:fe:ea:4a:e6:01:5c
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 LOCAL(ovsBusiness): addr:90:e2:ba:01:15:e4
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0

可以看到接口对应的MAC地址及接口对应的OpenFlow接口序号。

下发流表示例

如上面ovs-ofctl show ovsBusiness命令所显示的接口信息,vnet1和vnet2对应OVS的入口和出口,分别连接着客户端和服务端,vnet3和vnet4对应虚拟机的入口和出口,下面就以以上四个网口来下发流表:

根据接收端口

从一个接口接收从其他接口发送

从vnet1接收的数据包经过虚拟机后从vnet2发送出去

# 客户端访问服务端
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,in_port=1 actions=output:3"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,in_port=4 actions=output:2"
# 服务端应答客户端请求
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,in_port=2 actions=output:4"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,in_port=3 actions=output:1"

将数据包从接收端口发送

将从vnet1接收到的数据包从vnet1发送出去

ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,in_port=1 actions=in_port"

根据接收端口及IP信息

客户端IP地址为:1.1.1.12, 服务端IP地址为1.1.1.13

# 客户端访问服务端
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=1,nw_src=1.1.1.12,nw_dst=1.1.1.13 actions=output:3"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=4,nw_src=1.1.1.12,nw_dst=1.1.1.13 actions=output:2"
# 服务端相应客户端请求
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=2,nw_src=1.1.1.13,nw_dst=1.1.1.12 actions=output:4"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=3,nw_src=1.1.1.13,nw_dst=1.1.1.12 actions=output:1"
# 放通arp数据包
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=1 actions=output:3"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=4 actions=output:2"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=2 actions=output:4"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=3 actions=output:1"

根据接收端口、VLAN及IP信息

在将数据包发给虚拟机之前去vlan tag,然后数据包发送出OVS时添加vlan tag

客户端IP地址为:1.1.1.12, 服务端IP地址为1.1.1.13,vlan为10

# 客户端访问服务端
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=1,dl_vlan=10,nw_src=1.1.1.12,nw_dst=1.1.1.13 actions=strip_vlan,output:3"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=4,nw_src=1.1.1.12,nw_dst=1.1.1.13 actions=mod_vlan_vid:10,output:2"
# 服务端相应客户端请求
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=2,dl_vlan=10,nw_src=1.1.1.13,nw_dst=1.1.1.12 actions=strip_vlan,output:4"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=3,nw_src=1.1.1.13,nw_dst=1.1.1.12 actions=mod_vlan_vid:10,output:1"
# 放通arp数据包
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=1 actions=output:3"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=4 actions=output:2"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=2 actions=output:4"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=3 actions=output:1"

根据接收端口及MAC地址信息

客户端IP地址为:1.1.1.12, 服务端IP地址为1.1.1.13 客户端MAC地址为:01:01:01:01:01:02,服务端MAC地址为:01:01:01:01:01:01

# 客户端访问服务端
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=1,dl_dst=01:01:01:01:01:01 actions=strip_vlan,output:3"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=4,dl_dst=01:01:01:01:01:01 actions=mod_vlan_vid:10,output:2"

# 服务端相应客户端请求
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=2,dl_dst=01:01:01:01:01:02 actions=output:4"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,ip,in_port=3,dl_dst=01:01:01:01:01:02 actions=output:1"
# 放通arp数据包
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=1 actions=output:3"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=4 actions=output:2"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=2 actions=output:4"
ovs-ofctl add-flow ovsBusiness "cookie=0,priority=40001,arp,in_port=3 actions=output:1"

设置NORMAL转发

ovs-ofctl add-flows "priority=0 actions=NORMAL"

其他形式的流表

# 丢弃所有port 1上接收的数据包
ovs-ofctl add-flow ovsBusiness "in_port=2 actions=drop"

# 丢弃所有port 1上接收的广播报文(此处网上给出的是dl_src,我怎么感觉是dl_dst?)
ovs-ofctl add-flow ovsBusiness "priority=40001,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=drop"
# 丢弃所有STP协议的广播数据包
ovs-ofctl add-flow ovsBusiness "priority=40001,dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0 actions=drop"

# 修改从port 1上接收的数据包的源IP地址为"192.168.13.1",并从port 2口发送
ovs-ofctl add-flow ovsBusiness "priority=40001,in_port=1 actions=mod_nw_src:192.168.13.1,output:2"

# 将所有port 1接收的ICMP报文发送到port 2上去
ovs-ofctl add-flow ovsBusiness "priority=40001,dl_type=0x0800,in_port=1,nw_proto=1 actions=output:2"

# 将所有port 1接收的TCP目的端口为80的报文发送到port 2口
ovs-ofctl add-flow ovsBusiness "priority=4001,dl_type=0x0800,in_port=1,nw_proto=6,tp_dst=80 actions=output:2"

删除流表

删除全部流表

删除全部流表的命令如下:

ovs-ofctl del-flows ovsBusiness

按匹配条件删除流表

# 删除"in_port=1"的流表
ovs-ofctl del-flows ovsBusiness "in_port=1"

# 删除匹配条件为"priority=40001"的流表
ovs-ofctl del-flows ovsBusiness "priority=40001"

# 删除匹配条件为"priority=4001,ip,in_port=1,nw_src=1.1.1.12"的流表
ovs-ofctl del-flows ovsBusiness "priority=4001,ip,in_port=1,nw_src=1.1.1.12"

# 删除匹配条件为"priority=4001,ip,in_port=1,nw_src=1.1.1.12 action=output:2"的流表
ovs-ofctl del-flows ovsBusiness "priority=4001,ip,in_port=1,nw_src=1.1.1.12 action=output:2"

查看流表

查看配置的所有流表信息

查看流表命令为:

ovs-ofctl dump-flows ovsBusiness

上述命令可以查看现在OVS桥上配置的流表

查看现在生效的流表信息

查看现在生效的流表命令:

# 查看默认的datapath类型的OVS桥的生效流表
ovs-appctl dpctl/dump-flows system@ovs-system

# 查看datapath类型为netdev的OVS桥的生效流表
ovs-appctl dpctl/dump-flows netdev@ovs-netdev

上述两条命令显示结果中的in_port(port_num)和actions:port_num,port_num值可能与使用ovs-ofctl命令查看到的不一致,这是因为使用ovs-appctl命令显示的端口号是所有datapath类型的桥下接口的编号,而ovs-ofctl命令下的端口号是此OVS桥下的端口号。 查看完整的datapath类型的接口编号命令为:

# 查看当前OVS中的datapath类型
ovs-appctl dpctl/dump-dps

# 查看默认datapath类型的接口编号
ovs-appctl dpctl/show system@ovs-system

# 查看datapath=netdev类型的接口编号
ovs-appctl dpctl/show netdev@ovs-netdev

查看当前网桥的所有流表

每个网桥默认情况下会配置有默认流表,查看所有的流表信息的命令为:

ovs-appctl bridge/dump-flows ovsBusiness

注意

在配置流表时,如果需要对数据包进行修改,则对数据包的修改动作应该在output动作之前完成,否则会不生效(因为数据包已经发送出去).

原文链接:https://www.cnblogs.com/wangjq19920210/p/11776824.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openvswitch 流表操作(四十八) 的相关文章

随机推荐

  • 金蝶报错 数据读取错误。对象名‘XXX’无效

    描述 xff1a 金蝶 K3 wise 13 0 要求 xff1a 在新建了三个辅助物料 xff0c 从销售合同一致带入到销售发票 解决方式 xff1a 其实这是金蝶软件的一个bug xff0c 在官方应该是有相关补丁的 xff0c 但是对
  • LCD1602和12864显示器

    1 LCD显示器相关背景 1 1 LCD简介 1 显示器 xff0c 常见显示器 2 LCD Liquid Crystal Display xff0c 液晶显示器 xff0c 原理介绍 3 LCD应用领域 4 LED OLED 1 2 电子
  • ARM开发板没有/dev/tty0设备,startx不能打开debian图形界面

    想在ARM开发板想运行debian带图形界面的文件系统 xff0c 但是无奈每次都提示没有 dev tty0设备 xff0c 这是因为内核没有开启虚拟终端 xff0c 要去内核开启这个功能 路径是 34 Device Drivers gt
  • webpack3最新版本配置研究(五) devtool,webpack-dev-server,CommonsChunkPlugin

    devtool devtool是webpack中config自带的属性只要使用就可以了不用安装 webpack官网的解释如下 当 webpack 打包源代码时 xff0c 可能会很难追踪到错误和警告在源代码中的原始位置 例如 xff0c 如
  • VMware安装centerOS 7.0 篇幅(二) linux网络篇

    前期准备 已经安装好centerOS 安装参照 VMware安装centerOS 7 0篇幅 一 https mp csdn net postedit 86359770 进入linux后 需要配置网络 这个网络的坑 弄了很久 真的很烦 简单
  • 邀请函 | 2022 OpenAtom XuperChain 开源技术沙龙(郑州站) 报名启动!

    随着区块链技术逐步走向成熟 xff0c 区块链技术开始逐步赋能实体经济中的各个产业 xff0c 从金融到政务再到版权保护等领域 xff0c 逐渐形成了各领域的产业链条 xff0c 区块链的应用空间也在进一步放大 为了让广大区块链爱好者更好地
  • 已知IP地址和子网掩码计算网络号

    已知B类地址的子网掩码为255 255 0 0 xff0c 假设某B类地址为127 24 36 55 xff0c 那么它的网络号为 xff1a xff08 xff09 A 127 24 0 0 B 0 0 36 55 C 255 255 3
  • [技巧]Ubuntu与Windows10局域网共享文件夹

    已测试平台 Windows 10Ubuntu 18 04Ubuntu 16 04 Ubuntu 共享文件到 Windows 官方教程 xff1a https ubuntu com tutorials install and configur
  • 纯sql解决非空则按条件查询,条件值为空则不使用该条件查询

    纯SQL解决方案当传入某个值为查询条件 xff0c 非空则按条件查询 xff0c 条件值为空则不使用该条件查询 xff08 初版 xff1a 仅供参考 xff0c 暂不考虑SQL优化 xff09 sql如下 xff1a select fro
  • 页面跳转隐藏url参数

    在某些特定的情况下 xff0c 直接请求会在url显示参数传值等 xff0c 基于简单的安全性考虑 xff0c 可以去掉参数 xff0c 但是传参问题有出现了 xff0c 以下提供了一个简单的解决方案 1 a标签直接url跳转改为点击事件
  • 日期工具类

    span class token comment 获取日期之间的天数 64 param d1 64 param d2 64 return span span class token keyword public span span clas
  • centos7无网安装nginx

    解压安装nginx cd home nginx 解压 tar zxvf nginx 1 9 9 tar gz 进入nginx目录 cd nginx 1 9 9 配置 configure prefix 61 usr local nginx m
  • vue-html5-editor集成后有序列表无序列表功能问题

    解析原因 xff1a 有序列表是基于 lt ol gt lt li gt 这2个标签的 xff0c 默认这2个标签是有样式的 xff0c 可能因为网站全集样式对这2个标签的样式进行了改动 xff0c 导致默认样式丢失 xff0c 失去了排序
  • ORACLE读写分离(注:根据网上资料搭建完成步奏总结)

    研究问题 xff1a 1 什么是读写分离 xff1f 2 为什么要做读写分离 xff1f 3 ORACLE 读写分离的方式 xff0c 各有优缺点 xff1f 4 详解其中一种ORACLE 读写分离方式 一 什么是读写分离 xff1f 如图
  • ORACLE集群配置(注:根据网上资料自行搭建成功步奏总结)

    一 安装前准备 1 2台或多台linux服务器 2 每台服务器一个公用ip一个私有ip 3 公有ip xff1a 其他主机访问 2台主机最好同一ip段 4 私有ip xff1a 2台或多台虚拟机互访 2台主机最好同一ip段 5 注意 xff
  • RequestUtils工具类

    package com spring utils import javax servlet http HttpServletRequest import org springframework web context request Req
  • “玉出东方”——汉代错金稀有玉器数字藏品即将发售!

    诗经 里说 言念君子 xff0c 温其如玉 xff1b 孔子云 玉之美 xff0c 有如君子之德 xff0c 玉德是中国儒家学派的最高追求 xff0c 更是一种能彰显品格和身份的奢侈品 玉 xff0c 传承了几千年 xff0c 在东方的文明
  • 百度编辑器Ueditor上传控件相关问题解决

    1 问题原因 xff1a 由于百度编辑器相关jar包里面的class文件在某些特殊的情况下无法完全引入 xff0c 或者映入过后无法读取config json的配置文件导致上传的相关配置不正确 2 解决办法 xff1a 修改ueditor
  • OVS端口镜像(十四)

    OVS上实现端口镜像的基本流程如下 创建mirror xff0c 在mirror中指定镜像数据源及镜像目的地将创建的mirror应用到bridge中 镜像数据源可以通过下面几个选项来指定 select all 布尔值 xff0c 设置为tr
  • openvswitch 流表操作(四十八)

    流表组成 每条流表规则由一些列字段组成 xff0c 可以分为基础字段 匹配字段和动作字段三部分 在打印流表时 xff0c 在流表中还存在一些显示字段 xff0c 如duration idle age等 xff0c 此处把这些字段也暂时归之于