当前位置:   article > 正文

4.3使用Postman下发流表_sdn实验postman 下发流表

sdn实验postman 下发流表
任务内容

1、 学习OpenFlow流表的组成,包头域的解析流程及流表的匹配流程。
2、 OpenDaylight控制器对接Open vSwitch交换机
3、 使用Postman工具,下发相应的L2,L3,L4层流表,并验证。

实验原理

SDN的设计目标之一就是将网络设备的控制功能与转发功能进行分离,进而将控制功能全部集中到远程的控制器上完成,而SDN交换机只负责在本地做简单高速的数据转发。在SDN交换机运行的过程中,其数据转发的依据就是流表。

一、 流表结构

所谓流表,其实可被视作是SDN对网络设备的数据转发功能的一种抽象。在传统网络设备中,交换机和路由器的数据转发需要依赖设备中保存的二层MAC地址转发表或者三层的IP地址路由表,SDN交换机中使用的流表也是如此,不过在它的表项中整合了网络中各个层次的网络配置信息,从而在进行数据转发时可以使用更丰富的规则。其流表中的每个表项结果如下图所示:

OpenFlow1.3流表的每个表项由6部分组成:

1、匹配域:匹配域即OpenFlow1.0流表中的包头域,用于对交换机接收到的数据包的包头内容进行匹配。在OpenFlow1.0中,流表的包头域中包括了12个元组(Tuple),相关内容如下图所示:

入端口目的MAC地址以太网类型VLAN IDVLAN 优先级源IP地址目的IP地址IP协议IP TOS位TCP/UDP源端口TCP/UDP目的端口
Ingress PortEhter DesEther TypeVLAN IDVLAN PriorityIP SrcIP DstIP ProtoIP TOS bitsTCP/UDP Src PortTCP/UDP Dst Port

如上图所示,匹配域中用于和交换机接收到的数据包进行匹配的元组涵盖了ISO网络模型中的第二至第四层的网络配置信息。每一个元组中的数值可以是一个确定的值或者是“ANY”以支持对任意值的匹配。另外,如果交换机能够在IP地址相关元组上支持子网掩码的话,将有助于实现更精确的匹配。

2、优先级:流表项的匹配次序。

3、计数器:计数器可以针对交换机中每条流表、每个数据流、每个设备端口、每个转发队列进行维护,用于统计数据流表的相关信息。

4、Instructions指令集:每个流表项都包含一组指令,当一个数据包匹配表项时指令会被执行。这些指令可以更改数据包,动作集或者流表处理。

5、超时:最大时间计数或流有效时间

6、cookie:由控制器选择的不透明数据值。控制器用来过滤流统计数据、流改变和流删除。但处理数据包时不能使用。

二、 匹配域解析流程

当SDN交换机接收到一个数据包时,将按照优先级从table0依次匹配其本地保存的流表中的表项,并以发生具有最高优先级的匹配表项作为匹配结果,并根据相应的动作对数据包进行操作。同时,一旦匹配成功,对应的计数器将更新;而如果没能找到匹配的表项,则将数据包转发给控制器。
OpenFlow交换机对数据包头的解析和匹配过程的细节操作如图所示:

  1. 初始化包头域,按照包头域的组成—设置每个字段,其中入端口是接收数据包的物理端口。

  2. 如果数据包类型是VLAN(0x8100),那么就使用VLAN
    ID和PCP字段进行表查找,解封以太网类型为先的以太网类型解析做准备。

  3. (可选)如果是ARP数据包(0x0806),那么匹配字段就可能包含IP源和目的地址。

  4. 如果是IP数据包(0x0800),那么匹配字段就会包含IP首部。如果IP数据包的分段偏移量不为0或者设置了多个分段bit位,那么将所有传输端口设为0。如果IP数据包在IP协议族中的编号为6或者17(分别是TCP/UDP类型),那么匹配字段包含传输端口。如果编号为1(ICMP数据包)则包含Type和Code字段。

三、 OpenFlow1.3流表匹配流程

OpenFlow1.3匹配流程图与之前版本相比多了一个table-miss流表项,事实上此前版本就已经存在table-miss概念,只是没有在流程图中呈现出来而已。Of1.3版本的匹配流程大致如下图所示:

