Mininet基本操作与分析

介绍

Mininet 作为一个轻量级软定义网络研发和测试平台,其主要特性包括:

  • 支持 Openflow、OpenvSwitch 等软定义网络部件
  • 方便多人协同开发
  • 支持系统级的还原测试支持复杂拓扑、自定义拓扑
  • 提供 Python API
  • 很好的硬件移植性(Linux 兼容),结果有更好的说服力
  • 高扩展性,支持超过 4096 台主机的网络结构

.如果想要对某个节点的虚拟机单独进行命令操作,也十分简单,命令格式为 node cmd例如查看交换机 s1 上的网络信息,我们只需要在执行的 ifconfig 命令前加上 s1 主机标志即可,即 s1 ifconfig,同样,如果我们想用 ping 3 个包的方法来测试 h2 跟 h3 之间连通情况,只需要执行 h2 ping -c 3 h3 即可。

mininet> h2 ping -c 3 h3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=7.19 ms
64 bytes from 10.0.0.3: icmp_seq=2 ttl=64 time=0.239 ms
64 bytes from 10.0.0.3: icmp_seq=3 ttl=64 time=0.136 ms
— 10.0.0.3 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.136/2.523/7.194/3.303 ms

自定义拓扑

Mininet 提供了 Python API,可以用来方便的自定义拓扑结构。

在 mininet/custom 目录下给出了几个例子。例如在 topo-2sw-2host.py 文件中定义了一个 mytopo,则可以通过 --topo 选项来指定使用这一拓扑,命令为 sudo mn --custom ~/mininet/custom/topo-2sw-2host.py --topo mytopo --test pingall

同样的,我们可以通过下面的 Python 脚本来完成对一个2 层 tree 拓扑网络的测试。

from mininet.net import Mininet
from mininet.topolib import TreeTopo
tree4 = TreeTopo(depth=2,fanout=2)
net = Mininet(topo=tree4)
net.start()
h1, h4 = net.hosts[0], net.hosts[3]
print h1.cmd('ping -c1 %s' % h4.IP())
net.stop()

链路操作

在 Mininet cli 中,使用 link 命令,禁用或启用某条链路,格式为

link node1 node2 up/down

例如临时禁用 s1 跟 h2 之间的链路,可以用

link s1 h2 down

启动参数总结

  • -h, --help 打印帮助信息
  • --switch=SWITCH 交换机类型,包括 [kernel user ovsk]
  • --host=HOST 模拟主机类型,包括 [process]
  • --controller=CONTROLLER 控制器类型,包括 [nox_dump none ref remote nox_pysw]
  • --topo=TOPO,arg1,arg2,...argN 指定自带拓扑,包括 [tree reversed single linear minimal]
  • -c, --clean清理环境
  • --custom=CUSTOM 使用自定义拓扑和节点参数
  • --test=TEST 测试命令,包括 [cli build pingall pingpair iperf all iperfudp none]
  • -x, --xterms 在每个节点上打开 xterm
  • --mac 让MAC 地址跟 DP ID 相同
  • --arp 配置所有 ARP 项
  • -v VERBOSITY, --verbosity=VERBOSITY [info warning critical error debug output] 输出日志级别
  • --ip=IP 远端控制器的IP地址
  • --port=PORT 远端控制器监听端口
  • --innamespace 在独立的名字空间内
  • --listenport=LISTENPORT 被动监听的起始端口
  • --nolistenport 不使用被动监听端口
  • --pre=PRE 测试前运行的 CLI 脚本
  • --post=POST 测试后运行的 CLI 脚本

常用命令总结

  • help 默认列出所有命令文档,后面加命令名将介绍该命令用法
  • dump 打印节点信息
  • gterm 给定节点上开启 gnome-terminal。注:可能导致 Mininet 崩溃
  • xterm 给定节点上开启 xterm
  • intfs 列出所有的网络接口
  • iperf 两个节点之间进行简单的 iperf TCP测试
  • iperfudp 两个节点之间用指定带宽 udp 进行测试
  • net 显示网络链接情况
  • noecho 运行交互式窗口,关闭回应(echoing)
  • pingpair 在前两个主机之间互 ping 测试
  • source 从外部文件中读入命令
  • dpctl 在所有交换机上用 dptcl 执行相关命令,本地为 tcp 127.0.0.1:6634
  • link 禁用或启用两个节点之间的链路
  • nodes 列出所有的节点信息
  • pingall 所有 host 节点之间互 ping
  • py 执行 Python 表达式
  • sh 运行外部 shell 命令
  • quit/exit 退出

其他操作

执行 sudo mn -c 会进行清理配置操作,适合故障后恢复。 执行 exit 会退出 Mininet 的 CLI,同时给出运行时间统计。 py cmd 使用 Python 来执行 cmd。 测试 Mininet 启动后立刻关闭的时间可以用 sudo mn --test none


使用 dpctl

dpctl 程序是一个命令行工具用来检测和管理 OpenFlow 数据通路,它能够显示当前的状态数据通路,包括功能配置和表中的条目,以及合适使用 OpenFlow 的内核模块,可以用来添加,删除,修改和监视 datapaths。

