SDN实验指导

发布时间 2023-05-24 20:35:42作者: ChuenSan

SDN

SDN-Mininet源码安装与验证

实验目的

1、了解Mininet的基本概念与作用。
2、掌握Mininet的源码安装方法。
3、Mininet部署后的自我验证。

实验环境

支持OpenFlow1.0及OpenFlow1.3协议的Mininet源码安装与验证实验拓扑如下图所示。
image-20230524083824604

设备名称 软件环境 硬件环境
主机 Ubuntu 14.04命令行版 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙”
按钮获取对应的密码。

任务内容

1、学习Mininet的概念和作用。
2、通过不同的方式安装Mininet。

实验原理

一、Mininet简介

Mininet是一个可以在有限资源的普通电脑上快速建立大规模SDN原型系统的网络仿真工具。该系统由虚拟的终端节点(End-Host)、OpenFlow交换机、控制器(也支持远程控制器)组成,这使得它可以模拟真实网络,可对各种设想或网络协议等进行开发验证。目前Mininet已经作为官方的演示平台对各个版本的OpenFlow协议进行演示和测试。

Mininet是基于Linux Container这一内核虚拟化技术开发出的虚拟化平台,其实现虚拟化主要是用到了Linux内核的Network namespace资源隔离机制。Linux的Network namespace机制可以让每个namespace拥有独立的网络设备、网络协议栈和端口等。Mininet正是利用了Linux这种Network namespace机制,才可以在一台电脑上创建多台虚拟主机。此外,Mininet建立的网络拓扑的交换节点可以是Open vSwitch、Linux Bridge等软件交换机,交换节点之间的链路采用Linux的veth pair(virtual Ethernet pair)机制实现,控制器可以部署在网络可达的任意地方。因此,Mininet可以定制任意灵活的SDN网络拓扑,为实验用户提供快捷可靠的实验环境。

Mininet架构按datapath的运行权限不同,分为kernel datapath和userspace datapath两种,其中kernel datapath把分组转发的逻辑编译进入Linux内核,效率非常高;userspace datapath把分组转发逻辑实现为一个应用程序,叫做ofdatapath,效率虽不及kernel datapath,但更为灵活,更容易重新编译。

Mininet的kernel datapath架构如下图所示,控制器和交换机的网络接口都在root 命名空间中,每个主机都在自己独立的命名空间里,这也就表明每个主机在自己的命名空间中都会有自己独立的虚拟网卡eth0。控制器就是一个用户进程,它会在loopback上预留的6633端口监听来自交换机安全信道的连接。每个交换机对应几个网络接口,比如s0-eth0、s0-eth1以及一个ofprotocol进程,它负责管理和维护同一控制器之间的安全信道。

image-20230524201338963

Mininet的userspace datapath架构如下图所示,与kernel datapath架构不同,网络的每个节点都拥有自己独立的namespace。因为分组转发逻辑是实现在用户空间,所以多出了一个进程叫ofdatapath。另外,Mininet除了支持kernel datapath和userspace datapath这两种架构以外,还支持OVS交换机。OVS充分利用内核的高效处理能力,它的性能和kernel datapath相差无几。image-20230524083955567

二、Mininet安装

Mininet的安装有三种方式:
第一种、从网上直接下载安装好Mininet的虚拟机镜像,然后在VMware或者VirtureBox上打开Mininet虚拟机即可。这种安装方法是最简单的,但是该方法不支持最新版本的Open vSwitch。
第二种、在本地安装Mininet源代码(继续看,后面有)。该安装方法在安装过程中可以设置Open vSwitch的版本。第三种是安装Mininet文件包,该安装方法也不支持最新版本的Open vSwitch。推荐使用第二种安装方法,安装命令即参数解释如下:

1、命令格式
./install.sh [options]

2、参数解释
典型的[options]主要有下面几种:

  • “-a”:完整安装,包括Mininet VM,还包括Open vSwitch的依赖关系、OpenFlow、Wireshark分离器和POX等。默认情况下,这些工具将被安装在home目录中。
  • “-nfv”:安装Mininet核心文件及依赖、OpenFlow和Open vSwitch。
  • “-s mydir”:使用此选项可将源代码建立在一个指定的目录中,而不是home目录。

所以,可能会用到下面的某一个命令来安装Mininet:

命令 含义
# install.sh -a 完整安装(默认安装在home目录下)
# install.sh -s mydir -a 完整安装(安装在其他目录)
# install.sh -nfv 安装Mininet+用户交换机+OVS(安装在home目录下
# install.sh -s mydir -nfv 安装Mininet+用户交换机+OVS(安装在其他目录下)
操作步骤

本次介绍的Mininet安装方法适用于本地虚拟机,EC2远程和本地安装,并适合在一个干净的Ubuntu上进行安装。不适用于从旧版本的Mininet或OVS升级。为支持新版本的Open vSwitch,建议安装14.04及以上版本的Ubuntu。

步骤1 以root用户登录主机,以下命令全部以root身份运行。

步骤2 执行ll命令,查看平台预置的Mininet安装包,如下所示。

# ll

image-20230524201353957

说明:如果本地没有安装包可以使用网络获取资源。 (源码获取)
# sudo apt-get update
# sudo apt-get install git
# git clone http://github.com/mininet/mininet.git

步骤3 执行以下命令,查看当前Mininet版本,查询结果如下图所示。

# cd mininet
# cat INSTALL|more

image-20230524201402960
说明:Mininet2.1.0p1及以后的版本可以原生支持OpenFlow1.3,所以我们这次安装的Mininet2.3.0d1版本支持OpenFlow1.3协议。

步骤4 执行以下命令安装Mininet。

# cd util/
# ./install.sh -a
说明:若使用其它命令安装,在安装前请先执行apt-get update命令更新软件列表。

步骤5 安装完成以后,执行命令测试Mininet的基本功能。

# mn --test pingall

|image-20230524201425899

步骤6 执行mn —version,查看安装好的Mininet版本。

# mn --version

image-20230524084239397

SDN-Mininet拓扑构建与命令使用

实验目的

1、通过命令模拟创建SDN网络。
2、深入了解Mininet的命令使用。
3、学会使用网络构建启动参数、内部交互命令及外部运行参数。

实验环境

Mininet拓扑构建与命令使用实验拓扑如下图所示。
image-20230524090551466

设备名称 软件环境 硬件环境
主机 Mininet_2.2.0_desktop_cv1.1 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙” 按钮获取对应的密码。

任务内容

1、通过Mininet命令行创建拓扑来熟悉Mininet的基本功能。
2、通过交互式界面创建拓扑来熟悉Mininet的基本命令。

实验原理

一、Mininet简介

Mininet是基于Linux Container架构开发的一个进程虚拟化网络仿真工具,可以创建一个含有主机、交换机、控制器和链路的虚拟网络,其交换机支持OpenFlow,具有高度灵活的自定义软件定义网络。Mininet可以用一个命令在一台主机上(虚拟机、云或者本地)以秒级创建一个虚拟网络,并在上面运行真正的内核、交换机和应用程序代码。
Mininet能实现如下功能:

  • 为OpenFlow应用程序提供一个简单、便宜的网络测试平台
  • 启用复杂的拓扑测试,无需连接物理网络
  • 具有拓扑感知和OpenFlow感知的CLI,用于调试或运行网络范围的测试
  • 支持任意自定义拓扑,主机数可达4096,并包括一组基本的参数化拓扑
  • 提供用于网络创建和实验的可扩展Python API

在基于Mininet的使用下,可以轻易的在自己的笔记本上测试一个软件定义网络(software-defined Networks),对基于OpenFlow、Open vSwitch的各种协议等进行开发验证,或者验证自己的想法。且所有的代码几乎可以无缝迁移到真实的硬件环境中,在实验室里,一行命令就可以创建一个支持SDN的任意拓扑的网络结构,并可以灵活的进行相关测试,验证了设计的正确后,可以轻松部署到真实的硬件环境中。

二、OpenFlow连接建立交互流程

Miniedit可视化,直接在界面上编辑任意拓扑,生成python自定义拓扑脚本,使用Mininet可视化界面方便了用户自定义拓扑创建,为不熟悉python脚本的使用者创造了更简单的环境,界面直观,可操作性强。

Mininet 2.2.0+内置miniedit 。在mininet/examples下提供miniedit.py脚本,执行脚本后显示可视化界面,可自定义拓扑及配置属性。
MiniEdit使用主要分三个步骤:Miniedit启动→自定义创建拓扑,设置设备信息→运行拓扑并生成拓扑脚本。

三、网络构建参数

Mininet是基于Linux Container架构开发的一个进程虚拟化网络仿真工具,可以创建一个含有主机、交换机、控制器和链路的虚拟网络,其交换机支持OpenFlow,具有高度灵活的自定义软件定义网络。Mininet可以用一个命令在一台主机上(虚拟机、云或者本地)以秒级创建一个虚拟网络,并在上面运行真正的内核、交换机和应用程序代码。
Mininet能实现如下功能:

  • 为OpenFlow应用程序提供一个简单、便宜的网络测试平台
  • 启用复杂的拓扑测试,无需连接物理网络
  • 具有拓扑感知和OpenFlow感知的CLI,用于调试或运行网络范围的测试
  • 支持任意自定义拓扑,主机数可达4096,并包括一组基本的参数化拓扑
  • 提供用于网络创建和实验的可扩展Python API

在基于Mininet的使用下,可以轻易的在自己的笔记本上测试一个软件定义网络(software-defined Networks),对基于OpenFlow、Open vSwitch的各种协议等进行开发验证,或者验证自己的想法。且所有的代码几乎可以无缝迁移到真实的硬件环境中,在实验室里,一行命令就可以创建一个支持SDN的任意拓扑的网络结构,并可以灵活的进行相关测试,验证了设计的正确后,可以轻松部署到真实的硬件环境中。
topo:用于指定网络拓扑,Mininet支持创建的网络拓扑为:minimal、single、linear和tree共四种。

  • minimal:创建一个交换机和两个主机相连的简单拓扑。默认无—topo参数的情况下就是这样。其内部实现就是调用了single,2对应的函数。

  • single,n:设置一个交换机和n个主机相连的拓扑。

  • linear,n:创建n个交换机,每个交换机只连接一个主机,并且所有交换机成线型排列。

  • tree,depth=n,fanout=m:创建深度为n,每层树枝为m的树型拓扑。因此形成的拓扑的交换机个数为(mn-1)/(m-1),主机个数为mn。(需要注意的是这里的公式是错误的,图片为公式的纠正)
    image-20230524125944256

    这里的tree指的只是交换机,交换机结点的depth(深度)为n,fanout(出度)为m

  • —custom:在上述已有拓扑的基础上,Mininet支持自定义的拓扑,使用一个简单的Python API即可。—custom需和—topo一起使用,如mn —custom file.py —topo mytopo。(试着编程实现)

四、内部交互命令

创建Mininet拓扑成功后,一般可用nodes、dump、net等命令查看拓扑的节点、链路及网络等。Mininet常用的交互命令如下所示。
Mininet启动参数总结:

参数 作用
-h, —help show this help message and exit
—switch=SWITCH [kernel user ovsk]
—host=HOST [process]
—controller=CONTROLLER [nox_dump none ref remote nox_pysw]
—topo=TOPO [tree reversed single linear minimal],arg1,arg2,…argN
-c, —clean clean and exit
—custom=CUSTOM read custom topo and node params from .py file
—test=TEST [cli build pingall pingpair iperf all iperfudp none]
-x, —xterms spawn xterms for each node
—mac set MACs equal to DPIDs
—arp set all-pairs ARP entries
-v VERBOSITY, —verbosity=VERBOSITY [info warning critical error debug output]
—ip=IP [ip address as a dotted decimal string for aremote controller]
—port=PORT [port integer for a listening remote controller]
—innamespace sw and ctrl in namespace
—listenport=LISTENPORT [base port for passive switch listening controller]
—nolistenport don’t use passive listening port
—pre=PRE [CLI script to run before tests]
—post=POST [CLI script to run after tests]

Mininet常用命令总结:

命令 作用
help 默认列出所有命令文档,后面加命令名将介绍该命令用法 dump打印节点信息
gterm 给定节点上开启gnome-terminal 注:可能导致mn崩溃
xterm 给定节点上开启xterm
intfs 列出所有的网络接口
iperf 两个节点之间进行简单的iPerf TCP测试
iperfudp 两个节点之间用制定带宽UDP进行测试
net 显示网络链接情况
noecho 运行交互式窗口,关闭回应(echoing)
pingpair 在前两个主机之间互Ping测试
source 从外部文件中读入命令
dpctl 在所有交换机上用dptcl执行相关命令,本地为tcp 127.0.0.1:6634
link 禁用或启用两个节点之间的链路
nodes 列出所有的节点信息
pingall 所有主机节点之间互Ping
py 执行Python表达式
sh 运行外部shell命令
quit/exit 退出
操作步骤