首先SDN交换机解析进入设备的报文,然后从table0开始匹配,按照优先级高低依次匹配该流表中的表项,一个报文在一个流表中只会匹配上一条流表项。通常根据报文的类型,报文头的字段例如源MAC地址、目的MAC地址、源IP地址、目的IP地址等进行匹配,大部分匹配还支持掩码进行更精确、灵活的匹配。也可以通过报文的入端口或者元数据信息来进行报文的匹配,一个流表项中可以同时存在多个匹配项,一个报文需要同时普票流表项中所有匹配项才能匹配该流表项。报文匹配按照现有的报文字段进行,比如前一个流表通过apply
actions改变了该报文的某个字段,则下一个表现按照修改后的字段进行匹配。如果匹配成功。则按照指令集里的动作更新动作集,活更新报文/匹配集字段,或更新元数据和计数器。根据指令是否继续前往下一个流表,不继续则终止匹配流程执行动作集,如果指令要去继续前往下一流表则继续匹配,下一个流表的ID需要比当前流表ID大。当报文匹配失败,如果存在无匹配流表项(table-miss)就按照该表项执行指令,一般是将报文转发给控制器、丢弃或者转发给其他流表。如果没有table-miss表项则默认丢弃该报文。

实验步骤

一、实验环境检查

步骤1 以root用户登录交换机,执行如下命令初始化OVS。

  1. # cd /home/fnic
  2. # ./ovs_init
  3. # cd

步骤2 登录OpenDaylight控制器,执行ifconfig命令查看控制器主机的IP地址,本实验控制器的IP地址为20.0.1.3,具体实验时以实际查到的IP地址为准。

步骤3 登录OpenDaylight控制器,执行命令netstat -an|grep 6633查看端口是否处于监听状态。


说明:由于OpenDaylight组件过于庞大,所以服务启动比较慢,需等待一段时间。

步骤4 在保证控制器6633端口处于监听状态后,再次使用root用户登录交换机,查看交换机与控制器连接情况。执行命令ovs-vsctl show查看交换机与控制器的连接情况。

  • 情况1:交换机与控制器连接成功,结果如下所示。


    如上所示controller下方显示“is_connected:true”则表明连接成功。
  • 情况2:交换机与控制器连接不成功,结果如下所示。


    当出现交换机与控制器连接不成功时,执行如下命令手动重连。
    1. # ovs-vsctl del-controller br-sw
    2. # ovs-vsctl set-controller br-sw tcp:20.0.1.3:6633
    稍等一会后,重新执行ovs-vsctl show命令查看连接状态,若controller下方显示“is_connected:true”则表明连接成功。

    步骤5 当交换机与控制器连接成功后,登录主机,执行ifconfig命令,查看主机是否获取到IP地址。

  • 情况1:主机获取到IP地址,结果如下所示。
    主机1:


    主机2:

  • 情况2:主机未获取到IP地址。
    当主机未获取到IP地址时,执行如下命令,手动重连。
    1. # ovs-vsctl del-controller br-sw
    2. # ovs-vsctl set-controller br-sw tcp:20.0.1.3:6633
    等待1-3分钟执行ifconfig命令查看主机是否重新获取到IP地址。

    步骤6 登录主机后,使用如下命令分别在两个主机上安装iPerf打流工具。

    $ sudo apt-get install iperf

    步骤7 使用如下命令检查是否安装成功。

    $ iperf -s

    步骤8 执行Ctrl+c关闭iperf应用程序。

    二、L2层流表下发与验证

    L2层即对应OSI模型的二层,也就是说通过匹配源MAC(Ether source)、目的MAC地址(Ether dst)、以太网类型(Ether Type)VLAN id、VLAN优先级等字段来实现流的转发。本实验将基于源和目的MAC进行数据流的转发。

    步骤1 登录控制器,在下方的“Application Finder”中搜索“postman”,并打开自带的Postman工具,如下图所示。

步骤2 打开Basic Auth页签,Username字段填写admin,Password字段填写admin完成认证。如下图所示。

步骤3 提交方式为GET,URL地址栏中输入http://127.0.0.1:8080/restconf/operational/network-topology:network-topology ,设置完成单击Send按钮,获取交换机id信息。如下图所示。

步骤4 下发第一条流表。

步骤5 单击页面右上角的“实验拓扑”按钮,查看主机与交换机的连接情况,如下图所示。


可知主机10.0.0.5与交换机的1端口连接,主机10.0.0.6与交换机的2端口连接。

步骤6 “Body”中选择“raw”,格式为XML(application/xml),并填写如下消息体:

