软件定义网络(SDN)是一种新兴的、控制与转发分离并直接可编程的网络架构。
其中一般具有两个平面,即控制平面和数据平面:

SDN 架构
SDN 架构

Mininet 是一个网络仿真工具,可以方便地模拟各种规模的网络,在这里我们将其用作数据平面。
Ryu 是一个 SDN 控制器(网络操作系统)框架,可以高效简便地开发 SDN 控制器软件,在这里我们将其用作控制平面。

接下来,本文将参考官方的说明文档,介绍安装 Mininet、Ryu 和相关工具的过程,同时记录笔者在安装过程中出现的常见问题和解决方案。

下载官方镜像

Download/Get Started With Mininet - Mininet

建议采用官方教程中的 Option 1 进行安装,即下载安装预先打包好的虚拟机镜像。

配置虚拟机

  1. 根据官方的安装指引,可以选择多种虚拟机平台,这里依照个人喜好采用了 VMware Workstation Pro
  2. 预打包的镜像是基于 Ubuntu 系统的,为方便在国内网络环境下使用,需要修改 Source List 和配置 pypi 源。
    为了文章简单,这里以 清华大学开源软件镜像站 为例:

  3. (可选)切换 Shell。zsh 可以让操作更加遍历,不过需要一些额外的配置。参考 Oh My Zsh - a delightful & open source framework for Zsh
  4. (可选)拍摄快照,方便虚拟机出现问题时迅速恢复。

    image-20211017123054370.png
    image-20211017123054370.png

安装 Ryu

Ryu 是一个 Python Package,可以通过 pip 快捷安装:

sudo pip3 install ryu

更加详细的安装过程可以参考:

Welcome to RYU the Network Operating System(NOS) — Ryu 4.34 documentation

启用 X11 Forwarding

为了能够让官方的无头(headless) 配置虚拟机能够显示 Wireshark 等具有 GUI 的程序,可采用 X11 转发的方式,在本地上显示程序的图像。

几点概念

  • X11 转发是基于 SSH 协议实现的功能
  • X11 转发中有 Client 和 Server 之别。

假设此时你打算用一台 Windows 上的 SSH 连接到另一台 Linux 主机并在上面运行 Wireshark,那么 Windows 是 Server,Linux 就是 Client。看上去这有点违反直觉,因为在传统的 C/S 模式中,Linux 在提供服务,我们在 Windows 上接收服务。

但事实上,Windows 上运行的 X11 Server 就像一个画布,Linux 上的 X11 Client 就像一个画家。Server 同显示器等硬件打交道,为画家(Client)提供绘图的必要服务。画家处理数据并对用户的做出响应,在画布(Server)上展示出来。(参见鸟哥的Linux私房菜

操作步骤

  1. 安装 vcxsrv;
  2. 修改服务端参数使之开启 X11 转发;

    打开 /etc/ssh/ssh_config 确保:

    X11Forwarding yes

    重启 sshd 服务。

  3. 打开本地(Windows)上的 XLaunch,启动一个 X Server。记住启动完成后右下角状态栏图标上显示的名称。

    例如:Leo-Laptop:0.0

  4. SSH 连接主机(Linux),并启用 X11 转发。

    ssh -X username@host
  5. 在主机上导入变量指定转发到的客户端:

    export DISPLAY="Server Name"

    其中 “Server Name” 是第 3 步中启动的 X Server 的名称,例如 Leo-Laptop:0.0

  6. 启动服务,以 Wireshark 为例:

    sudo -E wireshark &

    或:

    sudo HOME=~ wireshark &

    其中:& 代表在后台执行该命令,不必等待程序退出;

    -E 使得 sudo 指令继承当前用户的环境变量;

    HOME=~ 使得 sudo 执行时设置 HOME 变量为 ~ (当前用户的家目录)。

    之所以要这样做,是因为以 root 身份执行 Wireshark 时,Wireshark 会尝试访问 root 用户的家目录,而 X11 Forwarding 时并没有权限访问 root 的家目录,所以需要我们指定家目录为当前用户的家目录,避免出现权限不足运行出错。

配置 VSCode

每次在本地写完代码然后拷贝到虚拟机内测试运行,十分麻烦。

  1. 下载 Remote-SSH 拓展
  2. 到虚拟机内获取 IP 地址:

    ip addr | grep eth0
  3. 在VSCode左下角选择远程连接,添加新主机,输入 IP 地址连接。

    image-20211020125336271.png
    image-20211020125336271.png

  4. (可选)最好生成一对密钥用于登录,否则每次操作都要输入密码,比较麻烦。

测试 Mininet

运行以下命令,可以在 Mininet 中生成一个具有三个主机的拓扑,同时使用 Pingall 指令对连通性进行测试。

sudo mn --test pingall --topo single,3

image-20211020190741987.png
image-20211020190741987.png

后记

到这里基本上环境搭建就完成了,接下来会更新几篇博客,记录一下 “网络算法基础” 课程的 4 个 Project,供 Mininet 和 Ryu 学习者参考。