一、网络构建参数使用

步骤1

单击终端图标,打开终端,执行su root命令切换到root用户。

步骤2

执行如下命令,创建single拓扑。

不用sudo也可以,直接使用root用户来就好,不过使用以后要及时切换为普通用户

# sudo mn --topo=single,3

image-20230524091146765
说明:单一(Single)拓扑指整个网络拓扑中交换机有且只有一个,交换机可以下挂一个或多个主机,本例创建了一个交换机、3个主机,3个主机都下挂在一个交换机下。

步骤3

执行exit退出Mininet。

步骤4

执行如下命令,创建linear(线性)拓扑。
# sudo mn --topo=linear,3

image-20230524091215643
说明:线性(linear)拓扑指交换机连接呈线形排列,且每个交换机所连接主机数目只有一个,本例创建了3个交换机、3个主机,3个主机分别下挂在一个交换机下。

步骤5

执行exit退出Mininet。

步骤6

执行如下命令,创建树形(tree)拓扑。
# sudo mn --topo=tree,depth=2,fanout=2
image-20230524091243566
说明:树形(tree)拓扑指交换机连接成树形排列,且每个交换机所连接主机一般有多个关联使用参数depth及fanout,本例创建了depth为2,fanout为2的拓扑,表示交换机深度即层数为2,每个交换机下挂2个设备。

步骤7

执行exit退出Mininet。

步骤8

执行如下命令,创建自定义拓扑。

    # cd /home/openlab/openlab/mininet/custom
    # sudo mn --custom topo-2sw-2host.py --topo mytopo

image-20230524091402624
自定义(custom)拓扑指python编写文件file.py,执行此脚本即可创建定义的拓扑,—custom与—topo联用,在custom目录下存在topo-2sw-2host.py(事先写好的)文件,本例调用此文件构建拓扑。

二、内部交互命令使用

步骤1

执行net命令显示链接信息。
image-20230524091434025

步骤2

执行nodes命令查看节点信息。
image-20230524091520580

步骤3

执行links查看链路健壮性信息。
image-20230524091539843

步骤4

执行pingall验证所有主机间通信并查看结果。
image-20230524091600828

步骤5

执行xterm h1 h2开启xterm进入设备可视化操作界面。
image-20230524091633504

步骤6

执行exit退出Mininet。

步骤7

执行mn -c清除释放Mininet构造配置的交换机及主机。
image-20230524091657218

步骤8

执行mn --helpmn -h查看获取帮助。
image-20230524091726318

三、Mininet可视化构建网络拓扑

步骤1 启动MiniEdit

执行cd /home/openlab/openlab/mininet/examples进入mininet/examples目录下,执行miniedit.py文件:
# sudo ./miniedit.py
image-20230524091803040

步骤2 Miniedit拓扑建立

选择左侧的网络组件,在空白区域单击鼠标左键即可添加网络组件,可选择的组件主要有主机、OpenFlow交换机、传统交换机,传统路由器、链路、控制器。
image-20230524122044168

步骤3 Miniedit属性配置

在左侧设备列表中选中需要的设备,在右侧空白区域单击,设备即添加成功。
设备及链路上可进行鼠标右击长按,选择Properties即可对其进行配置。
在控制器上进行鼠标右击长按,选择Properties即可对控制器进行配置:
image-20230524122109885
在交换机上进行鼠标右击长按,选择Properties即可对交换机进行配置,交换机属性需配置16位的DPID:
image-20230524122217038
在主机上进行鼠标右击长按,选择Properties即可对主机进行配置,主机属性需配置IP地址:
image-20230524122243757
设备属性配置OK后,将会在miniedit.py执行的后台产生日志,告知所添加的设备属性:
image-20230524122315742

步骤4 Miniedit全局配置

Miniedit左上角“Edit”中可以剪切删除设备,及对整个网络进行全局配置:

image-20230524122345730

步骤5 Miniedit运行

点击左下角“run”,即可运行设置好的网络拓扑,同时在后台可以看到相应的配置信息。运行后对交换机、主机进行右击长按,可查看交换机的bridge信息及打开Host的终端,
交换机信息如下:
image-20230524122416777
主机终端界面如下:
image-20230524122448676

步骤6 Miniedit保存脚本

miniedit设置好拓扑后,可通过选择File-Export Level 2 Script,将其保存为python脚本,默认在mininet/examples目录下,通过chmod给此脚本权限后,直接运行即可重现拓扑。
image-20230524122511044

步骤7 Miniedit脚本执行

通过后台查看保存的sdnlab.py脚本文件,并给脚本赋予权限:
# chmod –R 777 sdnlab.py
执行sdnlab.py脚本:
# ./sdnlab.py
image-20230524122537590

SDN-Mininet 调用API扩展自定义拓扑

实验目的
实验环境

Mininet调用API扩展自定义拓扑实验的拓扑如下图所示。
image-20230524131118999

设备名称 软件环境 硬件环境
主机 Ubuntu 14.04桌面版 Mininet 2.2.0 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙” 按钮获取对应的密码。

任务内容

1、调用API接口扩展自定义的拓扑,并丰富链路。
2、在原有拓扑的情况下,更改拓扑级链路信息。

实验原理

Mininet作为一个基于Python的网络仿真工具,可以分为两大部分:Python库和运行文件。前者对网络中元素进行抽象和实现,例如定义主机类来表示网络中的一台主机;后者则基于这些库完成模拟过程。
topo 类中包含构建网络的函数如:

  • addHost(“host name”): 添加主机
  • addSwitch(“sw name”): 添加交换机
  • addLink(node,node): 添加链路
  • attach(port):添加端口
操作步骤

步骤1 单击终端图标,打开终端。

步骤2 执行命令进入custom目录。

cd /home/openlab/openlab/mininet/custom

步骤3 执行如下命令,在custom目录下创建自定义拓扑,如下所示。

sudo mn --custom topo-2sw-2host.py --topo mytopo
image-20230524131316782

步骤4 执行如下命令,在Mininet交互环境中添加主机h3,如下所示。

py net.addHost(‘h3’)

image-20230524131423753

步骤5 执行如下命令,在Mininet交互环境中添加s3与主机h3之间的链路。

py net.addLink(s3,net.get(‘h3’))

image-20230524131448979

步骤6 执行如下命令,在Mininet交互环境中添加接口。

py s3.attach(‘s3-eth3’)

image-20230524131506608

步骤7 执行如下命令,在Mininet交互环境中对主机进行配置IP地址。

py net.get(‘h3’).cmd(‘ifconfig h3-eth0 10.3’)

image-20230524131529319

步骤8 执行如下命令,查看节点信息。

dump
nodes

image-20230524131552833

步骤9 执行如下命令,验证主机间的连通性(建议先不用pingall,先使用两个主机间的ping操作)。

h1 ping h3
pingall

image-20230524131619587
由上可知,扩展拓扑在原有拓扑的基础上成功添加主机。

SDN-Mininet可视化构建网络拓扑

实验目的

1、熟悉Mininet可视化界面。
2、掌握自定义拓扑及拓扑设备设置的方法,实现自定义脚本。

实验环境

Mininet可视化构建网络拓扑实验的拓扑如下图所示。
image-20230524131925309

设备名称 软件环境 硬件环境
主机 Mininet-2.2.0-desktop-cv1.0 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙” 按钮获取对应的密码。

任务内容

1、通过Mininet学习miniedit可视化操作。
2、可直接在界面上编辑任意想要的拓扑,生成python自定义拓扑脚本。
3、在实验过程中,学会启动miniedit、并配置设备信息。

实验原理

Miniedit可视化,直接在界面上编辑任意拓扑,生成python自定义拓扑脚本,使用Mininet可视化界面方便了用户自定义拓扑创建,为不熟悉python脚本的使用者创造了更简单的环境,界面直观,可操作性强。
Mininet 2.2.0+内置miniedit 。在mininet/examples下提供miniedit.py脚本,执行脚本后显示可视化界面,可自定义拓扑及配置属性。
MiniEdit使用主要分三个步骤:

  • Miniedit启动
  • 自定义创建拓扑,设置设备信息
  • 运行拓扑并生成拓扑脚本
操作步骤

步骤1 单击终端图标,打开终端。

步骤2 执行如下命令启动Mininet可视化界面MiniEdit。

$ cd /home/openlab/openlab/mininet/mininet/examples
$ sudo ./miniedit.py

image-20230524132051432

步骤3 Miniedit拓扑建立,拓扑如下所示。

选择左侧的网络组件,在空白区域单击鼠标左键即可添加网络组件,可选择的组件主要有主机、OpenFlow交换机、传统交换机,传统路由器、链路、控制器。
image-20230524132147703

步骤4 Miniedit属性配置。

(1)在控制器上进行鼠标右击长按,选择Properties即可对控制器进行配置,如下所示。
image-20230524132226541
(2)在交换机上进行鼠标右击长按,选择Properties即可对交换机进行配置,交换机属性需配置16位的DPID,如下所示。
image-20230524132326091
(3)在主机上进行鼠标右击长按,选择Properties即可对主机进行配置,主机属性需配置IP地址,如下所示。
image-20230524132409080
image-20230524132431529
image-20230524132450895
(4)也可对链路进行属性配置,主要配置带宽、时延、丢包率等,此项可配置亦可不配置,如下所示。
image-20230524132516619
(5)设备属性配置后,将会在终端界面产生日志,告知所添加的设备属性,如下所示。
image-20230524132541252

步骤5 Miniedit全局配置。

Miniedit左上角“Edit”中可以剪切删除设备,及对整个网络进行全局配置,如下所示。
image-20230524132601684

步骤6 Miniedit运行。

(1)单击左下角“run”,即可运行设置好的网络拓扑,同时在后台可以看到相应的配置信息。
(2)运行后对交换机、主机进行右击长按,可查看交换机的bridge信息及打开Host的终端,交换机信息如下:
image-20230524132644237
主机终端界面如下:
image-20230524132700049

步骤7 Miniedit保存脚本。

Miniedit设置好拓扑后,可通过选择“File > Export Level 2 Script”,将其保存为python脚本,默认在mininet/examples目录下。
image-20230524132717924
说明:以后直接运行Python脚本即可重现拓扑,重现拓扑后可在命令行直接操作。

步骤8 单击可视化界面的“X”图标,退出可视化。

说明:若无法退出,请切换到Mininet CLI中执行exit退出Mininet,将自动关闭Mininet可视化界面。

步骤9 Miniedit脚本执行。

(1)通过后台查看保存的sdnlab.py脚本文件,并给脚本赋予权限:
$ sudo chmod -R 777 sdnlab.py
(2)执行sdnlab.py脚本:
$ sudo ./sdnlab.py
image-20230524132741916

SDN-Mininet流表应用实战1——手动添加流表

实验目的

1、掌握SDN交换机的工作原理。
2、掌握Open vSwitch下发流表的方法。
3、通过Mininet自定义创建拓扑,不使用控制器,手动添加流表操作实现主机间的通信。
4、掌握Mininet中添加、删除流表命令。

实验环境

Mininet流表应用实战1——手动添加流表实验的拓扑如下图所示。
image-20230524133249628
实验环境信息如下表所示。

设备名称 软件环境 硬件环境
主机 Ubuntu 14.04桌面版 Mininet 2.2.0 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙” 按钮获取对应的密码。

任务内容

1、使用Mininet创建实验拓扑,并测试无流表状态下主机间的ping操作。
2、在交换机中添加流表并测试主机间的ping操作。
3、在交换机中添加协议流表使主机h1和h2通信。

实验原理

在SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项,且交换机未被SDN控制器控制,交换机将此数据包丢弃。可以通过对流表操作来控制交换机的转发行为,通过手动对交换机下发流表,当交换机交换机收到一个数据包时,因已手工添加相对应的流表,交换机根据流表操作转发数据包,使主机间通信。

操作步骤

一、创建拓扑

步骤1

登录Mininet主机,打开命令行执行终端,执行命令cd /home/openlab/openlab/mininet/custom进入custom目录。

步骤2

执行命令sudo vim exper1.py创建python自定义拓扑脚本文件exper1.py,脚本代码如下:

#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo( Topo ):
    "Simple topology example."
    def __init__( self ):
        "Create custom topo."
        # Initialize topology
        Topo.__init__( self )
        # Add hosts and switches
        Host1 = self.addHost( 'h1' )
        Host2 = self.addHost( 'h2' )
        Host3 = self.addHost( 'h3' )
        Switch1 = self.addSwitch( 's1' )
        Switch2 = self.addSwitch( 's2' )
        # Add links
        self.addLink( Host1, Switch1 )
        self.addLink( Host2, Switch1 )
        self.addLink( Host3, Switch2 )
        self.addLink( Switch1, Switch2 )