流表:匹配源MAC为fa:16:3e:b4:50:07,目的MAC为fa:16:3e:5c:04:6e的流量,出端口为2。

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <flow xmlns="urn:opendaylight:flow:inventory">
  3. <priority>200</priority>
  4. <flow-name>Foo1</flow-name>
  5. <idle-timeout>0</idle-timeout>
  6. <hard-timeout>0</hard-timeout>
  7. <match>
  8. <ethernet-match>
  9. <ethernet-source>
  10. <address>fa:16:3e:b4:50:07</address>
  11. </ethernet-source>
  12. <ethernet-destination>
  13. <address>fa:16:3e:5c:04:6e</address>
  14. </ethernet-destination>
  15. </ethernet-match>
  16. </match>
  17. <id>107</id>
  18. <table_id>0</table_id>
  19. <instructions>
  20. <instruction>
  21. <order>0</order>
  22. <apply-actions>
  23. <action>
  24. <order>0</order>
  25. <output-action>
  26. <output-node-connector>2</output-node-connector>
  27. </output-action>
  28. </action>
  29. </apply-actions>
  30. </instruction>
  31. </instructions>
  32. </flow>

参数说明:

  • Priority:匹配流表的优先级。
  • flow-name:流表的名称。
  • idle-timeout:设定超时时间(seconds),参数为0表示永不超时。
  • hard-timeout:最大超时时间(seconds),参数为0表示永不超时。
  • match:匹配Fields。
  • instructions:修改action配置或pipeline处理。
  • ethernet-source:源MAC地址。
  • ethernet-destination:目的MAC地址。
    说明:实验body体在POSTMAN的Collections中提供了模板,仅供参考。

    步骤7 单击Send按钮,结果如下图所示。


    说明:可根据用户需要设置流表超时时间,idle-timeout、hard-timeout同时设置为0表示永不超时。

    步骤8 下发第二条流表。

  • 选择提交方式“PUT”。
  • URL地址栏输入:http://127.0.0.1:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:196695411516739/table/0/flow/108
  • “Body”中选择“raw”,格式为XML(application/xml),并填写如下消息体:
    流表:匹配源MAC为fa:16:3e:5c:04:6e ,目的MAC为fa:16:3e:b4:50:07 的流量,出端口为1。
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <flow xmlns="urn:opendaylight:flow:inventory">
  3. <priority>200</priority>
  4. <flow-name>Foo1</flow-name>
  5. <idle-timeout>0</idle-timeout>
  6. <hard-timeout>0</hard-timeout>
  7. <match>
  8. <ethernet-match>
  9. <ethernet-source>
  10. <address>fa:16:3e:5c:04:6e</address>
  11. </ethernet-source>
  12. <ethernet-destination>
  13. <address>fa:16:3e:b4:50:07</address>
  14. </ethernet-destination>
  15. </ethernet-match>
  16. </match>
  17. <id>108</id>
  18. <table_id>0</table_id>
  19. <instructions>
  20. <instruction>
  21. <order>0</order>
  22. <apply-actions>
  23. <action>
  24. <order>0</order>
  25. <output-action>
  26. <output-node-connector>1</output-node-connector>
  27. </output-action>
  28. </action>
  29. </apply-actions>
  30. </instruction>
  31. </instructions>
  32. </flow>

步骤9 单击“Send”按钮,结果如下图所示。

步骤10 使用root用户登录交换机,查看流表,执行命令ovs-ofctl dump-flows br-sw如下图所示。

步骤11 登录主机1,ping主机2,如下图所示。

步骤12 再次查看交换机上的流表,可以看到匹配的流表为优先级200的流表,其n_bytes值随着ping而增加,如下图所示。

步骤13 Ctrl+C停止主机上的ping操作。

步骤14 删除刚刚创建的流表,URL输入:http://127.0.0.1:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:196695411516739/table/0/flow/107 ,使用DELETE方法,如下图所示。

步骤15 单击Send按钮。

步骤16 删除第二条流表,URL输入:http://127.0.0.1:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:196695411516739/table/0/flow/108 ,使用DELETE方法,如下图所示。

步骤17 单击Send按钮。

三、L3层流表下发与验证

L3层对应OSI模型的三层,三层流表主要匹配的是IP包的协议类型和IP地址。

场景一 匹配源IP

步骤1 下发第一条流表。

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <flow xmlns="urn:opendaylight:flow:inventory">
  3. <priority>200</priority>
  4. <flow-name>Foo1</flow-name>
  5. <idle-timeout>0</idle-timeout>
  6. <hard-timeout>0</hard-timeout>
  7. <match>
  8. <ethernet-match>
  9. <ethernet-type>
  10. <type>2048</type>
  11. </ethernet-type>
  12. </ethernet-match>
  13. <ipv4-source>10.0.0.5/32</ipv4-source>
  14. </match>
  15. <id>111</id>
  16. <table_id>0</table_id>
  17. <instructions>
  18. <instruction>
  19. <order>0</order>
  20. <apply-actions>
  21. <action>
  22. <order>0</order>
  23. <output-action>
  24. <output-node-connector>2</output-node-connector>
  25. </output-action>
  26. </action>
  27. </apply-actions>
  28. </instruction>
  29. </instructions>
  30. </flow>

