软件定义网络(SDN)学习笔记(5)--OpenDaylight控制器

SDN学习目录

SDN学习笔记(0)–wireshark抓包分析

SDN学习笔记(1)–iPerf和Netperf性能测试

SDN学习笔记(2)–Scapy交互式数据处理与Postman HTTP请求测试

SDN学习笔记(3)–OVS系统架构

SDN学习笔记(5)–OpenDaylight控制器

1 OpenDaylight介绍

控制器是给交换机下发流表的设备,最常见的控制器是OpenDaylight,简称ODL,下面首先安装一个ODL控制器,看看控制器给交换机下发的原汁原味的流表是怎么样的。

心得:控制器还是属ODL好安装啊…界面丰富,新手上路不需要担心太多东西,就是软件太大。

2 ODL控制器安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
## 安装JAVA
apt install openjdk-8-jdk

## 配置环境
vim /etc/environment # 进入环境变量配置文件,在第二行加入java的环境变量。
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

## 下载ODL编译好的文件
wget https://nexus.opendaylight.org/content/groups/public/org/opendaylight/integration/distribution-karaf/0.6.4-Carbon/distribution-karaf-0.6.4-Carbon.tar.gz

## 解压文件
tar zvxf distribution-karaf-0.6.4-Carbon.tar.gz

## 配置文件
/etc/org.apache.karaf.management.cfg
# Host for RMI registry
rmiRegistryHost = 0.0.0.0
# Port number for RMI server connection
rmiServerPort = 44444
# Host for RMI server
rmiServerHost = 0.0.0.0

## tmux 启动 odl
tmux
unset TMOUT

./bin/karaf
feature:install odl-l2switch-switch-ui odl-openflowplugin-flow-services-ui odl-mdsal-apidocs odl-dluxapps-applications odl-faas-all

## 上面就行,下面这个或许也可以,同时要遵守顺序
feature:install odl-restconf
feature:install odl-l2switch-switch
feature:install odl-openflowplugin-all
feature:install odl-dlux-all
feature:install odl-mdsal-all
feature:install odl-adsal-northbound

ODL命令:

1
2
3
4
5
6
7
log:display|more # 控制台查看日志
feature:list # 列出所有组件
feature:list -i # 列出已经安装的
feature:list -i|grep odl-restconf # 确认某个组件安装

# rm -rf data # 删除data目录,并
# ./bin/karaf clean # 清除组件重新进入karaf控制台

验证OpenDaylight基本功能

1
2
# mn --controller=remote,ip=119.255.243.31,port=6633
mininet>pingall

登录web界面,查看是否有拓扑
http://:8181/index.html

用户名: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文件,如下图所示

mininet_topo

步骤二 python3 topo1_1_3.py 执行文件,打开opendaylight web页面,可查看网络拓扑图如下所示

odl_topo

单机左侧,可查看Nodes 节点信息, Node id在下发流表过程中需要。点击Node Connectors可查看具体节点连接信息

nodes

node_connectors

展开“opendaylight-inventory rev.2013-08-19”,选择“config->nodes->node{id}->table{id}->flow{id}”

YangUI1

YangUI2

参数填写

  • “match>ethernet-match>ethernet-type”, 填写”type”为”0x0800”; “layer-3-match”选择”ipv4=match”使用IP匹配; 展开”layer-3-match”填写源IP地址和目的IP地址,如下图:

para1

  • “instuctions”后单击添加,选择”apply-actions-case”; “apply-actions”后单击添加,选择“drop-action-case”; 以上两个order都设置为0,如下图所示:

para2

  • 设置”priority”为27, “idle-timeout”为0, “hard-timeout”为0, “cookie”为100000000, “table_id”为0,如下图所示:

para3

  • 选择PUT,点击Send, 若发送成功,如下图所示:

put_send

  • 执行命令查看流表
1
sudo ovs-ofctl dump-flows s1

flow-show

  • 登录主机h1,执行如下命令向主机h2、h3发送数据包,测试连通性:
1
2
3
scapy
>>> result,unanswered=sr(IP(dst="10.0.0.2",ttl=(3,10))/ICMP())
>>> result,unanswered=sr(IP(dst="10.0.0.3",ttl=(3,10))/ICMP())

h1_scapy

1
2
scapy
>>> result,unanswered=sr(IP(dst="10.0.0.1",ttl=(3,10))/ICMP())
1
2
# ovs-ofctl del-flows s1 dl_type=0x0800,nw_src=10.0.0.1,nw_dst=10.0.0.2  # 删除下发的流表
# ovs-ofctl dump-flows s1 # 可以查看流表已被删除