topos = { 'mytopo': ( lambda: MyTopo() ) }

说明:为方便用户实验,脚本文件在/home/ftp/exper.py中已预置。
步骤3执行如下命令运行自定义脚本,并远程指定一个不存在的控制器,使交换机不受控制器控制。

步骤3

执行如下命令运行自定义脚本,并远程指定一个不存在的控制器,使交换机不受控制器控制。

# sudo mn --custom exper1.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653

image-20230524133526850

二、测试无流表状态下主机间的通信

步骤1

执行命令xterm h1 h2 h3打开h1、h2和h3的可视化终端。
image-20230524133639142

步骤2

执行命令dpctl dump-flows查看交换机当前的flow table信息。
image-20230524133712791
可以看到交换机s1和s2中没有流表。

步骤3

在主机h2中执行命令tcpdump -n -i h2-eth0抓取网卡h2-eth0上的数据包。
image-20230524133806916

步骤4

在主机h3中执行命令tcpdump -n -i h3-eth0抓取网卡h3-eth0上的数据包。
image-20230524133827757

步骤5

在主机h1中执行如下命令分别ping主机h2和h3,结果如下所示。

# ping -c 3 10.0.0.2
# ping -c 3 10.0.0.3

image-20230524133857156

步骤6

在主机h2和h3上查看tcpdump的抓包结果。
image-20230524133924648
image-20230524133941007

可以看到主机h1 Ping h2和h3失败了,主机h2和h3上没有收到任何ICMP echo request packet。原理解析:ping操作时,由于拓扑里没有SDN控制器,也没有用dptcl给OpenFlow交换机添加任何flow entry,所以交换机不会做转发决定,并直接丢弃h1到h2及h1到h3的ping包。

三、添加流表并测试主机间的通信

步骤1

执行如下命令添加交换机端口流表使主机h1和h2通信。
mininet> dpctl add-flow in_port=1,actions=output:2
mininet> dpctl add-flow in_port=2,actions=output:1
image-20230524134021356

步骤2

执行命令dpctl dump-flows查看交换机流表,两条flow entry添加成功。
image-20230524134035856

步骤3

在主机h1中执行如下命令分别ping主机h2和h3。

# ping -c 3 10.0.0.2
# ping -c 3 10.0.0.3

image-20230524134129196

步骤4

在主机h2和h3上查看tcpdump抓包结果。
image-20230524134252488
image-20230524134303811
可以看到主机h1成功ping通h2,且h3没收到任何ping包。原理解析:用dpctl对交换机添加flow,让交换机从s1-eth1这个端口接收到的所有traffic都从s1-eth2这个端口发出去。用dpctl给交换机添加双向流表,因为ping包除了echo request还有echo reply。所以还需要用dpctl对交换机添加flow,让交换机从s1-eth2这个端口接收到的所有traffic都从s1-eth1这个端口发出去。添加这两条flow后,h1能够ping通h2,但是并没有为h1和h3之间添加对应的端口流表,所以h1与h3不通。

四、添加协议流表使h1/h2通信

步骤1

执行如下命令删除之前通过端口添加的流表并查看流表,确保交换机flow table为空。

# dpctl del-flows
# dpctl dump-flows

image-20230524134450119

步骤2

执行如下命令添加两条traffic类型为IPv4(0x0800)协议相关的flow entry,并查看下发的流表。

# dpctl add-flow dl_type=0x0800,nw_dst=10.0.0.2,actions=output:2
# dpctl add-flow dl_type=0x0800,nw_dst=10.0.0.1,actions=output:1
# dpctl dump-flows

image-20230524134600388

步骤3

在主机h1中执行如下命令分别ping主机h2和h3。

# ping -c 3 10.0.0.2
# ping -c 3 10.0.0.3

image-20230524134650626
可以看到无法ping通。

步骤4

在主机h2和h3上查看tcpdump抓包结果。
image-20230524134709439
image-20230524134723957
原理解析:用dpctl对交换机添加flow,让交换机把所有EtherType为0x0800(IPv4)并且destiation IP为10.0.0.2的traffic从s1-eth2这个端口发出去。用dpctl对交换机添加flow,让交换机把所有EtherType为0x0800(IPv4)并且destiation IP为10.0.0.1的traffic从s1-eth1这个端口发出去。但处在同一网段下的主机,它们之间的交流是L2 forwarding,需要靠ARP来解析MAC地址,之前只匹配了0x0800(IPv4)协议,并没有匹配到0x0806(ARP),这样当交换机收到h1的ARP包后,因为没有控制器,flow table里面也没有相应的flow告诉它如何转发这个ARP包,交换机只能将它丢弃,从而导致h1 ping h2失败,所以需要添加ARP协议的流表来使通信。

步骤5

执行命令dpctl add-flow dl_type=0x0806,actions=NORMAL添加ARP(0x0806)协议相关的流表,让交换机以NORMAL形式(即广播)将所有ARP包从各个端口广播出去。
image-20230524134744139

步骤6

执行命令dpctl dump-flows查看流表。
image-20230524134801298

步骤7

在主机h1中执行如下命令分别ping主机h2和h3。

# ping -c 3 10.0.0.2
# ping -c 3 10.0.0.3

image-20230524134826977

步骤8

在主机h2和h3上查看tcpdump抓包结果。
image-20230524134847975

可以看到主机h1能够ping通h2。

SDN-Mininet流表应用实战2——控制器下发流表协议分析

实验目的

1、理解OpenFlow交换机和控制器间的工作原理。
2、学会使用Wireshark抓包分析,熟悉了解OpenFlow协议。。

实验环境

Mininet流表应用实战2——控制器下发流表协议分析实验的拓扑如下图所示。
image-20230524140847812
实验环境信息如下表所示。

设备名称 软件环境 硬件环境
主机 Ubuntu 14.04桌面版 Mininet 2.2.0 CPU:1核 内存:2G 磁盘:20G
控制器 Ubuntu 14.04桌面版 OpenDaylight碳版本 CPU:4核 内存:8G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙” 按钮获取对应的密码。

任务内容

1、通过Mininet自定义创建拓扑,并使用远程控制器进行通信测试。
2、解析控制器与交换机、主机与主机之间的OpenFlow协议通信过程。

实验原理

在SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包发送给控制器,由控制器决策数据包如何处理。控制器下发决策后,交换机根据控制器下发的信息来进行数据包的处理,即转发或者丢弃该数据包。

操作步骤

一、创建拓扑并测试通信

步骤1

登录OpenDaylight虚拟机,执行如下命令查看OpenDaylight的启动情况,端口监听情况如下所示。

# netstate -anput|grep 6653
# netstate -anput|grep 8181

image-20230524140951274
说明:为方便用户实验,实验平台中ODL的功能组件已安装,且启动好了。

步骤2

执行命令ifconfig查看ODL控制器的IP地址。
image-20230524141014117
说明:本实验中ODL的IP地址为30.0.1.159,实验需根据具体情况操作。

步骤3

登录Mininet虚机,打开命令行执行终端,执行命令sudo wireshark进行Wireshark抓包,监听网卡any上的数据流量。
image-20230524141104249

步骤4

打开新的命令行执行窗口,执行命令cd /home/openlab/openlab/mininet/custom进入custom目录。

步骤5

执行命令sudo vim exper1.py创建python自定义拓扑脚本文件exper1.py,脚本代码如下:

#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo( Topo ):
    "Simple topology example."
    def __init__( self ):
        "Create custom topo."
        # Initialize topology
        Topo.__init__( self )
        # Add hosts and switches
        Host1 = self.addHost( 'h1' )
        Host2 = self.addHost( 'h2' )
        Host3 = self.addHost( 'h3' )
        Switch1 = self.addSwitch( 's1' )
        Switch2 = self.addSwitch( 's2' )
        # Add links
        self.addLink( Host1, Switch1 )
        self.addLink( Host2, Switch1 )
        self.addLink( Host3, Switch2 )
        self.addLink( Switch1, Switch2 )
topos = { 'mytopo': ( lambda: MyTopo() ) }

说明:为方便用户实验,脚本文件在/home/ftp/exper.py中已预置。

步骤6

执行如下命令通过mn命令执行自定义脚本,并远程指定控制器ODL的IP地址。

# sudo mn --custom exper1.py --topo mytopo --controller=remote,ip=30.0.1.159,port=6653

image-20230524141216242

步骤7

执行命令pingall验证Mininet中虚拟主机的连通性。
image-20230524141301238

步骤8

执行命令dpctl dump-flows查看交换机上的流表。
image-20230524141326457
可以看到交换机上有了流表,接着交换机会根据流表进行数据包的转发使其通信。

步骤9

停止Wireshark抓包并查看抓包结果,筛选出openflow_v1协议数据包。
image-20230524141428900

步骤10

登录ODL控制器,打开浏览器并输入URL地址:http://127.0.0.1:8181/index.html,使用用户名密码:admin/admin登录ODL控制器的Web页面,查看ODL控制器Web页面显示的拓扑。
image-20230524141501816
可以看到ODL控制器发现了交换机及主机的拓扑。

二、OpenFlow协议解析

步骤1

首先发送HELLO消息,建立初始化连接,协商使用的OpenFlow协议版本。由下图可知,ODL与Mininet之间应用的是OpenFlow1.0版本协议。
image-20230524142635450

步骤2

OpenFlow版本协商完成后,控制器发送一条features_request消息获取交换机的特性信息,包括交换机的ID(DPID)、缓冲区数量、端口及端口属性等等。相应的,交换机回复features_reply消息。
image-20230524142709230
ofpt_feature_reply数据包详情如下,交换机的DPID是数据通道独一无二的标识符。本实验中交换机缓冲区数量(n_buffers)为256,交换机支持的流表数量(n_tables)为254,交换机所支持的功能,如下所示。
image-20230524142759657

步骤3

stats reply消息用于回应stats request信息,主要是交换机回应给控制器的状态信息。
image-20230524143051242

步骤4

当交换机收到数据包后查找流表无匹配项时,将数据包封装在packet_in消息发给控制器,由控制器通过packet_out消息下发决策,使发送和接收数据包的两主机间进行通信。
image-20230524143137013
image-20230524143209447

步骤5

flow mod消息涉及流表项的下发匹配信息,下图显示的是flow mod匹配项的类型信息。
image-20230524143227119

SDN-Mininet多数据中心网络拓扑流量带宽实验

实验目的

1、掌握多数据中心网络拓扑的构建。
2、熟悉网络性能测试工具Iperf,根据实验测试SDN网络的性能。

实验环境

Mininet多数据中心网络拓扑流量带宽实验的拓扑如下图所示。
image-20230524144039707

设备名称 软件环境 硬件环境
主机 Ubuntu 14.04桌面版 Mininet 2.2.0 CPU:1核 内存:2G 磁盘:20G
控制器 Ubuntu 14.04桌面版 OpenDaylight碳版本 CPU:4核 内存:8G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙” 按钮获取对应的密码。

任务内容

1、通过Mininet模拟搭建基于不同数据中心的网络拓扑。
2、通过程序生成真实网络流量。

实验原理

使用mininet中的iperf工具在网络中生成UDP流量,iperf客户端传送数据流到iperf的服务端,由服务端接收并记录相关信息。网络性能评估中一个巨大的挑战就是如何生成真实的网络流量,可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况。此应用主要以数据中心网络为目标场景,在mininet仿真环境中尽可能地还原数据中心内部的真实流量情况。
Mininet数据中心应用价值:

  • 树状拓扑结构容错能力强
  • 降低数据中心成本消耗
  • 提供重新排列的全带宽无阻碍路径
  • 提高带宽利用率
  • 分析数据中心网络流量性能
  • 为真实数据中心和仿真测试床提供有用信息
    在mininet中进行自定义命令iperfmulti功能拓展主要分为4步:
    1.修改mininet/net.py
    2.修改mininet/cli.py
    3.修改bin/mn
    4.重新安装Mininet核心文件:~/mininet/util/install.sh -n
操作步骤

一、编写网络带宽测试程序

步骤1

登录Mininet所在虚机主机,打开命令行执行终端。

步骤2

执行sudo mkdir -p /home/sdnlab/log命令添加目录/home/sdnlab/log。

步骤3

执行命令sudo vi openlab/mininet/mininet/net.py打开net.py文件。

步骤4

在Mininet类中添加定义iperf_single()函数,实现在两个主机间进行iperf udp测试,并且在server端记录,具体代码如下,建议将代码放置在“def iperf”下。

       def iperf_single( self,hosts=None, udpBw='10M', period=60, port=5001):
                """Run iperf between two hosts using UDP.
                   hosts: list of hosts; if None, uses opposite hosts
                   returns: results two-element array of server and client speeds"""
                if not hosts:
                    return
                else:
                    assert len( hosts ) == 2
                client, server = hosts
                filename = client.name[1:] + '.out'
                output( '*** Iperf: testing bandwidth between ' )
                output( "%s and %s\n" % ( client.name, server.name ) )
                iperfArgs = 'iperf -u '
                bwArgs = '-b ' + udpBw + ' '
                print "***start server***"
                server.cmd( iperfArgs + '-s -i 1' + ' > /home/sdnlab/log/' + filename + '&')
                print "***start client***"
                client.cmd(
                    iperfArgs + '-t '+ str(period) + ' -c ' + server.IP() + ' ' + bwArgs
                    +' > /home/sdnlab/log/' + 'client' + filename +'&')