查看交换机端口信息基本情况(TCP 端口 6634 是默认交换机监听端口)。

# dpctl show tcp:9.123.137.25:6634
features_reply (xid=0x94af8117): ver:0x1, dpid:1
n_tables:255, n_buffers:256
features: capabilities:0xc7, actions:0xfff
 1(s1-eth1): addr:2e:d1:ca:aa:af:67, config: 0, state:0
     current:    10GB-FD COPPER
 2(s1-eth2): addr:66:93:32:1e:9b:9e, config: 0, state:0
     current:    10GB-FD COPPER
 LOCAL(s1): addr:5e:bc:ab:cc:dc:43, config: 0x1, state:0x1
get_config_reply (xid=0x92fc9e48): miss_send_len=0

查看流表信息:

# dpctl dump-flows tcp:9.123.137.25:6634
stats_reply (xid=0xe2c7ea1e): flags=none type=1(flow)

此时,流表为空,执行 h1 ping h2 无法得到响应。因此我们需要通过 dpctl 手动添加流表项,实现转发。

手动添加流表项:

# dpctl add-flow tcp:9.123.137.25:6634 in_port=1,actions=output:2
# dpctl add-flow tcp:9.123.137.25:6634 in_port=2,actions=output:1
# dpctl dump-flows tcp:9.123.137.25:6634      
  stats_reply (xid=0x131ed782): flags=none type=1(flow)
  cookie=0, duration_sec=13s, duration_nsec=401000000s, table_id=0, priority=32768, \
  n_packets=0, n_bytes=0,idle_timeout=60,hard_timeout=0,in_port=1,actions=output:2
  cookie=0, duration_sec=5s, duration_nsec=908000000s, table_id=0, priority=32768, \
  n_packets=0, n_bytes=0,idle_timeout=60,hard_timeout=0,in_port=2,actions=output:1

此时查看流表可以看到新的转发信息,同时可以在 h1 和 h2 之间可以相互连通。执行

dpctl 其他常用操作

创建 datapath 编号为 0

#dpctl adddp n1:0

增加两个网络设备到新的 datapath

#dpctl adddp n1:0 eth0
#dpctl adddp n1:0 eth1

检测数据通路接收的流量

#dpctl monitor n1:0

在数据通路中删除网络设备

#dpctl delif nl:0 eth0
执行

dpctl show tcp:127.0.0.1:6634

可以查看到交换机的端口等基本情况,其中 tcp 端口 6634 是默认的交换机监听端口。

执行

dpctl dump-flows tcp:127.0.0.1:6634

可以看到更详细的流表信息。 此时,流表为空,执行 h2 ping h3 无法得到响应。因此我们需要通过 dpctl 手动添加流表项,实现转发。 命令为

dpctl add-flow tcp:127.0.0.1:6634 in_port=1,actions=output:2
dpctl add-flow tcp:127.0.0.1:6634 in_port=2,actions=output:1

此时查看流表可以看到新的转发信息,同时可以在 h2 和 h3 之间 ping 通。


控制器

通过执行

sudo mn --controller=remote --ip=[controller IP] --port=[controller listening port]

可以连接到控制器。


交换机与控制器交互

我们可以启动一个简单的控制器,默认没有任何流表项,仅仅作为一台带学习功能的交换机。控制器默认监听端口是 6633。

以下控制器与交换机之间的消息交互过程,可以通过 wireshark,配置 of 过滤器观察到交换机跟控制器之间的交互消息。 参见下面的表格。

消息 类型 描述
Hello Controller->Switch 跟着 TCP 握手,控制器发送它的版本号到交换机。
Hello Switch->Controller 交换机回复它支持的版本。
Features Request Controller->Switch 控制器询问可用端口。
Set Config Controller->Switch 控制器让交换机发送流超时消息。
Features Reply Switch->Controller 交换机回复端口、端口速度、支持的表和行动。

同样,我们可以用 wireshark 观察到当第一次有 ping 包从 h2 发到 h3 时,控制器如何自动添加相应的表项到交换机。wireshark 相应的过滤器为 of && (of.type != 3) && (of.type != 2)

相关的消息过程参考下面的表格。 | 消息 | 类型 | 描述 | | -- | -- | -- | | Packet-In | Switch->Controller | 网包到达交换机,没有发生匹配,发送到控制器。| | Packet-Out | Controller->Switch | 从交换机端口发出包。| | Flow-Mod | Controller->Switch | 添加指定流。| | Flow-Expired | Switch->Controller | 流超时。


外部读取配置命令

可以写到一个文件中,用 Mininet 直接调用。例如脚本文件名为 my_cli_script,则可以执行

mininet> source my_cli_script

或者

# mn --pre my_cli_script


Mininet的基本操作就先介绍到这里,后续会有Mininet源码的分析,请小伙伴关注一下我,以后一起交流、学习。万分感谢,转载请标明原处。https://blog.csdn.net/qq_31667705/article/details/79882620


.

猜你喜欢

转载自blog.csdn.net/qq_31667705/article/details/79882620