从 Mininet 虚拟网络到 HCL 厂商设备,全面演示 Ryu 与 OpenDaylight 如何下发 OpenFlow 流表
一、前置知识和环境要求
1.1 核心概念速览
SDN 架构:OpenDaylight 或 Ryu 作为控制层核心,负责转发策略制定,通过 OpenFlow/NetConf 等协议与 Mininet 或 HCL 的数据层(交换机)通信,实现 “控制与转发分离”
OpenDaylight 版本选择:目前稳定版为 Carbon(2017)、Nitrogen(2018)、Oxygen(2019),推荐新手选择 Carbon(兼容性强、文档完善),本文以该版本为例
Ryu 使用 Anaconda 环境安装,Anaconda 具备环境隔离能力,可以避免与其他 Python 项目冲突,Anaconda的安装见 官方库,本文使用 Anaconda3-2024.10-1-Linux-x86_64.sh 版本
1.2 环境规格要求
本文以推荐配置为例,使用Ubuntu 22.04 LTS,安装带桌面的版本。
二、环境准备
2.1 安装Mininet
首先安装git
sudo apt-get install git -y使用git clone把mininet源码下载下
git clone https://github.com/mininet/mininet.git使用官方提供的安装脚本,选择 -a 全部安装,安装过程较久,耐心等待,若中途出现warning,无需理会。如果是Ubuntu18及以下的版本可能会出现错误,推荐使用Ubuntu20及以上。
mininet/util/install.sh -a若安装回显最后一行显示Enjoy Mininet!,则说明安装成功
2.2 安装Ryu
安装Ryu之前,先安装Anaconda,构造python3.8的环境,Anaconda安装包见 链接,本文使用 Anaconda3-2024.10-1-Linux-x86_64.sh 版本
sh Anaconda3-2024.10-1-Linux-x86_64.sh弹出的安装界面,先回车安装,然后按q键快速阅读完安装说明,然后选择 yes,再回车,最后是否初始化再选择 yes 即可。若最后显示 Thank you for installing Anaconda3! 则说明安装成功。
命令行输入bash,刷新进入base环境(默认为最新python环境)
bash命令行显示类似于 (base) wxy@Ser:~$ 即可,由于base环境的 Python版本过高,需要创建一个低版本的环境 sdn。安装中途提示是否继续,按y继续
conda create -n sdn python=3.8激活进入刚创建的环境中
conda activate sdn然后通过pip安装Ryu
# 先换源
pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
# 需要指定安装低版本 setuptools
pip install setuptools==67.6.1
# 指定安装低版本 eventlet
pip install eventlet==0.30.2
# 最后安装 Ryu
pip install ryu
# 运行测试,若没有报错则说明安装成功
ryu-manager2.3 安装OpenDaylight
ODL 运行依赖 JDK 8,需先完成 JDK 安装并配置环境变量,步骤如下(以Ubuntu22.04为例)
2.3.1 安装 Oracle JDK8
下载 JDK8 压缩包: 下载见官方下载地址 ( 选择 jdk-8u481-linux-x64.tar.gz )
解压到指定目录 (推荐 /usr/local/java)
# 创建目录
sudo mkdir -p /usr/local/java
# 解压压缩包(路径需替换为你的下载路径)
sudo tar -zxvf jdk-8u481-linux-x64.tar.gz -C /usr/local/java/配置环境变量(全局生效)
# 编辑profile文件
sudo vim /etc/profile
# 在文件末尾添加以下内容(注意JDK路径与版本匹配)
export JAVA_HOME=/usr/local/java/jdk1.8.0_481
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
# 生效环境变量
source /etc/profile验证安装结果 java -version,若输出 java version “1.8.0_481”,则说明安装成功
2.3.2 OpenDaylight 控制器部署
ODL 提供两种部署方式:压缩包解压(推荐新手)、源码编译(适合二次开发),本文重点讲解压缩包部署。官网下载地址:https://docs.opendaylight.org
下载 ODL Carbon 版本,从 ODL 官网下载稳定版压缩包,或通过 wget 直接下载(需注意版本链接有效性)
wget https://nexus.opendaylight.org/content/repositories/public/org/opendaylight/integration/distribution-karaf/0.6.3-Carbon/distribution-karaf-0.6.3-Carbon.tar.gz解压到工作目录(如 /opt/odl)
# 创建目录
sudo mkdir -p /opt/odl
# 解压
sudo tar -zxvf distribution-karaf-0.6.4-Carbon.tar.gz -C /opt/odl/
# 简化目录名(可选)
cd /opt/odl
sudo mv distribution-karaf-0.6.4-Carbon nitrogen启动 ODL控制器
# 进入ODL启动目录
cd nitrogen/bin
# 启动控制器(前台运行,便于查看日志;后台运行加 -d 参数)
./karaf
# 如果启动失败,可能是权限问题,可修改odl目录所属用户组和用户,将wxy改为你的用户
sudo chown -R wxy:wxy /opt/odl/若终端显示 opendaylight-user@root> 命令行提示符,说明控制器启动成功
安装 ODL 核心功能模块,在opendaylight-user@root> 命令行下执行下列指令。各模块含义自行AI。安装完成后,可通过 feature:list | grep odl- 查看已安装模块。安装核心模块(涵盖OpenFlow 1.3、REST API、拓扑可视化等),安装时间较长,耐心等待
feature:install odl-restconf odl-l2switch-switch-ui odl-openflowplugin-flow-services-ui odl-mdsal-apidocs odl-dluxapps-applications访问 ODL Web界面,首先确保防火墙以开放 8181 端口 (以Ubuntu22为例)
sudo ufw allow 8181/tcp
sudo ufw reload在本地浏览器输入地址:http://[ODL服务器IP]:8181/index.html,例如:
http://192.168.100.110:8181/index.html登录认证:默认用户名 / 密码为 admin/admin,可以看到如下界面则说明安装成功

