SDN
SDN介绍
SDN字面意思是软件定义网络,SDN将在整个网络(不仅仅是网元)的垂直方向变得开放、标准化、可编程,从而让人们更容易、更有效地使用网络资源。
在传统的架构中,交换机和路由器不得不在操作6000种分布式协议的控制下实施整个网络的智能。这就意味着,即使只有一个网元增加了一种新的协议,也需要所有其他网元做出相应的结构变更。事实上,在网络中增加一种新的协议往往需要数年时间,才能最终完成标准化到实际部署的过程。
Mininet
Mininet是什么
Mininet是由一些虚拟的终端节点(end-hosts)、交换机、路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美。
Mininet可以很方便地创建一个支持SDN的网络:host就像真实的电脑一样工作,可以使用ssh登录,启动应用程序,程序可以向以太网端口发送数 据包,数据包会被交换机、路由器接收并处理。有了这个网络,就可以灵活地为网络添加新的功能并进行相关测试,然后轻松部署到真实的硬件环境中。
Mininet安装与部署
Mininet虚拟机安装
- 下载Mininet镜像:https://github.com/mininet/mininet/releases
- 下载虚拟机软件. VirtualBox , VMware Workstation
- 安装镜像
本地安装(推荐)
通过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
安装Mininet文件包(最省事)
在Ubuntu安装Mininet文件包
sudo apt install mininet/precise-backports
安装时遇到的问题
提示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
执行成功后
流表
当前拓扑图为
实验目标为:
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