说明:实验body体在POSTMAN的Collections中提供了模板,仅供参考。

步骤2 单击“Send”按钮,结果如下图所示。

步骤3 下发第二条流表。

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <flow xmlns="urn:opendaylight:flow:inventory">
  3. <priority>200</priority>
  4. <flow-name>Foo1</flow-name>
  5. <idle-timeout>0</idle-timeout>
  6. <hard-timeout>0</hard-timeout>
  7. <match>
  8. <ethernet-match>
  9. <ethernet-type>
  10. <type>2048</type>
  11. </ethernet-type>
  12. </ethernet-match>
  13. <ipv4-source>10.0.0.6/32</ipv4-source>
  14. </match>
  15. <id>112</id>
  16. <table_id>0</table_id>
  17. <instructions>
  18. <instruction>
  19. <order>0</order>
  20. <apply-actions>
  21. <action>
  22. <order>0</order>
  23. <output-action>
  24. <output-node-connector>1</output-node-connector>
  25. </output-action>
  26. </action>
  27. </apply-actions>
  28. </instruction>
  29. </instructions>
  30. </flow>

步骤4 单击Send按钮,结果如下图所示。

步骤5 登录交换机执行命令ovs-ofctl dump-flows br-sw查看流表,如下所示。

步骤6 登录主机1,ping主机2,如下所示。

步骤7 交换机上再次执行命令ovs-ofctl dump-flows br-sw查看流表,下发的流表被匹配,如下所示。

步骤8 停止主机1上的ping操作。

步骤9 删除刚刚创建的流表,URL输入:http://127.0.0.1:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:196695411516739/table/0/flow/111 ,使用DELETE方法,如下图所示。

步骤10 单击Send按钮。

步骤11 删除第二条流表,URL输入:http://127.0.0.1:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:196695411516739/table/0/flow/112 ,使用DELETE方法,如下图所示。

步骤12 单击Send按钮。

场景二 匹配nw_proto字段

步骤1 下发第一条流表。

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <flow xmlns="urn:opendaylight:flow:inventory">
  3. <priority>200</priority>
  4. <flow-name>Foo1</flow-name>
  5. <idle-timeout>0</idle-timeout>
  6. <hard-timeout>0</hard-timeout>
  7. <match>
  8. <ethernet-match>
  9. <ethernet-type>
  10. <type>2048</type>
  11. </ethernet-type>
  12. </ethernet-match>
  13. <ipv4-destination>10.0.0.6/32</ipv4-destination>
  14. <ip-match>
  15. <ip-protocol>1</ip-protocol>
  16. </ip-match>
  17. </match>
  18. <id>114</id>
  19. <table_id>0</table_id>
  20. <instructions>
  21. <instruction>
  22. <order>0</order>
  23. <apply-actions>
  24. <action>
  25. <order>0</order>
  26. <output-action>
  27. <output-node-connector>2</output-node-connector>
  28. </output-action>
  29. </action>
  30. </apply-actions>
  31. </instruction>
  32. </instructions>
  33. </flow>

说明:实验body体在POSTMAN的Collections中提供了模板,仅供参考。

步骤2 单击Send按钮,结果如下图所示。

步骤3 下发第二条流表。

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <flow xmlns="urn:opendaylight:flow:inventory">
  3. <priority>200</priority>
  4. <flow-name>Foo1</flow-name>
  5. <idle-timeout>0</idle-timeout>
  6. <hard-timeout>0</hard-timeout>
  7. <match>
  8. <ethernet-match>
  9. <ethernet-type>
  10. <type>2048</type>
  11. </ethernet-type>
  12. </ethernet-match>
  13. <ipv4-destination>10.0.0.5/32</ipv4-destination>
  14. <ip-match>
  15. <ip-protocol>1</ip-protocol>
  16. </ip-match>
  17. </match>
  18. <id>115</id>
  19. <table_id>0</table_id>
  20. <instructions>
  21. <instruction>
  22. <order>0</order>
  23. <apply-actions>
  24. <action>
  25. <order>0</order>
  26. <output-action>
  27. <output-node-connector>1</output-node-connector>
  28. </output-action>
  29. </action>
  30. </apply-actions>
  31. </instruction>
  32. </instructions>
  33. </flow>