image-20230524145419820
说明:为方便用户实验,该段代码在/home/ftp/iperf_single.txt文件中已预置。

步骤5

在Mininet类中添加自定义命令iperfmulti()函数,iperfmulti函数主要是实现依次为每一台主机随机选择另一台主机作为iperf的服务器端,通过调用iperf_single,自身以客户端身份按照指定参数发送UDP流,服务器生成的报告以重定向的方式输出到文件中,使用iperfmulti命令,主机随机地向另一台主机发起一条恒定带宽的UDP数据流。具体代码如下所示,建议将代码放置在“def iperf_single”下。

 def iperfMulti(self, bw, period=60):
        base_port = 5001
        server_list = []
        client_list = [h for h in self.hosts]
        host_list = []
        host_list = [h for h in self.hosts]

        cli_outs = []
        ser_outs = []

        _len = len(host_list)
        for i in xrange(0, _len):
            client = host_list[i]
            server = client
            while( server == client ):
                server = random.choice(host_list)
            server_list.append(server)
            self.iperf_single(hosts = [client, server], udpBw=bw, period= period, port=base_port)
            sleep(.05)
            base_port += 1

        sleep(period)
        print "test has done"

image-20230524150240399
说明:为方便用户实验,该段代码在/home/ftp/iperfmulti.txt文件中已预置。

步骤6

执行如下命令,打开cli.py文件。
$ sudo vi openlab/mininet/mininet/cli.py

步骤7

在cli.py中添加如下代码,注册iperfmulti命令。

def do_iperfmulti( self, line ):
        """Multi iperf UDP test between nodes"""
        args = line.split()
        if len(args) == 1:
            udpBw = args[ 0 ]
            self.mn.iperfMulti(udpBw)
        elif len(args) == 2:
            udpBw = args[ 0 ]
            period = args[ 1 ]
            err = False
            self.mn.iperfMulti(udpBw, float(period))
        else:
            error('invalid number of args: iperfmulti udpBw period\n' +
                   'udpBw examples: 1M 120\n')

image-20230524150318845
说明:为方便用户实验,该段代码在/home/ftp/do_iperfmulti.txt文件中已预置。

步骤8

执行命令sudo vi openlab/mininet/bin/mn打开mn文件,在mn中加入iperfmulti可执行命令,如下所示。
image-20230524150348985

步骤9

执行如下命令,重新编译Mininet。

$ cd openlab/mininet/util
$./install.sh -n

image-20230524150451952

步骤10

执行sudo mn命令创建一个topo,查看是否存在iperfmulti命令,以此验证iperfmulti是否成功。
image-20230524150543724

步骤11

执行exit命令退出Mininet。

二、构建多数据中心网络拓扑

步骤1

执行如下命令,创建多数据中心拓扑创建脚本。

$ cd /home/openlab/openlab/mininet/custom
$ sudo vi fattree.py

步骤2

添加如下内容,通过python脚本自定义拓扑,创建包含两个数据中心的网络拓扑。

