常用命令
mininet
mininet >help 获取帮助列表
mininet >nodes 查看网络拓扑中结点的状态
mininet >links 显示链路健壮性信息
mininet >net 显示网络拓扑
mininet >dump 显示每个节点的接口设置和表示每个节点的进程的PID
mininet >pingall 在网络中的所有主机之间执行ping测试
mininet>pingpair 只测试前两个主机的连通性
mininet >iperf 两个节点之间进行iperftcp带宽测试(iperf h1 h2)
mininet >iperfudp 两节点之间进行iperfudp带宽测试(iperfudp bw h1h2)
mininet >link 禁用或启用节点间链路link s1 s2 up启用link s1 s2 down禁用s1和s2之间的链路)
mininet >h1 ping h2 h1和h2节点之间执行ping测试
mininet >h1 ifconfig 查看host1的IP等信息
mininet >xterm h1 打开host1的终端
mininet >exit 退出mininet登录
mininet >intfs 查看网络接口信息
openflow
查看流表:dpctl dump-flows
添加流表:dpctl add-flow in_port=2,actions=output:3
添加丢弃数据包流表:dpctl add-flow in_port=2,action=drop
删除所有交换机的所有流表:dpctl del-flows
删除所有交换机的特定流表:dpctl del-flows in_port=3
删除某个交换机的流表:sh ovs-ofctl del-flows s1 in_port=3
配置测试
在 ryu-manager **.py
这个命令中,**.py
表示一个 Ryu 应用程序的 Python 脚本文件。这个文件包含了定义网络行为的逻辑,比如如何处理网络流量、如何实现路由等。当你执行这个命令时,ryu-manager
将加载并运行指定的 Python 脚本
mn
是 Mininet 的命令行工具,--controller=remote
指定控制器运行在远程模式,这意味着 Mininet 会尝试连接到一个运行在本机或其他服务器上的控制器。
通过这个界面,用户可以进一步配置网络、运行测试、模拟网络场景等。如果配置了外部控制器,比如使用了 ryu-manager
运行了 Ryu 应用程序,那么 Mininet 中的交换机会尝试与该控制器连接并按照控制器的指令转发网络流量。6653是OpenFlow 控制器的标准端口。
mininet负责构造网络拓扑结构,ryu负责进行openflow表控制
网络搭建
视频例子:搭建如下网络
使用miniedit可视化搭建
miniedit.py在/mininet/mininet/examples下
打开miniedit报找不到python解决方法
界面介绍
edit-prefence
这个界面是 Mininet 的配置对话框,其中包含了多个配置选项:
- IP Base: 这是用于自动分配给 Mininet 网络中的设备(如主机和控制器)的 IP 地址的基础。
10.0.0.0/8
表示使用10.0.0.0
到10.255.255.255
这个范围的 IP 地址,子网掩码为 8 位,这意味着网络前缀是前 8 位,也就是10.x.x.x
- Default Terminal: 这里指定了 Mininet 启动主机终端时使用的默认终端仿真器。例如,
xterm
、gnome-terminal
或konsole
等。 - Start CLI: 这个复选框如果被选中,Mininet 会在启动网络后自动启动命令行界面(CLI)。
- Default Switch: 这里指定了 Mininet 使用的默认交换机类型。
Open vSwitch Kernel Mode
表示使用 Open vSwitch 的内核模式运行交换机。
在 Open vSwitch 部分: - OpenFlow 1.0 - 1.3: 这些复选框允许你选择 Open vSwitch 支持的 OpenFlow 协议的不同版本。
- dpctl port: 这个输入框用于指定与 Open vSwitch 交互的
dpctl
工具的端口号。
在 sFlow Profile for Open vSwitch 部分: - Target: 指定接收 sFlow 采样数据的收集器地址和端口。
- Sampling: 设置每多少个包进行一次采样。
- Header: 指定每个采样数据包的最大字节数。
- Polling: 设置多久进行一次流量计数器的轮询(以秒为单位)。
在 NetFlow Profile for Open vSwitch 部分: - Target: 指定接收 NetFlow 数据的收集器地址和端口。
- Active Timeout: 设置在活动流结束之前,多长时间发送一次 NetFlow 记录。
- Add ID to Interface: 如果选中,会在接口名称中添加标识符,用以区分不同的流量采样数据。
如图修改
控制器属性
类型设置为远程,这里使用ryu的控制器
交换机属性
设置十六位DPID和switch type
主机属性
设置ip
使用python搭建
from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call
def myNetwork():
net = Mininet( topo=None,
build=False,
ipBase='10.0.0.0/8')
info( '*** Adding controller\n' )
c0=net.addController(name='c0',
controller=RemoteController,
ip='127.0.0.1',
protocol='tcp',
port=6633)
info( '*** Add switches\n')
s1 = net.addSwitch('s1', cls=OVSKernelSwitch, dpid='0000000000000001')
s2 = net.addSwitch('s2', cls=OVSKernelSwitch, dpid='0000000000000002')
s3 = net.addSwitch('s3', cls=OVSKernelSwitch, dpid='0000000000000003')
info( '*** Add hosts\n')
h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None)
h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)
h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)
h5 = net.addHost('h5', cls=Host, ip='10.0.0.5', defaultRoute=None)
h6 = net.addHost('h6', cls=Host, ip='10.0.0.6', defaultRoute=None)
info( '*** Add links\n')
net.addLink(s1, h1)
net.addLink(h2, s1)
net.addLink(s2, h3)
net.addLink(h4, s2)
net.addLink(h5, s3)
net.addLink(s3, h6)
net.addLink(s1, s2)
net.addLink(s2, s3)
info( '*** Starting network\n')
net.build()
info( '*** Starting controllers\n')
for controller in net.controllers:
controller.start()
info( '*** Starting switches\n')
net.get('s1').start([c0])
net.get('s2').start([c0])
net.get('s3').start([c0])
info( '*** Post configure switches and hosts\n')
CLI(net)
net.stop()
if __name__ == '__main__':
setLogLevel( 'info' )
myNetwork()
实验过程
-
安装vmware,创建ubuntu虚拟机,配置相关环境
经过验证,环境配置成功。 -
使用miniedit根据拓扑图连接配置
-
启动ryu-manager
-
运行拓扑,测试全部连通。
-
查看ryu下的包状态
-
使用net指令查看端口连接情况,每个设备名称后的
-ethX
表示该设备的以太网接口,其中 X 是接口编号。
-
在拓扑图上添加交换机端口号如下
-
在没有主机发送数据包的情况下,输入dpctl dump-flows查看交换机的流表信息。可以看到流表还是空的。
-
pingall后再次输入dpctl dump-flows查看交换机的流表信息。交换机将pingall操作中主机之间的通信过程进行了转发,然后记录在了流表信息中。
-
使用dpctl del-flows清除流表信息
-
添加两条规则,让走端口1输入的都走2输出,走2输入的都走1输出。查看流表信息。
-
查看连通性,根据拓扑图的端口来看,应该分别只有h1,h2连通,h3,h4连通,h5,h6连通。验证后也确实如此。
-
删除所有输入端口为1的规则
-
删除所有规则。此时和视频出现差错,视频重新全部ping通,但我全都无法ping通。
-
检查操作后发现之前重启的ryu使用了example_switch_13,没有正确使用simple_switch。更换成正确的应用后可以连通。
-
再次尝试,对交换机S3进行如下配置
sh ovs-ofctl add-flow s3 priority=40001,ip,in_port=3,nw_src=10.0.0.1,nw_dst=10.0.0.6,actions=drop
sh ovs-ofctl add-flow s3 priority=40001,ip,in_port=3,nw_src=10.0.0.4,nw_dst=10.0.0.5,actions=drop -
查看流表并进行连通性检查。根据规则,IP源地址10.0.0.1发送到IP目的地址为10.0.0.6的主机的数据包被丢弃,IP源地址10.0.0.4发送到IP目的地址10.0.0.5的数据包被丢弃。所以h1无法与h6连通,h4无法与h5连通。
-
重置后再次定义规则,凡是来自输入端口2的数据全都丢弃。
dpctl add-flow in_port=2,action=drop
-
pingall验证,结果正确,只有1端口输入输出的才能连通。
-
教学视频学习完毕,自己构建一套拓扑图和流表。先使用miniedit绘制拓扑图。
-
启动,记录一下端口连接情况,添加在拓扑图上。
-
使用python构建代码
from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call
def myNetwork():
net = Mininet( topo=None,
build=False,
ipBase='10.0.0.0/8')
info( '*** Adding controller\n' )
c0=net.addController(name='c0',
controller=RemoteController,
ip='127.0.0.1',
protocol='tcp',
port=6633)
info( '*** Add switches\n')
s1 = net.addSwitch('s1', cls=OVSKernelSwitch, dpid='0000000000000001')
s2 = net.addSwitch('s2', cls=OVSKernelSwitch, dpid='0000000000000002')
s3 = net.addSwitch('s3', cls=OVSKernelSwitch, dpid='0000000000000003')
s4 = net.addSwitch('s4', cls=OVSKernelSwitch, dpid='0000000000000004')
s5 = net.addSwitch('s5', cls=OVSKernelSwitch, dpid='0000000000000005')
s6 = net.addSwitch('s6', cls=OVSKernelSwitch, dpid='0000000000000006')
info( '*** Add hosts\n')
h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None)
h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)
h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)
h5 = net.addHost('h5', cls=Host, ip='10.0.0.5', defaultRoute=None)
h6 = net.addHost('h6', cls=Host, ip='10.0.0.6', defaultRoute=None)
h7 = net.addHost('h7', cls=Host, ip='10.0.0.7', defaultRoute=None)
h8 = net.addHost('h8', cls=Host, ip='10.0.0.8', defaultRoute=None)
h9 = net.addHost('h9', cls=Host, ip='10.0.0.9', defaultRoute=None)
h10 = net.addHost('h10', cls=Host, ip='10.0.0.10', defaultRoute=None)
h11 = net.addHost('h11', cls=Host, ip='10.0.0.11', defaultRoute=None)
h12 = net.addHost('h12', cls=Host, ip='10.0.0.12', defaultRoute=None)
info( '*** Add links\n')
net.addLink(h1, s1)
net.addLink(h2, s1)
net.addLink(h3, s2)
net.addLink(h4, s2)
net.addLink(h5, s3)
net.addLink(h6, s3)
net.addLink(h7, s4)
net.addLink(h8, s4)
net.addLink(h9, s5)
net.addLink(h10, s5)
net.addLink(h11, s6)
net.addLink(h12, s6)
net.addLink(s1, s2)
net.addLink(s2, s3)
net.addLink(s3, s4)
net.addLink(s4, s5)
net.addLink(s5, s6)
info( '*** Starting network\n')
net.build()
info( '*** Starting controllers\n')
for controller in net.controllers:
controller.start()
info( '*** Starting switches\n')
net.get('s1').start([c0])
net.get('s2').start([c0])
net.get('s3').start([c0])
net.get('s4').start([c0])
net.get('s5').start([c0])
net.get('s6').start([c0])
info( '*** Post configure switches and hosts\n')
CLI(net)
net.stop()
if __name__ == '__main__':
setLogLevel( 'info' )
myNetwork()
- 规定h1,h2,h3禁止访问h10,h11,h12,h10,h11,h12也禁止访问h1,h2,h3。这两端的各三台主机都与中间的h4,h5,h6,h7,h8,h9互通。
- 编写控制命令并输入,检查流表
# 阻止 h1, h2, h3 与 h10, h11, h12 通信
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.1,nw_dst=10.0.0.10,actions=drop
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.1,nw_dst=10.0.0.11,actions=drop
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.1,nw_dst=10.0.0.12,actions=drop
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.2,nw_dst=10.0.0.10,actions=drop
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.2,nw_dst=10.0.0.11,actions=drop
sh ovs-ofctl add-flow s1 ip,nw_src=10.0.0.2,nw_dst=10.0.0.12,actions=drop
sh ovs-ofctl add-flow s2 ip,nw_src=10.0.0.3,nw_dst=10.0.0.10,actions=drop
sh ovs-ofctl add-flow s2 ip,nw_src=10.0.0.3,nw_dst=10.0.0.11,actions=drop
sh ovs-ofctl add-flow s2 ip,nw_src=10.0.0.3,nw_dst=10.0.0.12,actions=drop
# 阻止 h10, h11, h12 与 h1, h2, h3 通信
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.10,nw_dst=10.0.0.1,actions=drop
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.10,nw_dst=10.0.0.2,actions=drop
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.10,nw_dst=10.0.0.3,actions=drop
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.11,nw_dst=10.0.0.1,actions=drop
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.11,nw_dst=10.0.0.2,actions=drop
sh ovs-ofctl add-flow s5 ip,nw_src=10.0.0.11,nw_dst=10.0.0.3,actions=drop
sh ovs-ofctl add-flow s6 ip,nw_src=10.0.0.12,nw_dst=10.0.0.1,actions=drop
sh ovs-ofctl add-flow s6 ip,nw_src=10.0.0.12,nw_dst=10.0.0.2,actions=drop
sh ovs-ofctl add-flow s6 ip,nw_src=10.0.0.12,nw_dst=10.0.0.3,actions=drop
# 默认允许其他流量
sh ovs-ofctl add-flow s1 priority=0,actions=normal
sh ovs-ofctl add-flow s2 priority=0,actions=normal
sh ovs-ofctl add-flow s3 priority=0,actions=normal
sh ovs-ofctl add-flow s4 priority=0,actions=normal
sh ovs-ofctl add-flow s5 priority=0,actions=normal
sh ovs-ofctl add-flow s6 priority=0,actions=normal
25. pingall进行连通性测试,检查结果
结果正确,h1,h2,h3和h10,h11,h12无法互通,其他都互通。
思考题
1.Openflow如何实现流表控制?其工作原理是什么?
OpenFlow通过向支持该协议的交换机内部的流表中添加、删除或修改流表项来实现流表控制。交换机根据流表中的规则来处理网络流量,其中每个规则定义了一组匹配标准和一组相应的动作。当数据包到达交换机时,交换机会按照优先级顺序检查流表中的规则,直到找到匹配的规则为止,然后根据该规则执行相应的动作。
2.谈谈你觉得Openflow有何应用场景?
Openflow适合于需要高度可编程性和灵活性的环境。例如在数据中心中,OpenFlow可以实现精细化的流量管理,从而优化资源利用率并进行动态负载均衡。Openflow还可以对于网络进行划分,将不同的区域进行分割。
3.你觉得SDN网络对于当前计算机网络的发展的创新性在哪?
SDN网络的创新性在于它彻底改变了传统网络的架构,通过将控制平面从数据平面中分离出来,实现了更加集中和灵活的网络管理。这种架构转变使得网络策略能够快速响应业务需求的变化,通过软件定义来适应网络环境的变化,而不是依赖硬件的物理配置。
4.动手进行实践,自己进行网络拓扑创建(可视化界面创建或者使用python脚本
创建),然后对于你所构建的网络拓扑进行分析。
5.动手构建Openflow流表并进行配置,阐述你的流表设置的匹配和动作的过程。