2.3.3 修改 OpenDaylight 默认登陆密码
默认密码存在安全风险,需及时修改
在 ODL 命令行(opendaylight-user@root>)执行:
# 进入Karaf配置目录
cd /opt/odl/nitrogen/etc
# 编辑users.properties文件
vim users.properties找到 admin=admin,admin 行,格式为 [用户名]=[密码],[角色],修改为新密码(如 admin=A不错23456#, admin)。
重启 ODL 控制器生效
# 退出当前Karaf会话(按Ctrl+D)
./bin/karaf stop
./bin/karaf # 重新启动三、联调测试
3.1 Ryu与Mininet 联调
首先将Ryu的源码下载下来,里面app一会儿需要用
git clone https://github.com/faucetsdn/ryu.git运行Ryu内一个简单的案例
cd ryu/ryu/app/
ryu-manager simple_switch.py再打开一个命令行窗口,运行Mininet
sudo mn --controller=remote进入mininet命令行后,输入pingall,若显示 *** Results: 0% dropped (2/2 received),则说明联调成功
3.2 Mininet 自定义拓扑
进入mininet/custom目录,里面有一个 topo-2sw-2host.py 脚本案例,可以参考阅读
"""Custom topology example
Two directly connected switches plus a host for each switch:
host --- switch --- switch --- host
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
class MyTopo( Topo ):
"Simple topology example."
def build( self ):
"Create custom topo."
# Add hosts and switches
leftHost = self.addHost( 'h1' )
rightHost = self.addHost( 'h2' )
leftSwitch = self.addSwitch( 's3' )
rightSwitch = self.addSwitch( 's4' )
# Add links
self.addLink( leftHost, leftSwitch )
self.addLink( leftSwitch, rightSwitch )
self.addLink( rightSwitch, rightHost )
topos = { 'mytopo': ( lambda: MyTopo() ) }
通过命令行启动自定义的拓扑
# 进入创建的Python3.8环境
conda activate sdn
# 启动 simple switch13 案例
cd ryu/ryu/app/
ryu-manager simple_switch_13.py再开一个命令行,进入自定义拓扑目录
cd mininet/custom/
# 自行ai下面指令含义
sudo mn --custom topo-2sw-2host.py --topo mytopo --controller remote --switch ovsk --mac
# ping测试
pingall3.3 Mininet 可视化操作
需要有桌面环境
sudo python3 mininet/examples/miniedit.py打开自带界面后,可以先绘制一个如下图所示的简单拓扑,注意连线时需要一直按住鼠标,Switch需要连接上控制器,右键控制器,选择properties,controller type 选择 remote controller

按下图编辑配置,然后点击run,运行

在弹出的CLI的mininet命令行界面,可以通过 xterm h1 h2 打开主机 h1和h2的命令行界面,如下图所示

3.4 OpenDaylight 与 Mininet联调
进入 Mininet 自带的的可视化编辑界面
sudo python3 mininet/examples/miniedit.py通过可视化界面绘制一个简易拓扑,操作步骤在 3.3 中已给出,控制类型仍然选择Remote,3.3给出的演示Remote连接的是Ryu控制器,而此次连接的是 OpenDaylight 控制器。

运行 topo 后,在 mininet 命令行内执行 pingall 操作,然后进入 ODL Web 界面 http://192.168.100.110:8181/index.html,重载 topo 页面,就可以看到刚才在 MiniEdit界面内绘制的 topo 了

评论区