SDN学习目录
1 OpenDaylight介绍
控制器是给交换机下发流表的设备,最常见的控制器是OpenDaylight,简称ODL,下面首先安装一个ODL控制器,看看控制器给交换机下发的原汁原味的流表是怎么样的。
心得:控制器还是属ODL好安装啊…界面丰富,新手上路不需要担心太多东西,就是软件太大。
2 ODL控制器安装
1 | ## 安装JAVA |
ODL命令:
1 | log:display|more # 控制台查看日志 |
验证OpenDaylight基本功能
1 | mn --controller=remote,ip=119.255.243.31,port=6633 |
登录web界面,查看是否有拓扑
http://
用户名:admin 密码:admin
下发流表
YANG UI是OpenDaylight中一款基于DLUX的应用,旨在简化、激励应用的开发与测试。YANG UI通过动态封装、调用YANG模型和相关REST APIs,生成并展示一个简单的UI界面。开发人员可以通过API请求获取交换机信息,并且以JSON格式展示。YANG UI主要面向上层应用开发,为应用开发人员提供了很多相关工具,有效的节约了开发人员的时间。
OpenFlow1.0协议处理数据包的流程相对简单,因为1.0版本只支持单流表。交换机接收到数据包后解析数据包,数据包解析后就开始匹配,从table 0 开始匹配,如果匹配成功则对该数据包执行相应的动作,更新相应的计数器。如果没有找到匹配项则将数据包交给控制器。
OpenFlow1.3协议支持多流表匹配,即一个交换机只会有多个流表,因此数据包处理过程相对复杂。首先解析进入设备的报文,然后从table 0开始匹配,按照优先级高低依次匹配该流表中的流表项,一个报文在一个流表中只会匹配上一条流表项。通常根据报文的类型,报文头的字段例如源MAC地址、目的MAC地址、源IP地址、目的IP地址等进行匹配,大部分匹配还支持掩码进行更精确、灵活的匹配。也可以通过报文的入端口或元数据信息来进行报文的匹配,一个流表项中可以同时存在多个匹配项,一个报文需要同时匹配流表项中所有匹配项才能匹配该流表项。报文匹配按照现有的报文字段进行,比如前一个流表通过apply actions改变了该报文的某个字段,则下一个表项按修改后的字段进行匹配。如果匹配成功,则按照指令集里的动作更新动作集,或更新报文/匹配集字段,或更新元数据和计数器。根据指令是否继续前往下一个流表,不继续则终止匹配流程执行动作集,如果指令要求继续前往下一个流表则继续匹配,下一个流表的ID需要比当前流表ID大。当报文匹配失败了,如果存在无匹配流表项(table miss)就按照该表项执行指令,一般是将报文转发给控制器、丢弃或转发给其他流表。如果没有table miss表项则默认丢弃该报文。
YANG UI是OpenDaylight中一款基于DLUX的应用,旨在简化、激励应用的开发与测试。YANG UI通过动态封装、调用YANG模型和相关REST APIs,生成并展示一个简单的UI界面。开发人员可以通过API请求获取交换机信息,并且以JSON格式展示。YANG UI主要面向上层应用开发,为应用开发人员提供了很多相关工具,有效的节约了开发人员的时间。
OpenFlow1.0协议处理数据包的流程相对简单,因为1.0版本只支持单流表。交换机接收到数据包后解析数据包,数据包解析后就开始匹配,从table 0 开始匹配,如果匹配成功则对该数据包执行相应的动作,更新相应的计数器。如果没有找到匹配项则将数据包交给控制器。
OpenFlow1.3协议支持多流表匹配,即一个交换机只会有多个流表,因此数据包处理过程相对复杂。首先解析进入设备的报文,然后从table 0开始匹配,按照优先级高低依次匹配该流表中的流表项,一个报文在一个流表中只会匹配上一条流表项。通常根据报文的类型,报文头的字段例如源MAC地址、目的MAC地址、源IP地址、目的IP地址等进行匹配,大部分匹配还支持掩码进行更精确、灵活的匹配。也可以通过报文的入端口或元数据信息来进行报文的匹配,一个流表项中可以同时存在多个匹配项,一个报文需要同时匹配流表项中所有匹配项才能匹配该流表项。报文匹配按照现有的报文字段进行,比如前一个流表通过apply actions改变了该报文的某个字段,则下一个表项按修改后的字段进行匹配。如果匹配成功,则按照指令集里的动作更新动作集,或更新报文/匹配集字段,或更新元数据和计数器。根据指令是否继续前往下一个流表,不继续则终止匹配流程执行动作集,如果指令要求继续前往下一个流表则继续匹配,下一个流表的ID需要比当前流表ID大。当报文匹配失败了,如果存在无匹配流表项(table miss)就按照该表项执行指令,一般是将报文转发给控制器、丢弃或转发给其他流表。如果没有table miss表项则默认丢弃该报文。
在Open vSwitch中,流表项作为ovs-ofctl的参数,采用“字段=值”的格式。如果有多个字段,可以用逗号分开,一些常见字段如下:
字段名称 | 说明 |
---|---|
in_port=port | 传递数据包的端口的OpenFlow端口编号 |
dl_vlan=vlan | 数据包的VLAN Tag值,范围是0-4095,0xffff代表不包含VLAN Tag的数据包 |
dl_src=<MAC> dl_dst= <MAC> | 匹配源或者目标的MAC地址 01:00:00:00:00:00/01:00:00:00:00:00 代表广播地址 00:00:00:00:00:00/01:00:00:00:00:00 代表单播地址 |
dl_type=ethertype | 匹配以太网协议类型,其中: dl_type=0x0800 代表IPv4协议; dl_type=0x086dd 代表IPv6协议; dl_type=0x0806 代表ARP协议; |
nw_src=ip[/netmask] nw_dst=ip[/netmask] | 当 dl_typ=0x0800 时,匹配源或者目标的IPv4地址,可以使IP地址或者域名 |
table=number | 指定要使用的流表的编号,范围是0-254。在不指定的情况下,默认值为0。通过使用流表编号,可以创建或者修改多个Table中的Flow。 |
步骤一 通过miniedit.py 快速设计网络拓扑,并保存为topo1_1_3.py文件,如下图所示
步骤二 python3 topo1_1_3.py 执行文件,打开opendaylight web页面,可查看网络拓扑图如下所示
单机左侧,可查看Nodes 节点信息, Node id在下发流表过程中需要。点击Node Connectors可查看具体节点连接信息
展开“opendaylight-inventory rev.2013-08-19”,选择“config->nodes->node{id}->table{id}->flow{id}”
参数填写
- “match>ethernet-match>ethernet-type”, 填写”type”为”0x0800”; “layer-3-match”选择”ipv4=match”使用IP匹配; 展开”layer-3-match”填写源IP地址和目的IP地址,如下图:
- “instuctions”后单击添加,选择”apply-actions-case”; “apply-actions”后单击添加,选择“drop-action-case”; 以上两个order都设置为0,如下图所示:
- 设置”priority”为27, “idle-timeout”为0, “hard-timeout”为0, “cookie”为100000000, “table_id”为0,如下图所示:
- 选择PUT,点击Send, 若发送成功,如下图所示:
- 执行命令查看流表
1 | sudo ovs-ofctl dump-flows s1 |
- 登录主机h1,执行如下命令向主机h2、h3发送数据包,测试连通性:
1 | scapy |
1 | scapy |
1 | ovs-ofctl del-flows s1 dl_type=0x0800,nw_src=10.0.0.1,nw_dst=10.0.0.2 # 删除下发的流表 |