阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

原生OVS(未使用SDN控制器)初认识

420次阅读
没有评论

共计 8737 个字符,预计需要花费 22 分钟才能阅读完成。

安装 OVS

OVS 安装过程此处省略,参考 http://www.linuxidc.com/Linux/2017-06/144769.htm。在本例中, 会创建一个不连接到任何控制器的 OVS 交换机,并演示如何使用 ovs-octl 命令操作 OpenFlow 流表。

创建一个 OVS 交换机

创建一个叫 ovs-switch 的交换机

$ ovs-vsctl add-br ovs-switch

创建一个端口 p0,设置端口 p0 的 OpenFlow 端口编号为 100(如果在创建端口的时候没有指定 OpenFlow 端口编号,OVS 会自动生成一个)。

$ ovs-vsctl add-port ovs-switch p0 -- set Interface p0 ofport_request=100

设置网络接口设备的类型为 ”internal”。对于 internal 类型的的网络接口,OVS 会同时在 Linux 系统中创建一个可以用来收发数据的模拟网络设备。我们可以为这个网络设备配置 IP 地址、进行数据监听等操作。

  1. $ ovs-vsctl set Interface p0 type=internal 
  2. $ ethtool -i p0 
  3. driver: openvswitch 
  4. version:   
  5. firmware-version:   
  6. bus-info:   
  7. supports-statistics: no 
  8. supports-test: no 
  9. supports-eeprom-access: no 
  10. supports-register-dump: no 

为了避免网络接口上的地址和本机已有网络地址冲突,我们可以创建一个虚拟网络空间 ns0,把 p0 接口移入网络空间 ns0,并配置 IP 地址为 192.168.1.100

  1. $ ip netns add ns0 
  2. $ ip link set p0 netns ns0 
  3. $ ip netns exec ns0 ip addr add 192.168.1.100/24 dev p0 
  4. $ ip netns exec ns0 ifconfig p0 promisc up

使用同样的方法创建端口 p1、p2

创建的端口信息

端口

说明

p0

IP 地址 : 192.168.1.100/24
网络名称空间 : ns0
网络接口 MAC 地址: 66:4e:cc:ae:4d:20
OpenFlow Port Number: 100

p1

IP 地址 : 192.168.1.101/24
网络名称空间 : ns1
网络接口 MAC 地址: 46:54:8a:95:dd:f8
OpenFlow Port Number: 101

p2

IP 地址 : 192.168.1.102/24, 
网络名称空间 : ns2
网络接口 MAC 地址: 86:3b:c8:d0:44:10
OpenFlow Port Number: 102

   

创建所有的端口之后,查看 OVS 交换机的信息

  1. $ ovs-vsctl show 
  2. 30282710-d401-41878e1352388f693df7 
  3.     Bridge ovs-switch 
  4.         Port “p0” 
  5.             Interface “p0” 
  6.                 type: internal 
  7.         Port “p2” 
  8.             Interface “p2” 
  9.                 type: internal 
  10.         Port “p1” 
  11.             Interface “p1” 
  12.                 type: internal 
  13.         Port ovs-switch 
  14.             Interface ovs-switch 
  15.                 type: internal 

 

使用 ovs-ofctl 创建并测试 OpenFlow 命令

查看 Open vSwitch 中的端口信息。从输出结果中,可以获得交换机对应的 datapath ID(dpid),以及每个端口的 OpenFlow 端口编号,端口名称,当前状态等等。

  1. $ ovs-ofctl show ovs-switch 
  2. OFPT_FEATURES_REPLY (xid=0x2): dpid:00001232a237ea45 
  3. n_tables:254, n_buffers:256 
  4. capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP 
  5. actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST   
  6. SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE 
  7.  100(p0): addr:54:01:00:00:00:00 
  8.      config:     PORT_DOWN 
  9.      state:      LINK_DOWN 
  10.      speed: 0 Mbps now, 0 Mbps max 
  11.  101(p1): addr:54:01:00:00:00:00 
  12.      config:     PORT_DOWN 
  13.      state:      LINK_DOWN 
  14.      speed: 0 Mbps now, 0 Mbps max 
  15.  102(p2): addr:54:01:00:00:00:00 
  16.      config:     PORT_DOWN 
  17.      state:      LINK_DOWN 
  18.      speed: 0 Mbps now, 0 Mbps max 
  19.  LOCAL(ovs-switch): addr:12:32:a2:37:ea:45 
  20.      config:     0 
  21.      state:      0 
  22.      speed: 0 Mbps now, 0 Mbps max 
  23. OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0 