步骤4 单击“Send”按钮,结果如下:

步骤5 登录交换机执行命令ovs-ofctl dump-flows br-sw查看流表下发情况,如下所示。

步骤6 登录主机1,执行ping 10.0.0.6命令Ping主机2,如下所示。

步骤7 交换机上再次执行命令ovs-ofctl dump-flows br-sw查看流表,下发的流表被匹配。

步骤8 Ctrl+C停止主机1上的ping操作。

步骤9 删除刚刚创建的流表,URL输入:http://127.0.0.1:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:196695411516739/table/0/flow/114 ,使用DELETE方法,如下图所示。

步骤10 单击Send按钮。

步骤11 删除第二条流表,URL输入:http://127.0.0.1:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:196695411516739/table/0/flow/115 ,使用DELETE方法,如下图所示。

步骤12 单击Send按钮。

四、L4层流表下发与验证

L4对应的OSI模型中的四层,即流表对应的TCP/UDP源端口(TCP/UDP src port)、TCP/UDP目的端口号(TCP/UDP dst port)字段。本实验匹配TCP目的端口。

步骤1 下发第一条流表。

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <flow xmlns="urn:opendaylight:flow:inventory">
  3. <priority>200</priority>
  4. <flow-name>Foo1</flow-name>
  5. <idle-timeout>0</idle-timeout>
  6. <hard-timeout>0</hard-timeout>
  7. <match>
  8. <tcp-destination-port>5001</tcp-destination-port>
  9. <ethernet-match>
  10. <ethernet-type>
  11. <type>2048</type>
  12. </ethernet-type>
  13. </ethernet-match>
  14. <ipv4-destination>10.0.0.6/32</ipv4-destination>
  15. <ip-match>
  16. <ip-protocol>6</ip-protocol>
  17. </ip-match>
  18. </match>
  19. <id>117</id>
  20. <table_id>0</table_id>
  21. <instructions>
  22. <instruction>
  23. <order>0</order>
  24. <apply-actions>
  25. <action>
  26. <order>0</order>
  27. <output-action>
  28. <output-node-connector>2</output-node-connector>
  29. </output-action>
  30. </action>
  31. </apply-actions>
  32. </instruction>
  33. </instructions>
  34. </flow>

说明:实验body体在POSTMAN的Collections中提供了模板,仅供参考。

步骤2 单击Send按钮,结果如下图所示。

步骤3 下发第二条流表。

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <flow xmlns="urn:opendaylight:flow:inventory">
  3. <priority>200</priority>
  4. <flow-name>Foo1</flow-name>
  5. <idle-timeout>0</idle-timeout>
  6. <hard-timeout>0</hard-timeout>
  7. <match>
  8. <ethernet-match>
  9. <ethernet-type>
  10. <type>2048</type>
  11. </ethernet-type>
  12. </ethernet-match>
  13. <ipv4-destination>10.0.0.5/32</ipv4-destination>
  14. <ip-match>
  15. <ip-protocol>6</ip-protocol>
  16. </ip-match>
  17. </match>
  18. <id>118</id>
  19. <table_id>0</table_id>
  20. <instructions>
  21. <instruction>
  22. <order>0</order>
  23. <apply-actions>
  24. <action>
  25. <order>0</order>
  26. <output-action>
  27. <output-node-connector>1</output-node-connector>
  28. </output-action>
  29. </action>
  30. </apply-actions>
  31. </instruction>
  32. </instructions>
  33. </flow>

步骤4 单击Send按钮,结果如下图所示。

步骤5 登录交换机执行命令ovs-ofctl dump-flows br-sw查看流表下发情况如下图所示:

步骤6 登录主机2,使用命令iperf -s启用Iperf为服务端,如下图所示。

步骤7 登录主机1,使用命令iperf -c 10.0.0.6发送TCP请求,如下图所示。

步骤8 交换机上再次执行命令ovs-ofctl dump-flows br-sw查看流表,下发的流表被匹配,如下图所示。

步骤9 Ctrl+C停止主机上的iperf操作。

步骤10 删除刚刚创建的流表,URL输入:http://127.0.0.1:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:196695411516739/table/0/flow/117 ,使用DELETE方法,如下图所示。

步骤11 单击“Send”按钮。

步骤12 删除第二条流表,URL输入:http://127.0.0.1:8080/restconf/config/opendaylight-inventory:nodes/node/openflow:196695411516739/table/0/flow/118 ,使用DELETE方法,如下图所示。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号