SDN学习+Mininet+OpenDaylight

时间:2024-01-31 10:47:47

SDN

SDN介绍

SDN字面意思是软件定义网络,SDN将在整个网络(不仅仅是网元)的垂直方向变得开放、标准化、可编程,从而让人们更容易、更有效地使用网络资源。

在传统的架构中,交换机和路由器不得不在操作6000种分布式协议的控制下实施整个网络的智能。这就意味着,即使只有一个网元增加了一种新的协议,也需要所有其他网元做出相应的结构变更。事实上,在网络中增加一种新的协议往往需要数年时间,才能最终完成标准化到实际部署的过程。

Mininet

Mininet是什么

Mininet是由一些虚拟的终端节点(end-hosts)、交换机、路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美。

Mininet可以很方便地创建一个支持SDN的网络:host就像真实的电脑一样工作,可以使用ssh登录,启动应用程序,程序可以向以太网端口发送数 据包,数据包会被交换机、路由器接收并处理。有了这个网络,就可以灵活地为网络添加新的功能并进行相关测试,然后轻松部署到真实的硬件环境中。

Mininet安装与部署

Mininet虚拟机安装

  1. 下载Mininet镜像:https://github.com/mininet/mininet/releases
  2. 下载虚拟机软件. VirtualBox , VMware Workstation
  3. 安装镜像

本地安装(推荐)

通过Git拉取源代码

git clone git://github.com/mininet/mininet

安装Mininet,根据mininet/util/install.sh -h 查看命令选择

mininet/util/install.sh -n3V 2.5.0

安装完成后,使用命令测试Mininet安装是否成功

sudo mn --test pingall

SDN_Command

安装Mininet文件包(最省事)

在Ubuntu安装Mininet文件包

sudo apt install mininet/precise-backports

安装时遇到的问题

Mininet_Q1.png

提示6653端口被占用

sudo service openvswitch-testcontroller stop

内部交互命令

使用sudo mn 进入交互后创建默认拓扑

help #查看帮助命令
net #查看链路信息
nodes #查看网络里面有多少节点以及有什么节点
links #查看链路健壮性,看看某条链路是不是在正常工作
pingall #测试所有主机间通信
pingpair #只验证前两个主机连通性-
dump #节点信息
intfs #网络接口信息
iperf h1 h2 #测试H1 H2的带宽
link s1 s2 up#禁用或开始节点间的链路
iperfudp bw h1 h2 #测试H1 H2 的UDP带宽
xterm h1 #节点开启可视化操作
py net.addSwtich("s1") #执行python 表达式

py实验

添加一个h3 并连接至 s1

py net.addHost(\'h3\') #添加一个主机h3
py net.addLink(s1,net.get(\'h3\')) #将s1 和 h3连接起来
py s1.attach(\'s1-eth3\') #添加接口s1-eth3
py net.get(\'h3\').cmd(\'ifconfig h3-eth0 10.3\') #给h3设置ip
py dump #查看设备的信息
#发现我们的h3并没有显示我们设置的IP 依然为none
#我们需要h1 ping h3命令,让设备发现他的ip。在dump即可查看正确的设备信息。

OpenDaylight

1.安装ODL依赖包

  sudo apt-get update
  sudo apt-get install openjdk-8-jdk

2.下载OpenDaylight控制器:http://www.opendaylight.org/software/downloads

 tar zxvf distribution-karaf-0.3.0-Lithium.tar.gz

3.配置Java环境

打开 vi /etc/profile

添加以下代码

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

JRE_HOME=$JAVA_HOME/jre

CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export JAVA_HOME JRE_HOME CLASS_PATH PATH

source 文件

source /etc/profile

4.测试是否安装成功

cd distribution-karaf-0.3.0-Lithium

执行./bin/karaf

执行成功后

odl.png

流表

当前拓扑图为

实验目标为:

h1 无法ping h2

dpctl del-flows
#清除所有流表,也可以使用sh ovs-ofctl s1  del-flows 针对S1删除流表
dpctl add-flow in_port=1,actions=output:2 
#让1端口添加output 2端口
dpctl add-flow in_port=2,actions=output:3,output:1 
#让2端口添加output 3,1端口
dpctl add-flow in_port=3,actions=output:2
#让3端口添加output 2端口

输入pingall 结果为

1   ->  h2 X 
h2  ->  h1 h3 
h3  ->  X  h2 

再来一个实验

任务目标是使得h1 与 h2 通, h3 与 h4通, h1 与 h3 不通。

根据这个任务目标,也就是只有相同交换机下的主机才可以互通。

h1 连接了 s2 的 2 端口

h2 连接了 s2 的 3端口

h3 连接了 s3 的 2端口

h4 连接了 s3的 3端口

只要交换机之间不互通即可。交换机是1,3端口。先删除所有流表,在添加 2 ,3的互通。

dpctl del-flows 
dpctl add-flow in_port=2,actions=output:3
dpctl add-flow in_port=3,actions=output:2

pingall结果:

h1 -> h2 X X 
h2 -> h1 X X 
h3 -> X X h4 
h4 -> X X h3

用另外一种思路

将s1路由器来自1端口的全部丢弃,也可以实现。

 sh ovs-ofctl add-flow s1 priority=50,in_port=1,action=drop