Mininet介绍
前言
最近在学习计算机网络时,学到了SDN,想看看有没有相关的网络仿生工具,就看到了这个mininet,在云服务器上跑了一下,还不错。
Mininet 简介
Mininet 是一个轻量级的网络仿真工具,专为软件定义网络(SDN)研究和开发设计。它允许用户在单台计算机上快速创建包含虚拟主机、交换机、路由器和控制器的自定义网络拓扑。通过 Linux 内核的命名空间(namespaces)和虚拟化技术(如 Open vSwitch),Mininet 能够高效模拟复杂网络环境,支持 OpenFlow、Netconf 等协议,是学术界和工业界测试 SDN 应用的首选工具。
核心优势:
快速部署:一键生成虚拟网络,支持自定义拓扑。低成本实验:无需物理设备,单机模拟大规模网络。无缝兼容:与主流 SDN 控制器(如 Ryu、POX、ONOS)集成。真实代码环境:基于实际 Linux 网络栈,行为接近真实设备。
Mininet 安装教程
以下是针对不同系统的安装方法,推荐使用 Ubuntu 系统以获得最佳兼容性。
方法 1: Ubuntu 官方仓库安装(推荐)
适用场景:快速安装稳定版本。
更新系统包
sudo apt update && sudo apt upgrade -y
安装 Mininet
sudo apt install mininet -y
验证安装
sudo mn --test pingall # 启动默认拓扑并测试连通性
若输出 *** Results: 100% dropped,可能需要安装 Open vSwitch:
sudo apt install openvswitch-switch -y
方法 2: 源码安装(获取最新版)
适用场景:需要最新功能或自定义配置。
安装依赖
sudo apt install git net-tools ethtool socat -y
克隆仓库并安装
git clone https://github.com/mininet/mininet
cd mininet
git tag # 查看可用版本(如选择最新版)
git checkout -b 2.3.0 # 替换为所需版本号
sudo util/install.sh -a # -a 安装全部组件(包括 Open vSwitch, Wireshark 等)
验证安装
sudo mn --version # 查看版本
sudo mn --test pingall
方法 3: Docker 容器安装
适用场景:快速体验或隔离环境。
安装 Docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER # 将用户加入 docker 组
newgrp docker # 刷新组权限
拉取 Mininet 镜像
docker pull iwaseyusuke/mininet
启动容器并测试
docker run -it --rm --privileged iwaseyusuke/mininet
mn> h1 ping h2 # 在容器内执行 ping 测试
常见问题解决
权限不足:确保使用 sudo 执行命令,或添加用户到 sudoers 文件。Open vSwitch 未启动:运行 sudo service openvswitch-switch start。Wireshark 集成:安装时添加 -w 参数(sudo util/install.sh -w)。
快速入门示例
创建一个简单拓扑(1 交换机 + 2 主机)并测试:
sudo mn --topo single,2 --mac --switch ovsk --controller remote
mininet> pingall # 测试连通性
mininet> h1 ifconfig # 查看主机网络配置
通过 Mininet,您可以高效验证网络设计、调试 SDN 控制器或进行网络安全实验。
Mininet使用技巧
Mininet 是一个轻量级的网络仿真工具,主要用于创建虚拟的软件定义网络(SDN)环境,支持快速构建、测试和调试网络拓扑。以下是 Mininet 的核心使用方法:
1. 安装 Mininet
Ubuntu/Debian 系统(推荐):sudo apt-get update
sudo apt-get install mininet
其他系统:可通过源码安装(详见 Mininet 官方文档)。
2. 基本命令
启动默认拓扑
sudo mn
这会创建一个简单的拓扑:1 台 OpenFlow 交换机连接 2 台主机(h1 和 h2)。
常用 CLI 命令
在 Mininet 命令行界面(CLI)中,可以执行以下操作:
nodes:查看所有节点(主机、交换机、控制器)。links:检查链路状态。pingall:测试所有主机之间的连通性。h1 ping h2:测试 h1 到 h2 的连通性。xterm h1:打开主机 h1 的终端。dump:查看节点详细信息(如 IP 地址)。exit:退出 Mininet。
3. 自定义拓扑
通过命令行参数创建拓扑
sudo mn --topo=linear,3 # 创建 3 台交换机,每台连接 1 台主机的线性拓扑
sudo mn --topo=tree,depth=2,fanout=3 # 树形拓扑,深度 2,每层分支数 3
通过 Python 脚本创建拓扑
编写 Python 脚本(例如 custom_topo.py):from mininet.topo import Topo
class MyTopo(Topo):
def __init__(self):
Topo.__init__(self)
# 添加交换机
s1 = self.addSwitch('s1')
s2 = self.addSwitch('s2')
# 添加主机
h1 = self.addHost('h1')
h2 = self.addHost('h2')
h3 = self.addHost('h3')
# 连接设备
self.addLink(s1, s2)
self.addLink(s1, h1)
self.addLink(s2, h2)
self.addLink(s2, h3)
topos = {'mytopo': (lambda: MyTopo())}
启动 Mininet:sudo mn --custom custom_topo.py --topo mytopo
4. 连接外部控制器(如 OpenDaylight/ONOS)
sudo mn --controller=remote,ip=<控制器IP>,port=<控制器端口>
# 示例:连接本地 OpenDaylight(默认端口 6653)
sudo mn --controller=remote,ip=127.0.0.1,port=6653
5. 网络测试与调试
带宽测试(使用 iperf):mininet> h1 iperf -s & # h1 作为服务端
mininet> h2 iperf -c h1 # h2 作为客户端测试带宽
启动 HTTP 服务:mininet> h1 python3 -m http.server 80 &
mininet> h2 curl h1 # 从 h2 访问 h1 的 HTTP 服务
6. 高级功能
设置链路参数(带宽、延迟、丢包率):sudo mn --link tc,bw=10,delay='5ms',loss=1
使用 XTerm 调试:mininet> xterm h1 h2 # 打开 h1 和 h2 的终端
7. 清理资源
退出 Mininet 后,运行以下命令确保清除残留进程:sudo mn -c
常见问题
权限问题:使用 sudo 运行 Mininet。控制器连接失败:检查控制器是否启动,端口是否开放。主机无法通信:确认控制器是否正确配置流表(如使用 OpenFlow 控制器)。
通过上述步骤,你可以快速上手 Mininet,进行网络原型设计、SDN 实验或分布式系统测试。
2. 安装 OpenFlow 控制器(需 SDN 功能)
若要测试 SDN 控制器(如编写流表、实现自定义路由),需安装并指定控制器。以下是常用控制器安装方法:
示例:安装轻量级控制器 ovs-testcontroller
sudo apt install openvswitch-testcontroller -y
sudo systemctl start openvswitch-testcontroller # 启动控制器
启动 Mininet 并指定控制器:
sudo mn --controller=remote,ip=127.0.0.1,port=6653 --test pingall
常见问题解答
为什么没有控制器也能 ping 通? OVS 网桥在无控制器时默认以“普通交换机”模式运行,通过 MAC 地址学习自动转发流量。
如何彻底消除警告? 安装默认控制器(如 ovs-testcontroller)或通过 --controller=none 显式禁用控制器:
sudo mn --controller=none --test pingall
下一步实验
尝试以下命令探索 Mininet 功能:
# 启动交互式 CLI
sudo mn
# 查看网络拓扑
mininet> net
# 测试带宽
mininet> iperf
# 进入主机 shell
mininet> h1 ifconfig