如果想获得网络接口的 OpenFlow 编号,也可以在 OVS 的数据库中查询

  1. $ ovs-vsctl get Interface p0 ofport 
  2. 100 

查看 datapath 的信息

  1. $ ovs-dpctl show 
  2. system@ovs-system: 
  3. lookups: hit:12173 missed:712 lost:0 
  4. flows: 0 
  5. port 0: ovs-system (internal) 
  6. port 1: ovs-switch (internal) 
  7. port 2: p0 (internal) 
  8. port 3: p1 (internal) 
  9. port 4: p2 (internal) 

屏蔽数据包

屏蔽所有进入 OVS 的以太网广播数据包

$ ovs-ofctl add-flow ovs-switch "table=0, dl_src=01:00:00:00:00:00/01:00:00:00:00:00, actions=drop"

 屏蔽 STP 协议的广播数据包

$ ovs-ofctl add-flow ovs-switch "table=0, dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0, actions=drop"

修改数据包

添加新的 OpenFlow 条目,修改从端口 p0 收到的数据包的源地址为 9.181.137.1

  1. $ ovs-ofctl add-flow ovs-switch “priority=1 idle_timeout=0,\ 
  2.     in_port=100,actions=mod_nw_src:9.181.137.1,normal” 

从端口 p0(192.168.1.100)发送测试数据到端口 p1(192.168.1.101)

$ ip netns exec ns0 ping 192.168.1.101

在接收端口 p1 监控数据,发现接收到的数据包的来源已经被修改为 9.181.137.1

  1. $ ip netns exec ns1 tcpdump -i p1 icmp 
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
  3. listening on p1, link-type EN10MB (Ethernet), capture size 65535 bytes 
  4. 15:59:16.885770 IP 9.181.137.1 > 192.168.1.101: ICMP echo request, id 23111, seq 457, length 64 
  5. 15:59:17.893809 IP 9.181.137.1 > 192.168.1.101: ICMP echo request, id 23111, seq 458, length 64 

重定向数据包

添加新的 OpenFlow 条目,重定向所有的 ICMP 数据包到端口 p2

$ ovs-ofctl add-flow ovs-switch idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:102

 从端口 p0(192.168.1.100)发送数据到端口 p1(192.168.1.101)

$ ip netns exec ns0 ping 192.168.1.101

 在端口 p2 上监控数据,发现数据包已被转发到端口 p2

  1. $ ip netns exec ns3 tcpdump -i p2 icmp 
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
  3. listening on p2, link-type EN10MB (Ethernet), capture size 65535 bytes 
  4. 16:07:35.677770 IP 192.168.1.100 > 192.168.1.101: ICMP echo request, id 23147, seq 25, length 64 
  5. 16:07:36.685824 IP 192.168.1.100 > 192.168.1.101: ICMP echo request, id 23147, seq 26, length 64 

修改数据包的 VLAN Tag

除了使用 ”ping”、”tcpdump” 和 ”iperf” 等 Linux 命令以外,我们也可以使用 OVS 提供的 ovs-appctl ofproto/trace 工具来测试 OVS 对数据包的转发状况。ovs-appctl ofproto/trace 可以用来生成测试用的模拟数据包,并一步步的展示 OVS 对数据包的流处理过程。在以下的例子中,我们演示一下如何使用这个命令:

修改端口 p1 的 VLAN tag 为 101,使端口 p1 成为一个隶属于 VLAN 101 的端口

$ ovs-vsctl set Port p1 tag=101

 现在由于端口 p0 和 p1 属于不同的 VLAN,它们之间无法进行数据交换。我们使用 ovs-appctl ofproto/trace 生成一个从端口 p0 发送到端口 p1 的数据包,这个数据包不包含任何 VLAN tag,并观察 OVS 的处理过程

在第一行输出中,”Flow:” 之后的字段描述了输入的流的信息。由于我们没有指定太多信息,所以多数字段(例如 dl_type 和 vlan_tci)被 OVS 设置为空值。

在第二行的输出中,”Rule:” 之后的字段描述了匹配成功的流表项。

在第三行的输出中,”OpenFlow actions” 之后的字段描述了实际执行的操作。