#!/usr/bin/python
"""Custom topology example
Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController,CPULimitedHost
from mininet.link import TCLink
from mininet.util import dumpNodeConnections

class MyTopo( Topo ):
    "Simple topology example."

    def __init__( self ):
        "Create custom topo."

        # Initialize topology
        Topo.__init__( self )
        L1 = 2
        L2 = L1 * 2 
        L3 = L2
        c = []
        a = []
        e = []

        # add core ovs  
        for i in range( L1 ):
                sw = self.addSwitch( 'c{}'.format( i + 1 ) )
                c.append( sw )

        # add aggregation ovs
        for i in range( L2 ):
                sw = self.addSwitch( 'a{}'.format( L1 + i + 1 ) )
                a.append( sw )

        # add edge ovs
        for i in range( L3 ):
                sw = self.addSwitch( 'e{}'.format( L1 + L2 + i + 1 ) )
                e.append( sw )

        # add links between core and aggregation ovs
        for i in range( L1 ):
                sw1 = c[i]
                for sw2 in a[i/2::L1/2]:
                # self.addLink(sw2, sw1, bw=10, delay='5ms', loss=10, max_queue_size=1000, use_htb=True)
                        self.addLink( sw2, sw1 )

        # add links between aggregation and edge ovs
        for i in range( 0, L2, 2 ):
                for sw1 in a[i:i+2]:
                    for sw2 in e[i:i+2]:
                        self.addLink( sw2, sw1 )

        #add hosts and its links with edge ovs
        count = 1
        for sw1 in e:
                for i in range(2):
                    host = self.addHost( 'h{}'.format( count ) )
                    self.addLink( sw1, host )
                    count += 1
topos = { 'mytopo': ( lambda: MyTopo() ) }

Mininet创建网络拓扑的代码中,可以通过改变代码中定义的L1变量来设置核心交换机的数量,并通过添加额外的交换机和链路来构成更复杂的数据中心网络拓扑。随着边缘交换机的增加,主机个数也随之增长,利用Mininet的易用性和扩展性,可以创建基于多种数据中心场景下的网络拓扑,达到更好更全面的实验效果。
说明:为方便用户实验,该段代码在/home/ftp/fattree.py文件中已预置。

步骤3

登录控制器主机,打开命令行执行终端,执行ifconfig命令查看主机的IP地址。
image-20230524150801989
说明:本实验中主机的IP地址为30.0.1.69,具体实验根据实际情况为准。

步骤4

切换到Mininet主机,执行如下命令,启动Mininet,生成测试拓扑结构。
# sudo mn --custom fattree.py --topo mytopo --controller=remote,ip=30.0.1.69,port=6653
image-20230524150837969

步骤5

执行pingall命令,验证主机间的连通性。
image-20230524150859255

步骤6

登录控制器,打开浏览器,输入URL地址:http://30.0.1.69:8181/index.html 查看ODL控制器Web页面拓扑,用户名密码分别为admin/admin,结果如下所示。
image-20230524150922612

三、测试TCP网络带宽

步骤1

切换到Mininet主机,执行命令iperf h1 h2在h1和h2之间进行iperf操作,测试同一交换机内部的主机间连通性及通信带宽。
image-20230524150937669

步骤2

执行命令iperf h1 h3在h1和h3之间进行iperf操作,测试相同汇聚交换机下不同机架的主机间连通性及通信带宽。
image-20230524150953108

步骤3

执行命令iperf h1 h5在h1和h5之间进行iperf操作,测试相同核心交换机不同汇聚交换机下的主机间连通性及通信带宽。
image-20230524151013872

步骤4

执行命令iperfmulti 0.025M设置带宽参数为0.025M,将能看到8台主机随机地向另外一台主机发送数据包。
image-20230524151054083

步骤5

打开新的命令行执行窗口,执行如下命令查看数据记录,如下所示。

$ cd /home/sdnlab/log
$ ll

image-20230524151253323

步骤6

执行命令sudo vi 1.out打开服务端数据记录,如下所示。
image-20230524151319198

步骤7

执行命令sudo vi client1.out打开客户端数据记录,如下所示。

image-20230524151354862

SDN-OpenDaylight的安装

任务目的

1、了解OpenDaylight的诞生背景和基本架构,能够对OpenDaylight整体架构有一个大体认识,从而更好的理解SDN架构。
2、掌握安装、部署OpenDaylight的方法,能够独立解决实验过程中遇到的问题。通过安装OpenDaylight组件,对OpenDaylight组成有一个更具象的认识。

任务环境
设备名称 软件环境(镜像) 硬件环境
主机 1 Ubuntu 14.04桌面版 CPU:1核 内存:2G 磁盘:20G
主机 2 Ubuntu 14.04桌面版 Mininet 2.2.0 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙”img 按钮获取对应的密码。

任务内容

1、采用两种不同的方式启动karaf控制台,对比两种方式的区别。
2、安装OpenDaylight组件,掌握一系列相关的安装、查询命令。
3、安装后进行简单的验证,确保OpenDaylight安装正确。

实验原理

OpenDaylight项目由Linux协会联合业内18家企业,包括Cisco、Juniper、Broadcom等多家传统网络的巨头公司于2013年初成立的,旨在推出一个开源的、通用的SDN网络平台。OpenDaylight项目的成立对于SDN意义重大,它代表了传统网络芯片、设备商对于SDN这个颠覆性技术的跟进与支持。业界对于OpenDaylight非常关注,它也一直在稳步扩张其成员规模。目前,该组织已吸收了33个的成员,OpenDaylight也被业界寄希望于成为SDN的通用控制平台。

OpenDaylight控制器基于JAVA语言开发,采用了OSGi(Open Service Gateway Initiative)体系结构,实现了众多网络功能的隔离,极大地增强了控制平面的可扩展性。OpenDaylight引入了SAL(Service Abstraction Layer,服务抽象层),可以自动适配包括OpenFlow交换机等底层不同的设备,使得开发者可以专注于业务应用的开发。

从Hydrogen版本总体架构图可以看出,OpenDaylight控制器主要包括:开放的北向API,控制器平面,南向接口和协议插件。整个架构包括应用层、控制层和网络设备层。应用层由控制和监控网络行为的业务和网络逻辑应用构成,此外,复杂的解决方案应用需要与云计算及网络虚拟化相结合。控制层是SDN控制器框架层,其南向协议接口可以支持不同南向协议插件,这些协议插件动态连接到SAL(Service Abstract Layer),SAL适配后再提供统一北向接口供上层应用调用。网络设备层由物理或虚拟设备构成。

image-20230524151845310

OpenDaylight开源社区成立不到一年就推出了首个开源版本氢(hydrogen),截止到目前为止,OpenDaylight已经发布了4个版本,分别是Hydrogen(氢)、Helium(氦)、Lithium(锂)、Beryllium(铍)。

实验步骤

一、直接启动karaf控制台

步骤1 选择主机1,单击终端图标,打开终端。执行su root命令切换到root用户,以下命令全部以root身份运行。

步骤2 执行以下命令解压OpenDaylight安装包文件,并进入解压目录。

# cd /home/openlab/openlab
# unzip lithium.zip
# cd distribution-karaf-0.3.0-Lithium

步骤3 执行以下命令启动控制器,并直接进入karaf控制台,如下图所示。

# ./bin/karaf

image-20230524151942082
说明:

  • 只要执行logout命令退出karaf控制台,控制器就会停止。
  • 这种方式的缺点是命令终端挂了,控制器进程也会跟着挂了。

二、后台启动karaf控制台

执行以下命令以后台任务的形式启动控制器,如下图所示。

# ./bin/start
# ./bin/client -u karaf

image-20230524152011657
说明:以后台任务的形式启动控制器,可以通过bin/client或SSH访问karaf控制器。利用start启动OpenDaylight以后,以karaf用户身份连接karaf控制器。以这种方式启动控制器,即使登出控制台,控制器进程依旧在后台运行。

三、在karaf控制台查看日志

执行以下命令在karaf控制台查看日志信息。由于日志信息较多,可以加上|more分页显示查询结果,如下图所示。

> log:display |more

image-20230524152047076

四、安装OpenDaylight组件

步骤1 执行以下命令安装必须的OpenDaylight组件:odl-restconf、odl-l2switch-switch、odl-openflowplugin-all、odl-dlux-all、odl-mdsal-all、odl-adsal-northbound。

> 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

注意:务必遵循一定的顺序安装相关组件。
image-20230524152209779
(备注:实验写入需要等待较长时间,可能为15分钟以上,请保持耐心~)

步骤2 执行以下命令列出所有OpenDaylight组件。

> feature:list 

步骤3 执行以下命令列出已安装的OpenDaylight组件。

> feature:list -i

步骤4 执行以下命令在已安装的组件中查找某一个具体的组件,例如odl-restconf,确认该组件是否已经安装。

> feature:list -i|grep odl-restconf

image-20230524152242168

五、验证OpenDaylight基本功能

步骤1 登录主机2,执行su root切换到root用户。

步骤2 执行以下命令连接控制器,并且在Mininet中进行pingall操作,测试OpenDaylight控制器的基本功能,如下图所示。

# mn --controller=remote,ip=192.168.1.3,port=6633
> pingall

其中192.168.1.3是OpenDaylight控制器的IP,请根据实际情况修改。
image-20230524152305077

步骤3 访问OpenDaylight Web界面,url是[http://ODL_host_ip]:8080/index.html ,如下图所示。

其中:[ODL_host_ip]为安装OpenDaylight所在的主机IP地址:

image-20230524152322246
说明:如果没有按照安装顺序安装OpenDaylight组件,可能会导致web界面无法访问,最好的解决方式就卸载组件,重新安装。

步骤4 输入用户名密码,单击“Login”。

说明:登录的用户名密码是admin/admin。

步骤5 单击左侧“Topology”查看拓扑,如下图所示。

image-20230524152342644

六、卸载OpenDaylight组件

步骤1 在主1上执行logout命令退出karaf控制台,回到distribution-karaf-0.3.0-Lithium目录。

步骤2 执行如下命令删除data目录,清除组件并重新进入karaf控制台。

# rm -rf data
# ./bin/karaf clean

步骤3 执行以下命令查看已安装组件,确认组件是否已经删除。

$ feature:list -i

image-20230524152138822

SDN-使用OpenDaylight界面下发流表

任务目的

1、掌握YANG UI下发流表的方式,了解YANG UI的功能特点,以及其在OpenDaylight架构中所起的作用。
2、通过下发流表的过程,梳理出数据包处理的简单流程。并且进一步了解单级流表和多级流表的处理过程。

任务环境
设备名称 软件环境(镜像) 硬件环境
控制器 Ubuntu 14.04桌面版 OpenDaylight Lithium CPU:2核 内存:4G 磁盘:20G
交换机 Ubuntu 14.04命令行版 Open vSwitch 2.3.1 CPU:1核 内存:2G 磁盘:20G
主机 Ubuntu14.04命令行版 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙”img 按钮获取对应的密码。

任务内容

1、比较使用YANG UI下发流表的方法,与直接在交换机中通过命令下流表的方方法,总结两者的异同点。
2、通过YANG UI下发流表控制主机之间的连通性,并且利用scapy工具进行测试验证。
3、分别基于OpenFlow1.0协议和OpenFlow1.3协议下发流表,经过下流表的过程了解单级流表和多级流表的概念。

实验原理

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= dl_dst= 匹配源或者目标的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。
实验步骤

一、实验环境检查

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

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

步骤2 在保证控制器6633端口处于监听状态后,使用root用户登录交换机,执行set-controller br-sw tcp:30.0.1.3:6633命令连接控制器

注意30.0.1.3是控制器的ip地址

# ovs-vsctl del-controller br-sw
# ovs-vsctl set-controller br-sw tcp:30.0.1.3:6633

img
如上所示,controller下方显示“is_connected:true”,表明连接成功。

步骤3 当交换机与控制器连接成功后,登录主机,执行ifconfig命令,配置主机ip地址

手动配置主机1的IP地址(eth1)如下图所示。
image-20230524153131977
手动配置主机2的IP地址(eth1)如下图所示。
image-20230524153230073
手动配置主机3的IP地址(eth1)如下图所示。
image-20230524153251383
分别执行ifconfig命令查看主机是否配置IP地址成功。

二、基于OpenFlow1.0协议下发流表

步骤1 切换到交换机,执行以下命令设置OpenFlow协议版本为1.0。

ovs-vsctl set bridge br-sw protocols=OpenFlow10

步骤2 选择控制器,单击浏览器图标,打开浏览器。

步骤3 访问OpenDaylight Web页面,url是http://127.0.0.1:8080/index.html,用户名和密码是admin/admin,如下图所示。

image-20230524153325157

步骤4 单击左侧的“Nodes”查看节点信息。其中尤其需要关注Node Id,下发流表的时候会用到Node Id,如下图所示。

image-20230524153352536

步骤5 单击上图中的“Node Connectors”列的数据即“9”,可以查看具体节点连接信息,如下图所示。

img

步骤6 选择左侧的“Yang UI”,单击“Expand all”展开所有目录,查看各种模块,如下图所示。

img

步骤7 展开“opendaylight-inventory rev.2013-08-19”,选择“config ——> nodes ——> node{id} ——> table{id} ——> flow{id}”,如下图所示。

image-20230524153428382

步骤8 补全node id、table id和flow id的值。

其中node id参见之前查询到的Node Id。table id和flow id可以自定义。由于OpenFlow1.0协议只支持单流表,所以这里的table id设置为0,如下图所示。
image-20230524153446913

步骤9 单击flow list后面的“+”,展开流表相关的参数。填写第一个框id,路径中的flow id也会随之同步,如下图所示。

img

步骤10 展开“match ——> ethernet-match ——> ethernet -type”,填写“type”为“0x0800”,如下图所示。

image-20230524153528715
说明:由于使用IP地址进行匹配,所以需要设置以太网协议类型。

步骤11 填写匹配参数,在“layer-3-match”后面的下拉框中选择“ipv4-match”,使用IP匹配。

步骤12 展开“layer-3-match”,填写源IP地址和目的IP地址,如下图所示。

img
其中源地址填写主机1的IP地址,目的地址填写主机2的IP地址。

步骤13 展开“instructions”,并单击“instruction list”后面的“+”,在“instruction”后面下拉框中选择“apply-actions-case”,如下图所示。

image-20230524153551807

步骤14 展开“apply-actions”,单击“action list”后面的“+”,在action后面的下拉框中选择“drop-action-case”,action order和instruction order都设置为0,如下图所示。

image-20230524153616236

步骤15 设置“priority”为27,“idle-timeout”为0,“hard-timeout”为0,“cookie”为100000000,“table_id”为0,如下图所示。

image-20230524153635089
说明:priority设置的比已有流表项的高,而idle-timeout和hardtimeout都设置为0则代表该流表项永远不会过期,除非被删除。

步骤16 向右滚动Actions栏,在路径后面有动作类型GET、PUT、POST、DELETE,下发流表则选择PUT动作,然后单击“Send”,如下图所示。

img

步骤17 如果下发成功会出现下面的提示,如果下发不成功则会弹出相应的错误信息。

img

步骤18 切换到交换机,执行如下命令查看流表,确保刚刚下发的流表已经下发到交换机。如下图所示。

ovs-ofctl dump-flows br-sw

img

步骤19 登录主机1,执行如下命令向主机2、主机3发送数据包,测试主机间的连通性。

# scapy
>>> result,unanswered=sr(IP(dst=”10.0.0.10”,ttl=(3,10))/ICMP())
>>> result,unanswered=sr(IP(dst=”10.0.0.14”,ttl=(3,10))/ICMP())

img
由上图可知,主机1与主机2之间不通,主机1与主机3通,新下发的流表项生效。
说明:如果主机之间通则能够收到answer,如果主机之间不通那么就无法收到answer,当主机之间不通时scapy就会一直发送数据包,如果需要停止可以使用Ctrl+c。

步骤20 切换到交换机,执行以下命令删除刚刚下发的流表项,并查看流表确保成功删除。

# ovs-ofctl del-flows br-sw dl_type=0x0800,nw_src=10.0.0.3,nw_dst=10.0.0.4
# ovs-ofctl dump-flows br-sw

步骤21 切换到主机1执行如下命令,测试主机1和主机2是否连通。

>>> result,unanswered=sr(IP(dst=”10.0.0.10”,ttl=(3,10))/ICMP())

image-20230524153739138
由上图可知,主机1与主机2之间就通了。

三、基于OpenFlow1.3协议下发流表

步骤1 登录交换机,设置OpenFlow协议版本为1.3。执行以下命令:

# ovs-vsctl set bridge br-sw protocols=OpenFlow13

步骤2 与OpenFlow1.0下发流表的过程解基本一致。展开opendaylight-inventory rev.2013-08-19,选择“config ——> nodes ——> node{id} ——> table{id} ——> flow{id}”。

步骤3 补全Actions栏中的路径,其中node id参见之前查询到的Node Id。table id和flow id可以自定义。由于OpenFlow1.3协议支持多级流表,所以这里的table id设置为2。

步骤4 单击flow list后面的“+”,流表相关的参数就会展开。设置id为1,路径中的flow id也会随之同步,如下图所示。

img

步骤5 展开“match ——> ethernet-match ——> ethernet -type”,填写“type”为0x0800,如下图所示。

image-20230524153826327

步骤6 在“layer-3-match”后面的下拉框中选择“ipv4-match”。

步骤7 展开“layer-3-match”,填写源IP地址和目的IP地址。以主机1的IP为源IP,以主机3的IP为目的IP,如下图所示。

image-20230524153844897

步骤8 展开“instructions”,并单击“instruction list”后面的“+”,在“instruction”后面下拉框中选择“apply-actions-case”,如下图所示。

image-20230524153901607

步骤9 展开“apply-actions”,单击“action list”后面的“+”,在“action”后面的下拉框中选择“drop-action-case”,“action order”和“instruction order”都设置为0,如下图所示。

image-20230524153927836

步骤10 设置“priority”为25,“idle-timeout”为0,“hard-timeout”为0,“cookie”为10000000,“table_id”为2,如下图所示。

img

步骤11 向右滚动Actions栏,选择“PUT”动作,然后单击“Send”下发流表。PUT成功就会弹出“Request sent successfully”,否则弹出错误信息。

步骤12 切换到主机1,执行如下命令,向主机3发送数据包,测试主机1和主机3的连通性。

>>> result,unanswered=sr(IP(dst=”10.0.0.14”,ttl=(3,10))/ICMP())

image-20230524154013611
由上图可知,主机1与主机3之间是连通的,新下发的流表没有发挥作用。原因是数据包在table 0中能够匹配到相应流表就不会被转发到table2,想要table2的流表项发挥作用就需要向table0增加一条流表,将源IP为10.0.0.3,目的IP为10.0.0.2的数据包转发到table2中处理。

步骤13 选择“config ——> nodes ——> node{id} ——> table{id} ——> flow{i}”。node id参见之前查询到的Node Id、table id设为0、flow id设为1。

步骤14 展开“match ——> ethernet-match ——> ethernet -type”,填写“type”为0x0800。

步骤15 匹配参数保持不变,以主机1的IP为源IP,以主机3的IP为目的IP。

步骤16 展开“instructions”,并单击“instruction list”后面的“+”,在“instruction”后面下拉框中选择“go-to-table-case”,如下图所示。

img

步骤17 展开“go-to-table”,table_id填写为2,即将符合匹配条件的数据包根据table2中的流表项处理。instruction order依旧设为0,如下图所示。

img

步骤18 设“priority”置为23,“idle-timeout”为0,“hard-timeout”为0,“cookie”为1000000000,“table_id”为0,如下图所示。

img

步骤19 向右滚动Actions栏,选择“PUT”动作,然后单击“Send”下发流表。

步骤20 切换到交换机,执行以下命令查看新下发的流表项。

# ovs-ofctl -O OpenFlow13 dump-flows br-sw

img

步骤21 切换到主机1,执行如下命令发送数据包,测试主机之间的连通性。

>>> result,unanswered=sr(IP(dst=”10.0.0.10”,ttl=(3,10))/ICMP())
>>> result,unanswered=sr(IP(dst=”10.0.0.14”,ttl=(3,10))/ICMP())

img
由上图可知,主机1与主机3之间不通,而主机1与主机2之间通,流表发挥作用。

SDN-OpenDaylight SFC项目基础

任务目的

1、了解OpenDaylight SFC项目。
2、掌握手动配置SFC的基本操作。

任务环境
设备名称 软件环境(镜像) 硬件环境
主机 Ubuntu 14.04桌面版 OpenDaylight Carbon CPU:2核 内存:4G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙”img 按钮获取对应的密码。

任务内容

1、学习SFC项目的安装方法。
2、手动配置SFC的基本操作。

实验原理

在网络通信过程中,包含各式各样的网络服务功能。既可以包含传统的像防火墙,NAT等功能,也有包含特定的网络应用功能(Service Function)。将特定的网络应用功能有序地组合起来,让流量通过这些服务功能就构成了网络服务链(Network Service Chain)。一般在数据中心环境下,往往会有网络服务链(Network Service Chaining)的部署需求,使得报文在数据中心传递的时候,能够经过各种各样的服务节点,保证安全、快速、稳定的网络服务。

一、SDN服务链基本概述

由于Overlay网络的发展,使得虚拟网络和物理网络分离,让数据中心的网络控制变得更加灵活,更具有扩展性。然而,在数据中心中,还存在很多介于虚拟网络和物理网络之间的中间件,如防火墙,QoS,负载均衡器等。这些中间件提供了必要的业务处理功能,即Service Function。灵活、便捷、高效、安全地调配流量到Service Function上处理,形成服务链(Service Function Chaining),这就是SFC项目要解决的问题。服务链可以理解为一种业务形式。
过去也有服务链的概念,但传统的网络服务链往往和网络拓扑紧密耦合、部署复杂,在服务链变更、扩容时,都需要改动网络拓扑,重新进行网络设备的配置。而云计算环境广泛使用虚拟化技术,具有动态性、高流动性、规模易变化、多租户等特点,传统网络的服务链无法满足这些需求,SDN的出现让服务链又焕发了生机。因此,当前再谈及服务链时,默认指的是SDN服务链。
与传统DC中配置的网络服务链相比,基于SDN的SFC具有如下的优势:

  • 传统的网络服务链往往基于手工配置,很大程度上依赖于具体的网络拓扑,以至于网络设备之间的耦合性很大。而基于SDN的配置,可以动态的添加或者删除链表上的服务节点,不仅方便使用,而且解耦了网络设备之间的关联。
  • 在数据流量经过链表的过程中,SFC还支持分类器与服务,服务与服务之间的上下文信息共享。
  • 在传统的数据服务链中,数据包往往要经过过次分类,即多次解包、封包的过程。而在SFC中,这个过程大大缩减,一般只需在分类一次即可,使得整个过程更便捷、更高效。
    blob_1z9cFVt

二、基于OpenDaylight的服务链项目

OpenDaylight的SFC项目是整个控制器平台内部的一个功能模块。用户可以通过控制器提供的北向API来使用的SFC的功能,例如创建、更新或者删除Service Chain,还可以通过配置非透明的metadata数据段用来在Service Function的节点间实现数据共享。同时,项目可以向Controller的DataStore中注册、配置服务节点,并获取拓扑。南向也支持Netconf,Openflow12等协议。Service Function Chaining 的架构如下图所示:
image-20230524154808256
SFC核心组件如下:

  • Classification:根据初始化的(配置好的)policy匹配数据流进行封装,然后转入到Service Function Chain中。
    image-20230524154821927
  • Service Function(SF):负责对收到的数据包进行特定功能的处理。作为一个逻辑上的组件,SF在具体实现的上可以是一个虚拟的元素,或者是嵌入在具体网络设备上的某种功能。常见的SF有:防火墙(firewall),WAN设备加速器,深层报文检测(Deep Packet Inspection,DPI),NAT等等。
  • Service Function Forwarder(SFF):主要负责Service Function Chaining上的流量转发控制。
  • Service Function Chain(SFC):SFC定义了一个抽象的Service Function有序集合。经过分类后的包要依次去遍历集合中的Service Function。比如:用户可以配置firewall->qos->dpi三种服务来构建一条SFC。
  • Rendered Service Path(RSP):数据包实际行走的路径。
  • Service Function Path(Service Function Path):SFP是一个逻辑概念,它是介于SFC和RSP之间的一层抽象,有时候会将SFP与SFC等同。

三、ODL的SFC项目工作流原理

image-20230524154832900
一种基于NSH封装头的机制是,使用ODL配置并下发一条Service Function Chain,每条Chain都有自己的标识。当host1发送数据包给host2,数据包首先会到分类器中进行筛选。分类出需要经过Service Function Chaining的数据包会进行封装,并打上NSH头。头中包含了很多信息,包括走哪一条服务链,服务链有几跳等。接着数据包会依次经过SFF,由SFF将数据包传递给SF或者下一跳的SFF,直到链的最后。
SFC南向REST插件的主要功能是通过REST接口向网络设备下发流表命令。当SFC数据库中的配置信息改变时,将触发流表更新操作,如下图所示。
image-20230524154847666
SFC-OVS插件是针对OVS设备设计的一个控制插件,插件实现了SFC对象(例如SFF)到OVS对象(例如bridge)的映射,这个映射关系是相互的,例如当一个SFC对象被创建的时候,SFC-OVS插件也会创建一个对应的OVS的bridge,反之亦然。在SFC中,用户将OVS作为底层网络交换机时,可以使用该插件来实现SFC的部署。SFC-OVS插件架构如下图所示:
image-20230524154859129

实验步骤

一、实验环境检查

登录主机,查看IP地址,如下图所示。

image-20230524154912247

二、安装SFC项目

步骤1 由于本次实验使用已经安装好的OpenDaylight镜像,在实验之前需要把后台启动的进程切换为前台启动。执行以下命令:

$ su
Password:
# cd /home/openlab/openlab/distribution-karaf-0.6.0-Carbon
# ./bin/stop
# ./bin/karaf

image-20230524154933503

步骤2 安装SFC-UI插件,执行以下命令:

> feature:install odl-sfc-ui

步骤3 打开浏览器,在地址栏中输入http://127.0.0.1:8181/index.html ,使用账户admin/admin登录ODL WEB UI。

如下图所示界面显示了当前的物理资源状况,可以通过其他二级菜单配置查看SFC状态。
image-20230524154954786

步骤4 在Karaf控制台中执行如下命令配置SFC南向REST插件。

> feature:install odl-sfc-sb-rest

如下图所示,在SFC-UI中,SFF配置菜单中的“REST URI”列即为每个SFF的REST接口地址。对这些REST地址进行相应修改即可完成SFC南向REST插件的配置。
image-20230524155016450

步骤5 执行以下命令安装SFC-OVS插件。

> feature:install odl-sfc-ovs

image-20230524155033808
SFC-UI刚开始都是空的,因为什么都没有配置。另外,在ODL中创建SFC有两种方式:第一,用北向的RESTAPI;第二,用UI来创建。本次实验用将基于UI实现,这样看起来比较直观,方便理解。

三、SFC基本操作

  • 场景一 创建Service Function(Application)

    步骤1 单击导航栏的“Service Functions”菜单,再单击”Add Service Function”,填写表格如下图所示。

    image-20230524155148067

    要注意以下两点:

  • 数据平面的通信方式一定要选,这里选vxlan-gpe。要不然Agent收不到请求。

  • SFF1暂时还没有创建,可以先填入SFF1,后面创建SFF的名字要与这里一致。

    步骤2 单击“Save”,SF创建结果如下图所示。

    image-20230524155229699

  • 场景二 创建Service Function Forwarders(switch)

    步骤1 在导航菜单中选择“Service Function Forwarders”,单击”Add Service Function Forwarder”,填写表单信息如下图所示。

    image-20230524155350083

    image-20230524155419774

    步骤2 单击“Save”按钮,SFF创建结果如下图所示。

    image-20230524155436279

  • 场景三 创建Service Function Chain

    步骤1 在导航栏单击“Service Function Chains”菜单,如下图所示。

    image-20230524155454755

    步骤2 单击“Add Service Function Chain”按钮,填入名字“Chain-1”,单击“Save”按钮提交,如下图所示。

    image-20230524155509162

    创建Chain-1结果如下图所示。

    image-20230524155522786

    步骤3 将”firewall”的SF拖拽到右边的Chain-1中,如下图所示。

    image-20230524155535743

    步骤4 单击保存按钮,如下图所示。

    image-20230524155548392

  • 场景四 创建Service Function Path

    步骤1 单击deploy按钮,生成一条Service Function Path,如下图所示。

    image-20230524155603931

    步骤2 命名为“Chain-1-Path-1”,单击OK按钮,成功创建Service Function Path。

    image-20230524155617655

    image-20230524155629779

    步骤3 导航栏中单击”Service Function Paths”按钮,将会看到刚创建的SFP。

    image-20230524155642138

  • 场景五 创建Rendered Service Path

    步骤1 勾选”Force Symmetric path”生成一条对称反向的RSP,保存。如下图所示。

    image-20230524155708533

    步骤2 单击下图中的按钮,生成一条RSP。

    image-20230524155725957

    image-20230524155740865

    到“Rendered Service Path”标签页可以看到创建的RSP,如下图所示。

    image-20230524155756975

    创建后可以看到RSP的两个重要属性“Path-ID”为53,“starting-index”为255。

    SDN-基于RESTCONF的拓扑查询

任务目的

1、学习了解SDN控制器REST北向接口的作用。
2、熟悉OpenDaylight有关网络拓扑的REST常用接口。

任务环境
设备名称 软件环境(镜像) 硬件环境
控制器 Ubuntu 14.04桌面版 OpenDaylight Lithium CPU:2核 内存:4G 磁盘:20G
交换机 Ubuntu 14.04命令行版 Open vSwitch 2.3.1 CPU:1核 内存:2G 磁盘:20G
主机 Ubuntu14.04桌面版 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙”img 按钮获取对应的密码。

任务内容

1、掌握OpenDaylight有关网络拓扑展示的北向接口。
2、使用Postman,查询网络拓扑并读懂Json内容。

实验原理

OpenDaylight提供了多个模块的北向接口,主要可以分为3大类,分别为网络服务类、平台服务类、拓展类。常用的有Topology、Host Tracker、Flow programmer、Statistices、Switch Manager、User Manage。主要模块以及对应的功能如下:

image-20230524160202063

OpenDaylight的拓扑RESTful API对应的子资源点有两个分别为CONFIG和OPERATIONAL,CONFIG主要是拓扑的配置信息,OPERATIONAL主要是运行时的拓扑信息。每种类型的拓扑中包含两个模块的拓扑信息,flow模块和ovsdb模块。在OpenDaylight没有安装ovsdb模块时,ovsdb拓扑是不展示的。
在CONFIG类型中的拓扑包含ovsdb模块的配置信息如配置的网桥、端口、隧道等,flow模块中包含node、link以及流表的配置信息。
在OPERATIONAL类型中flow模块包含node信息,以及link信息。ovsdb拓扑包含ovsdb的配置信息,端口的流量信息。ovsdb的配置信息中包含当前连接的控制器信息、和控制器通信的 OpenFlow协议版本信息、bridge配置信息等。

任务步骤

一、实验环境检查

步骤1 登录控制器,查看控制器IP,如下图所示。

image-20230524160221760

步骤2 使用root用户登录交换机,然后查看交换机与控制器连接情况。如下图所示,is_connected为true表明控制器与交换机连接成功,如下图所示。

image-20230524160230291

注:当出现交换机与控制器连接不成功时,执行# ovs-vsctl del-controller br-sw #ovs-vsctl set-controller br-sw tcp:30.0.1.3:6633手动重连,稍等一会后,重新查看连接状态。

二、查看拓扑

步骤1 登录控制器主机,单击桌面的Applications MenuDevelopmentPostman菜单,打开postman应用,如下图所示。

image-20230524160300858

步骤2 输入URL http://[controller-ip]:8080/restconf/operational/network-topology:network-topology/

[controller-ip] 为当前控制器的数据层的ip,请求类型选择GET访问一个页面需要输入用户名和密码,同样,用Postman发送请求也需要一定的权限。单击Authorization,type选择basic auth。输入用户名和密码,用户名和密码都是admin,如下图所示。

image-20230524160309919

步骤3 单击Send按钮查看结果如下图所示。

image-20230524160320180

image-20230524160327968

image-20230524160337086

本次实验主要是查看flow拓扑,查看当前拓扑中node节点,node节点的port信息,node节点之间的连接信息。可以查看到,当前flow拓扑中有两个node节点,分别为openflow:152594686067525、openflow:148415615564871。Link信息一端为openflow:148415615564871:2,另一端为openflow:152594686067525:2。

步骤4 单击“实验拓扑”按钮,查看交换机之间连接端口,可以验证上述结论。

image-20230524160141486

SDN-Open vSwitch网桥管理

任务目的

1、了解网桥的基本概念以及工作原理。
2、掌握网桥相关的基本命令,学会添加、删除、查看网桥,为后续实验做准备。

任务环境
设备名称 软件环境 硬件环境
交换机 Ubuntu 14.04命令行版 Open vSwitch 2.3.1 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙”img 按钮获取对应的密码。

任务内容

1、学习网桥相关的基本概念。
2、学习常用的网桥命令,进行网桥和端口的添加、删除、查看等操作。

实验原理

在网络中,交换机和桥概念类似,Open vSwitch是一个虚拟交换软件,也就是说,Open vSwitch实现了网桥的功能。学习Open vSwitch的第一步要弄清楚网桥的概念。网桥是连接两个局域网的设备,工作在数据链路层,根据MAC地址来转发帧。在Open vSwitch中创建一个网桥后,此时网络功能不受影响,但是会产生一个虚拟网卡,之所以会产生一个虚拟网卡,是为了实现接下来的网桥(交换机)功能。有了这个网桥以后,还需要为这个网桥增加端口(port),一个端口就是一个物理网卡,当网卡加入到这个网桥之后,其工作方式就和普通交换机的一个端口的工作方式类似了。以下是一个网桥的具体信息:

root@localhost:~# ovs-vsctl show
bc12c8d2-6900-42dd-9c1c-30e8ecb99a1b
Bridge "br0"
    Port "eth0"
        Interface "eth0"
    Port "br0"
        Interface "br0"
            type: internal
ovs_version: "1.4.0+build0"

上述信息显示了一个名为br0的桥(交换机),这个交换机有两个接口,一个是eth0,一个是br0。
上面说到,创建桥的时候会创建一个和桥名字一样的接口,并自动作为该桥的一个端口,那么这个虚拟接口的作用,一方面是可以作为交换机的管理端口,另一方面也是基于这个虚拟接口实现了桥的功能。Open vSwitch的内核模块实现了多个“数据路径”,每个都可以有多个vports。每个数据路径也通过关联流表(flow table)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport。当一个数据包到达一个vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息,当有一个匹配的流时它执行对应的操作,如果没有匹配,它会将数据包送到用户空间的处理队列中,作为处理的一部分,用户空间可能会设置一个流用于以后碰到相同类型的数据包可以在内核中执行操作。
ovs-vsctl关于网桥管理的常用命令如下:

命令 含义
init 初始化数据库(前提数据分组为空)
show 打印数据库信息摘要
add-br BRIDGE 添加新的网桥
del-br BRIDGE 删除网桥
list-br 打印网桥摘要信息
list-ports BRIDGE 打印网桥中所有port摘要信息
add-port BRIDGE PORT 向网桥中添加端口
del-port [BRIDGE] PORT 删除网桥上的端口
get-controller BRIDGE 获取网桥的控制器信息
del-controller BRIDGE 删除网桥的控制器信息
set-controller BRIDGE TARGET 向网桥添加控制器
实验步骤

一、实验环境检查

步骤1 登录交换机,执行ovs-vsctl show命令,查看镜像中原有的网桥,如下图所示。

image-20230524164818464

步骤2 执行以下命令删除当前网桥,并进行确认,如下图所示。

# ovs-vsctl del-br br-sw
# ovs-vsctl show
image-20230524164830252

二、添加网桥和端口

步骤1 执行以下命令添加名为br0的网桥。

# ovs-vsctl add-br br0

步骤2 执行以下命令,列出Open vSwitch中所有网桥,如下图所示。

# ovs-vsctl list-br

image-20230524164901042

步骤3 执行以下命令,将物理网卡挂接到网桥br0上,如下图所示。

# ovs-vsctl add-port br0 eth0

说明:port和bridge是多对一的关系,也就是说一个网桥上可以挂接多个物理网卡。

步骤4 执行以下命令,列出挂接到网桥br0上的所有网卡,如下图所示。

# ovs-vsctl list-ports br0

image-20230524164915888

步骤5 执行以下命令,列出挂接到eth0网卡上的所有网桥,如下图所示。

# ovs-vsctl port-to-br eth0

image-20230524164925645

步骤6 执行以下命令,查看Open vSwitch的网络状态,如下图所示。

# ovs-vsctl show

image-20230524164947039

三、删除网桥和端口

步骤1 执行以下命令,删除挂接到网桥br0上的网卡eth0。

$ ovs-vsctl del-port br0 eth0

步骤2 执行以下命令,查看open vswitch的网络状态,如下图所示。

# ovs-vsctl show

image-20230524165006447
由上图可知,删除eth0后网桥br0依旧存在。

步骤3 执行如下命令,删除网桥br0,并进行确认,如下图所示。

# ovs-vsctl del-br br0

image-20230524165022928
说明:如果不删除eth0直接删除br0,br0及挂接到br0上的端口会被一并删除。

SDN-Open vSwitch流表管理

任务目的

1、了解Open vSwitch流表的基本概念。
2、掌握流表的基本命令,学会添加、删除、查看流表,为后续实验做准备。

任务环境
设备名称 软件环境 硬件环境
交换机 Ubuntu 14.04命令行版 Open vSwitch 2.3.1 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙”img 按钮获取对应的密码。

任务内容

1、学习Open vSwitch流表的基本概念。
2、学习常用的流表命令,进行流表的添加、删除、查看等操作。

实验原理

OpenFlow是用于管理交换机流表的协议,ovs-ofctl是Open vSwitch提供的命令行工具。在没有配置OpenFlow控制器的模式下,用户可以使用ovs-ofctl命令通过OpenFlow协议连接Open vSwitch来创建、修改或删除Open vSwitch中的流表项,并对Open vSwitch的运行状况进行动态监控。ovs-ofctl关于流表管理的常用命令如下表所示。
image-20230524165237725
对于add-flow、add-flows和mod-flows这3个命令,还需要指定要执行的动作actions=[target],[target]…,一个流规则中可能有多个动作,按照指定的先后顺序执行。
常见的流表操作如下表所示。
image-20230524165247748
在OpenFlow白皮书中,Flow被定义为某个特定的网络流量。例如,一个TCP连接就是一个Flow,或者从某个IP地址发出来的数据包,都可以被认为是一个Flow。支持OpenFlow协议的交换机应该包括一个或多个流表,流表中的条目包含:数据包头的信息、匹配成功后要执行的指令和统计信息。当数据包进入OVS后,会将数据包和流表中的流表项进行匹配,如果发现了匹配的流表项,则执行该流表项中的指令集。相反,如果数据包在流表中没有发现任何匹配,OVS会通过控制通道把数据包发到OpenFlow控制器中。在OVS中,流表项作为ovs-ofctl的参数,采用如下的格式:字段=值,如果有多个字段,可以用逗号或空格分开,一些常用的字段列举如下表所示。
image-20230524165253045

实验步骤

一、实验环境检查

步骤1 登录交换机,执行以下命令,查看镜像中原有的网桥,如下图所示。

ovs-vsctl show

image-20230524165259103

步骤2 执行以下命令,删除当前网桥,并进行确认,如下图所示。

ovs-vsctl del-br br-sw
ovs-vsctl show

image-20230524165305436

二、流表管理

步骤1 执行以下命令,添加网桥,并查看虚拟交换机的基本信息,如下图所示。

# ovs-vsctl add-br br0
# ovs-ofctl show br0

image-20230524165347417
由上图可知,可以查看到交换机dpid、流表数量、性能参数、动作参数、MAC地址等信息。

步骤2 执行以下命令,查看虚拟交换机上各端口的状态,如下图所示。

# ovs-ofctl dump-flows br0

image-20230524165352169
由上图可知,输出的结果中包含了各端口上收到的数据包数,字节数,丢包数,错误数据包数等。

步骤3 执行以下命令,添加一条流表项,设置流表项生命周期为1000s,优先级为17,入端口为3,动作是output:2。

# ovs-ofctl add-flow br0 idle_timeout=1000,priority=17,in_port=3,actions=output:2

说明:这条流表项的作用是将端口3接收到的数据包从端口2输出。

步骤4 执行以下命令,查看交换机上所有流表信息,如下图所示。

# ovs-ofctl dump-flows br0

步骤5 执行以下命令,删除入端口为3的的流表项,删除后,再次查看流表信息,如下图所示。

# ovs-ofctl del-flows br0 in_port=3
# ovs-ofctl dump-flows br0

image-20230524165430578

SDN-OpenFlow建立连接交互流程学习

任务目的

1、了解OpenFlow交换机与OpenFlow控制器建立TCP连接的过程。
2、掌握配置安全通道中的OpenFlow版本的方法。
3、掌握OpenFlow交换机和OpenFlow控制器的消息交互流程。

任务环境
设备名称 软件环境(镜像) 硬件环境
控制器 Ubuntu 14.04桌面版 Floodlight 1.0 CPU:1核 内存:2G 磁盘:20G
主机 Ubuntu 14.04桌面版 Mininet 2.2.0 CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙”img 按钮获取对应的密码。

任务内容

1、配置交换机与控制器,使其支持OpenFlow1.3。
2、分析消息包,掌握交换机与控制器的消息交互流程。

实验原理

一、OpenFlow协议简介

2006年,斯坦福大学Clean Slate计划资助的Ethane项目开始部署,致力于企业网架构的创新,OpenFlow协议的雏形就诞生于这个项目。2008年,Nick McKeown教授的一篇重要论文“OpenFlow:Enabling Innovation in Campus Networks”使得OpenFlow正式进入人们的视野,继而成为了标准化组织ONF(Open Network Foundation,开放网络基金会)主推的南向接口协议。经过多年的发展,OpenFlow现已成为SDN的主流南向接口协议之一。目前,OpenFlow协议还在不断地演进中,本实验采用OpenFlow v1.3协议,并对控制器与OpenFlow交换机之间的交互过程进行深入分析。
OpenFlow主要有3种类型的消息,分别是Controller-to-Switch、Asynchronous和Symmetric,其中每个类型又包含多个子类型。Controller-to-Switch消息由控制器发起,用于管理、查看交换机的状态。Asynchronous消息由交换机发起,向控制器汇报交换机的事件和改变。Symmetric消息由控制器或交换机任一方发起,无需请求直接发起消息。详细信息如下表所示:

消息类型 消息例子 描述
Controller-to-Switch Packet_out Barrier Switch Configuration Switch Features Multipart 控制器使用这些消息可以添加、修改或删除流表项 查询交换机的功能和统计 配置交换机 配置交换机端口属性 将数据包发送出指定交换机端口
Asynchronous(异步) Error Packet_in Port Status Table Status Controller Role Status 由交换机发起,发送消息给控制器 这些消息可以是没有匹配交换机中任意流表项的数据包或数据包头,因此需要发送给控制器进行处理 在流状态、端口状态改变,或者产生错误消息时,进行通知
Symmetric(对称) Hello Echo Experimenter Hello消息在控制器与交换机建立连接过程中使用 Echo消息用来确定Controller-to-Switch连接的延时,验证连接是否处于活跃状态 Experimenter消息用于未来消息的扩展

二、OpenFlow连接建立交互流程

image-20230524182527618
在OpenFlow1.3协议的情况下,控制器与OpenFlow交换机的消息完整交互流程如下:
1、 控制器与OpenFlow交换机通过TCP“三次握手”,建立有效的连接。其中,控制器一端的端口号为6633。
2、 控制器与OpenFlow交换机之间相互发送Hello消息,用于协商双方的OpenFlow版本号。在双方支持的最高版本号不一致的情况下,协商的结果将以较低的OpenFlow版本为准。如果双方协商不一致,还会产生Error消息。
3、 控制器向OpenFlow交换机发送Features Request消息,请求OpenFlow交换机上传自己的详细参数。OpenFlow交换机收到请求后,向控制器发送Features Reply消息,详细汇报自身参数,包括支持的buffer数目、流表数以及Actions等。
4、 控制器通过Set Config消息下发配置参数,然后通过Get config Request消息请求OpenFlow交换机上传修改后的配置信息。OpenFlow交换机通过Get config Reply消息向控制器发送当前的配置信息。
5、 控制器与OpenFlow交换机之间发送Packet_out、Packet_in消息,通过Packet_out中内置的LLDP包,进行网络拓扑的探测。
6、 控制器与OpenFlow交换机之间通过发送Multipart Request、Mutipart Reply消息,控制器能获取OpenFlow交换机的状态信息,包括流的信息、端口信息等。
7、 控制器与OpenFlow交换机之间通过发送Echo Request、Echo Reply消息,保证二者之间存在有效连接,避免失联。
说明:以上为控制器与OpenFlow交换机之间的标准交互流程,在具体实验过程中某些阶段可能会缺失。

实验步骤

一、实验环境检查

步骤1 登录控制器,查看控制器所在主机的IP地址。桌面版镜像可以通过双击桌面上的“Terminal”图标打开命令终端,也可以使用Ctrl+Alt+t快捷方式打开命令终端,如下图所示。

image-20230524182535231

步骤2 登录主机1,查看Mininet所在主机的IP地址,如下图所示。

image-20230524182540208

二、捕获数据包

步骤1 登录Floodlight控制器,启动抓包工具Wireshark,捕获控制器与交换机建立连接过程中的数据包,通过分析这些数据包了解控制器与交换机基于OpenFlow协议进行交互的流程。执行以下命令:

$ sudo wireshark

步骤2 双击eth0网卡,查看eth0网卡上数据包收发情况,如下图所示。

image-20230524182545444

步骤3 登录Mininet虚拟机,启动Mininet。通过“--controller”参数设置Mininet连接远程控制器,并指定控制器的IP和端口号。

$ sudo mn --controller=remote,ip=30.0.1.3,port=6633 --switch=ovsk,protocols=OpenFlow13

image-20230524182549480

步骤4 登录Floodlight控制器,停止Wireshark,观察数据包列表,可以看出控制器与交换机的基本交互流程。

image-20230524182554683

三、OpenFlow1.3交互流程分析

步骤1 交换机连接控制器的6633端口,经过3次握手后双方建立TCP连接。查看捕获到的数据包,分析交换机与控制器建立TCP连接的流程。分析TCP连接建立过程,需要先了解TCP的状态位,主要包括SYN、FIN、ACK、PSH、RST和URG。SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有DATA数据传输,RST表示连接重置。可以看出交换机与控制器经历一次连接重置后,成功完成三次握手,建立TCP连接,如下图所示。

image-20230524182606012

步骤2 当控制器与交换机建立TCP连接后,由其中某一方发起Hello消息,双方协调协OpenFlow议版本号。控制器和交换机都会向对方发送一条Hello消息,消息中附上自己支持的OpenFlow的最高版本。接收到对方Hello消息后,判断自己能否支持对方发送的版本,能支持则版本协商成功,不能支持则回复一条OFPT_ERROR消息。查看Hello消息详情,本实验中由于交换机和控制器都能支持OpenFlow1.3版本,所以版本协商为1.3,如下图所示。

image-20230524182612241

步骤3 OpenFlow版本协商完成后,控制器发送一条features_request消息获取交换机的特性信息,包括交换机的ID(DPID)、缓冲区数量、端口及端口属性等等。相应的,交换机回复features_reply消息,如下图所示。

image-20230524182620420
查看数据包详情,ofpt_feature_request消息只有包头,如下图所示。
image-20230524182627532
ofpt_feature_reply数据包详情如下,交换机的DPID是数据通道独一无二的标识符,低48位是一个MAC地址,高16位是自定义的。本实验中交换机缓冲区数量(n_buffers)为256,交换机支持的流表数量(n_tables)为254,交换机所支持的功能,如下图所示。
image-20230524182632222

步骤4 OpenFlow1.0协议中feature_reply消息还包含交换机端口信息,OpenFlow 1.3协议将‘stats’框架更名为‘multipart’框架,并且将端口描述移植到multipart消息中。其中OPPT_PORT_DESC类型的multipart消息就是用于获取交换机端口信息的。

image-20230524182636729
查看OPPT_PORT_DESC类型multipart_reply消息,消息中列出了交换机的端口以及每个端口的详细信息,包括端口名称和mac地址等,如下图所示。
image-20230524182640775

步骤5 OFPMP_DESC类型的multipart_reply消息包含了交换机的其他信息,包括交换机厂商名称、交换机名称以及交换机版本等。本实验中使用的是Mininet仿真软件中自带的开源交换机Open vSwitch(2.0.2),而Open vSwitch是由Nicira Networks主导开发的,如下图所示。

image-20230524182647618

步骤6 在连接过程中,控制器不断的发送echo_request消息给交换机,确认交换机与控制器之间的连接状态。相应的,交换机会回复echo_reply消息,如下图所示。

image-20230524182511306

SDN-OF-CONFIG南向接口协议学习

任务目的

1、了解OF-CONFIG协议的基本原理。
2、掌握使用OF_CONFIG协议配置交换机的方法。

任务环境
设备名称 软件环境(镜像) 硬件环境
交换机 Ubuntu 14.04桌面版 Open vSwitch ofconfig CPU:1核 内存:2G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙”img 按钮获取对应的密码。

任务内容

1、学习OF-CONFIG协议的基本原理,了解其可以实现的功能。
2、使用OF-CONFIG协议添加、删除交换机端口,修改交换机端口状态。

实验原理

在ONF组织制定的SDN标准体系中,除了OpenFlow之外,还有一个名为OF-CONFIG(OpenFlow Configuration and Management Protocol)的协议同样引起了业界广泛的关注。在OpenFlow协议中,控制器向OF交换机发送流表以控制数据流的转发行为,但是它并没有规定如何去管理和配置这些OF交换机,而OF-CONFIG就是为解决这一问题而提出的。OF-CONFIG与OpenFlow之间存在着密切的关系,因此随着OpenFlow标准的演进,OF-CONFIG的版本也在不断跟进,目前已更新至OpenFlow v1.2版本。OF-CONFIG协议的演进主要体现在配置能力的提升上,例如除了OF-CONFIG v1.0所能提供的3项基本功能外,v1.1版本还能支持对OpenFlow逻辑交换机与控制器之间的安全通信证书的配置,支持OpenFlow逻辑交换机的发现,支持多种数据隧道类型(包括IPinGRE、VxLAN、NVGRE等)。OF-CONFIG v1.1.1在v1.1版本的基础上增加了对OpenFlow v1.3.1协议的支持,而OF-CONFIG v1.2版本则主要增加了对NDM(Negotiable Datapath Model,可协商数据平面模型)的支持。
随着功能的提升,OF-CONFIG协议的数据模型也有相应的调整,例如增加了逻辑交换机能力、认证等新的数据模型。另外,在一些细节的配置项目上,之后的OF-CONFIG版本也都有不同程度的改进和完善。
作为OpenFlow协议的“伴侣”协议,OF-CONFIG的作用是提供一个开放接口用于远程管理和配置OF交换机。它并不会影响到流表的内容和数据转发行为,对实时性也没有太高的要求。具体地说,诸如构建流表和确定数据流走向等事项将由OpenFlow规范进行规定,而诸如如何在OF交换机上配置控制器IP地址、如何配置交换机端口上的队列等操作则由OF-CONFIG协议完成。OF-CONFIG提供配置OF交换机的能力,这里所指的OF交换机可以是一个物理交换机,也可以是一个虚拟的网络转发设备。
OpenFlow交换机上所有参与数据转发的软硬件(例如端口、队列等)都可被视为网络资源,而OF-CONFIG的作用就是对这些资源进行管理。OF-CONFIG与OpenFlow的关系如下图所示。
image-20230524182923662
OpenFlow配置点是指通过发送OF-CONFIG消息来配置OF交换机的一个节点,它既可以是控制器上的一个软件进程,也可以是传统的网管设备,它通过OF-CONFIG协议对OF交换机进行管理,因此该协议也是一种南向接口协议。OF-CONFIG定义的各组件之间的逻辑关系如图1所示。需要说明的是,OpenFlow配置点与控制器之间的交互不在OF-CONFIG协议的规定范围。OpenFlow协议的不断演进,对OF-CONFIG的设计也提出了越来越多的需求。为了应对这种情况,OF-CONFIG定义了利用业界相对非常成熟的NETCONF协议来实现OF-CONFIG协议的传输。
OF-CONFIG最主要的设计目标是协助OpenFlow协议,支持用户远程对OF交换机进行配置和管理。除此之外,OF-CONFIG还根据自身的需要制定了多种场景下的操作运维需求以及对交换机管理协议的需求,本小节将从上述几个方面分析OF-CONFIG v1.1.1的功能。
1、 实现对OpenFlow v1.3.1协议设备进行配置的设计需求

  • 连接设置
    OF交换机与控制器连接之前,有3个参数需要提前设置,包括控制器IP地址、控制器端口号以及传输协议。
  • 多控制器
    OF-CONFIG协议提供交换机同时与多控制器连接的参数配置。
  • OpenFlow逻辑交换机
    OpenFlow v1.3.1协议规定了与OpenFlow逻辑交换机有关的各种OpenFlow资源。OF-CONFIG协议必须支持对这些OpenFlow资源的配置,如对OpenFlow逻辑交换机进行端口和队列等资源的配置。
  • 连接中断
    当交换机与控制器失去连接时,有Fail Secure Mode(失败安全模式)和Fail Standalone Mode(失败独立模式)两种模式可选择,OF-CONFIG协议可预先为OF交换机配置连接失效后进入的模式。
  • 加密
    为安全考虑,OF交换机与控制器第一次建立连接时,双方均进行身份认证,OF-CONFIG协议提供用户配置,两者以TLS建立连接的身份认证方式。
  • 队列
    OF-CONFIG协议提供对OF交换机队列最小速率(Minrate)、最大速率(Maxrate)以及自定义速率(Experimenter)3个参数的配置。
  • 端口
    虽然OpenFlow协议本身对交换机端口参数可以进行部分配置,但不够全面系统。而端口属性配置是网络配置中必不可少的一项,OF-CONFIG协议提供以下4种属性的配置,包括禁止接收、禁止转发、禁止Packet-in消息以及管理状态等,同时也可对端口速率、双工、铜介质、光纤介质、自动协商、暂停以及非对称暂停等参数进行配置。同时,在数据中心网络等网络虚拟化环境中,OF-CONFIG协议还支持逻辑端口的配置,目前版本的OF-CONFIG协议可以支持IPinGRE、VxLAN以及NVGRE,之后的OF-CONFIG版本可能会支持其他类型的隧道。
  • 能力发现
    OpenFlow v1.3.1协议规范了多种虚拟交换机能力特性,如多种Action类型。虽然配置这些能力超出了OF-CONFIG协议的范围,但是它支持发现这些能力。表1对上述配置项进行了总结。
    1 OF-CONFIG v1.1.1支持的OpenFlow v1.3.1协议支持的配置需求
项目 说明
控制器连接 支持在交换机上配置控制器参数,包括IP地址、端口号及连接使用的传输协议等
多控制器 支持多个控制器的参数配置
逻辑交换机 支持对逻辑交换机(即OF交换机的实例)的资源(如队列、端口等)设置,且支持带外设置
连接中断 支持故障安全,故障脱机等两种应对模式的设置
加密传输 支持控制器和交换机之间TLS隧道参数的设置
队列 支持队列参数的配置,包括最小速率、最大速率、自定义参数等
端口 支持交换机端口的参数和特征的配置,即使OpenFlow v1.2中并没有要求额外的配置方式
能力发现 发现虚拟交换机的能力特性

2、 实际操作运维的设计需求
除了上述为支持OpenFlow协议而制定的设计需求外,为便于交换机的操作运维,OF-CONFIG v1.1.1协议必须支持以下几种场景:

  • 支持OF交换机被多个OpenFlow配置点配置;
  • 支持一个OpenFlow配置点管理多个OF交换机;
  • 支持一个OpenFlow逻辑交换机被多个控制器控制;
  • 支持配置OpenFlow逻辑交换机的端口和队列;
  • 支持OpenFlow逻辑交换机的能力发现;
  • 支持配置隧道如IPinGRE、VxLAN以及NVGRE。
    3、 交换机管理协议需求
    OF-CONFIG v1.1.1协议定义了OF交换机与OpenFlow配置点间的通信标准,主要包括交换机的管理协议部分以及数据模型的设计。其中数据模型部分将在下一节具体介绍,交换机的管理协议部分则有以下设计需求:
  • 保障安全性,支持完整、私有以及认证,支持对交换机和配置点双向认证;
  • 支持配置请求和应答的可靠传输;
  • 支持由配置点或者交换机进行连接设置;
  • 能够承载局部交换机配置以及大范围交换机配置;
  • 支持配置点在交换机配置参数以及接收来自交换机的配置参数;
  • 支持在交换机创建、更改以及删除配置信息,并支持报告配置成功的结果以及配置失败的错误码;
  • 支持独立发送配置请求,并支持交换机到配置点的异步通知;
  • 支持记忆能力、可伸展性以及报告其自身属性和能力。
实验步骤

一、实验环境检查

登录主机,打开Terminal终端窗口,使用命令ifconfig查看主机IP地址,如下图所示。

image-20230524182932069

二、启动服务

步骤1 切换root用户登录主机,执行以下命令启动必要的服务ofconfig、netopeer-server。

# ofc-server
# netopeer-server –d

执行以下命令查看服务是否启动成功。

# ps -ef|grep ofc
# ps -ef|grep neto

image-20230524182937202
注:如果启动不成功,再次执行启动命令直至启动成功。

步骤2 执行以下命令启动netopeer-cli,并连接netopeer-server。

# netopeer-cli**
>connect --port 830 --login openlab 10.0.0.10

注:830是netopeer-server的默认监听端口,openlab是系统用户名,10.0.0.10是服务所在主机IP地址。

image-20230524182941272

三、配置交换机端口

步骤1 创建端口eth1。

创建端口的脚本在镜像中已经给出:/root/create_port_eth1.xml,执行命令创建端口。

> edit-config --config=/root/create_port_eth1.xml running

image-20230524182946613

步骤2 重新打开另一个Terminal窗口,执行命令ifconfig查看当前主机eth1是否添加成功,默认为启动状态。

image-20230524182950122

步骤3 修改eth1端口状态为down。

切换到第一个命令行执行窗口,修改eth1端口状态为down的脚本已经在镜像中给出:/root/port_openflow_set_down.xml,执行命令修改端口状态。

> edit-config --config=/root/port_openflow_set_down.xml running

img

步骤4 分别用命令ifconfig和ifconfig -a查看eth1状态,如下图所示。

image-20230524183112406
image-20230524183117150
以上截图说明eth1网卡存在,但是状态是down。

步骤5 修改eth1端口状态为up。

修改eth1端口状态为up的脚本已经在镜像中给出:/root/port_openflow_set_up.xml,直接执行命令:

> edit-config –config=/root/port_openflow_set_up.xml running

image-20230524182958478

步骤6 执行命令ifconfig查看eth1状态,如下图所示。

image-20230524183002065

步骤7 删除端口eth1。

删除端口的脚本在镜像中已经给出:/root/remove_port_eth1.xml,执行以下命令删除端口。

> edit-config --config=/root/remove_port_eth1.xml running

image-20230524183007260

步骤8 执行命令ifconfig -a查看eth1是否已被删除,如下图所示。

image-20230524183011422
由上图可知,成功删除eth1端口。