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 查看网络接口信息
查看流表: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.py在/mininet/mininet/examples下
打开miniedit报找不到python解决方法
这个界面是 Mininet 的配置对话框,其中包含了多个配置选项:
10.0.0.0/8
表示使用 10.0.0.0
到 10.255.255.255
这个范围的 IP 地址,子网掩码为 8 位,这意味着网络前缀是前 8 位,也就是 10.x.x.x
xterm
、gnome-terminal
或 konsole
等。Open vSwitch Kernel Mode
表示使用 Open vSwitch 的内核模式运行交换机。dpctl
工具的端口号。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()
pingall后再次输入dpctl dump-flows查看交换机的流表信息。交换机将pingall操作中主机之间的通信过程进行了转发,然后记录在了流表信息中。
检查操作后发现之前重启的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
使用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 通信
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流表并进行配置,阐述你的流表设置的匹配和动作的过程。