最后一段以 ”Final flow” 开始的字段是整个处理过程的总结,”Datapath actions: 4,1″ 代表数据包被发送到 datapath 的 4 和 1 号端口。

  1. $ ovs-appctl ofproto/trace ovs-switch in_port=100,dl_src=66:4e:cc:ae:4d:20
  2. dl_dst=46:54:8a:95:dd:f8 -generate 
  3. Flow:metadata=0,in_port=100,vlan_tci=0x0000,dl_src=66:4e:cc:ae:4d:20
  4.  dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000 
  5. Rule: table=0 cookie=0 priority=0 
  6. OpenFlow actions=NORMAL 
  7. no learned MAC for destination, flooding 
  8.  
  9. Final flow: unchanged 
  10. Relevant fields: skb_priority=0,in_port=100,vlan_tci=0x0000/0x1fff,\ 
  11. dl_src=66:4e:cc:ae:4d:20,dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000,nw_frag=no 
  12. Datapath actions: 4,1 

    创建一条新的 Flow:对于从端口 p0 进入交换机的数据包,如果它不包含任何 VLAN tag,则自动为它添加 VLAN tag 101

$ ovs-ofctl add-flow ovs-switch "priority=3,in_port=100,dl_vlan=0xffff,\

actions=mod_vlan_vid:101,normal”

 再次尝试从端口 p0 发送一个不包含任何 VLAN tag 的数据包,发现数据包进入端口 p0 之后, 会被加上 VLAN tag101, 同时转发到端口 p1 上

  1. $ ovs-appctl ofproto/trace ovs-switch in_port=100,dl_src=66:4e:cc:ae:4d:20
  2. dl_dst=46:54:8a:95:dd:f8 –generate 
  3. Flow: metadata=0,in_port=100,vlan_tci=0x0000,dl_src=66:4e:cc:ae:4d:20
  4. dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000 
  5. Rule: table=0 cookie=0 priority=3,in_port=100,vlan_tci=0x0000 
  6. OpenFlow actions=mod_vlan_vid:101,NORMAL 
  7. forwarding to learned port 
  8.  
  9. Final flow: metadata=0,in_port=100,dl_vlan=101,dl_vlan_pcp=0,dl_src=66:4e:cc:ae:4d:20
  10. dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000 
  11. Relevant fields: skb_priority=0,in_port=100,vlan_tci=0x0000/0x1fff,dl_src=66:4e:cc:ae:4d:20
  12. dl_dst=46:54:8a:95:dd:f8,dl_type=0x0000,nw_frag=no 
  13. Datapath actions: 3 

 反过来从端口 p1 发送数据包,由于 p1 现在是带有 VLAN tag 101 的 Access 类型的端口,所以数据包进入端口 p1 之后,会被 OVS 添加 VLAN tag 101 并发送到端口 p0

 $ ovs-appctl ofproto/trace ovs-switch in_port=101,dl_dst=66:4e:cc:ae:4d:20,

  1. dl_src=46:54:8a:95:dd:f8 -generate 
  2. Flow: metadata=0,in_port=101,vlan_tci=0x0000,dl_src=46:54:8a:95:dd:f8, 
  3. dl_dst=66:4e:cc:ae:4d:20,dl_type=0x0000 
  4. Rule: table=0 cookie=0 priority=0 
  5. OpenFlow actions=NORMAL 
  6. forwarding to learned port 
  7.  
  8. Final flow: unchanged 
  9. Relevant fields: skb_priority=0,in_port=101,vlan_tci=0x0000,dl_src=46:54:8a:95:dd:f8, 
  10. dl_dst=66:4e:cc:ae:4d:20,dl_type=0x0000,nw_frag=no 
  11. Datapath actions: push_vlan(vid=101,pcp=0),2 

 

其他 OpenFlow 常用的操作

查看交换机中的所有 Table
ovs-ofctl dump-tables ovs-switch
查看交换机中的所有流表项
ovs-ofctl dump-flows ovs-switch
删除编号为 100 的端口上的所有流表项
ovs-ofctl del-flows ovs-switch “in_port=100”
查看交换机上的端口信息
ovs-ofctl show ovs-switch

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-06/144768.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计8737字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7995201
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛 NAS-2:飞牛配置 RAID 磁盘阵列 前言 大家好,我是星哥之前星哥写了《星哥带你玩飞牛 ...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024 程序员】我劝你赶紧去免费领一个 AWS、华为云等的主机 每年 10 月 24 日,程序员们都会迎来...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...
300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

  300 元就能买到的 ” 小钢炮 ”?惠普 7L 四盘位小主机解析 最近...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...