目 录CONTENT

文章目录

从 Mininet 到 HCL:SDN 控制器 Ryu 与 OpenDaylight 的全场景实验指南

enzyme
2026-01-28 / 0 评论 / 6 点赞 / 75 阅读 / 0 字

从 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 版本

  • Mininet 和 HCL 采用最新版,源码或工具包见链接 Mininet HCL

1.2 环境规格要求

类型

最低配置

推荐配置

操作系统

Ubuntu 20.04 LTS / CentOS 8

Ubuntu 22.04 LTS / CentOS 9

CPU

2核

4核及以上

内存

4G

8G及以上(避免内存泄漏)

磁盘空间

20G

100G(预留日志模块空间)

网络

单网卡静态ip

双网卡静态ip(管理数据分离)

本文以推荐配置为例,使用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-manager

2.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测试
pingall

3.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 了

3.5 OpenDaylight 与 HCL联调

6

评论区