Mininet Python - 对自定义拓扑中的其他主机执行 ping 操作时出现问题

Mininet Python - Issues With Pinging Other Hosts Within Custom Topology

信息
主机OS: Windows 10
首次尝试访客 OS:Mininet-VM
第二次尝试来宾 OS:Ubuntu(VM)
虚拟机软件:Virtual Box

库:Mininet Python API

问题
美好的一天,

使用 Mininet 时,我的自定义拓扑出现一些问题。

最初,我使用了 Mininet 推荐的 Mininet-VM,它适用于默认命令生成的拓扑结构(即:线性、树形、反向等)。

然而,当我希望 运行 我自己的拓扑时,我无法 ping 任何其他主机(见下面的代码)。

命令:

  1. "sudo python3 custom_topology.py
  2. Mininet>pingall

我认为这可能是 Mininet-VM 本身的图像问题,所以我尝试 运行在 Ubuntu(当然安装了 Mininet)和 [=97] 中使用相同的脚本=]进入同一个问题。

无论如何,我查看了 Whosebug(下面的参考资料),none 的解决方案对我有用。尽管有些人建议使用 POX 控制器而不是默认控制器,但我对它的工作原理和实现方式一无所知运行。

如有任何帮助,我们将不胜感激。

干杯!

结果

拓扑图

中级API代码

from mininet.net import Mininet
from mininet.cli import CLI
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
from mininet.node import Controller

net = Mininet(controller=Controller, link=TCLink)

h1 = net.addHost('h1')
h2 = net.addHost('h2')
h3 = net.addHost('h3')
h4 = net.addHost('h4')
h5 = net.addHost('h5')
h6 = net.addHost('h6')
h7 = net.addHost('h7')
h8 = net.addHost('h8')

s1 = net.addSwitch('s1')
s2 = net.addSwitch('s2')
s3 = net.addSwitch('s3')
s4 = net.addSwitch('s4')
s5 = net.addSwitch('s5')
s6 = net.addSwitch('s6')

c0 = net.addController('c0')

net.addLink(h1, s1)
net.addLink(h2, s2)
net.addLink(h3, s3)
net.addLink(h4, s4)
net.addLink(h5, s4)
net.addLink(h6, s5)
net.addLink(h7, s5)
net.addLink(h8, s6)

net.addLink(s1, s2, bw=10,  delay='0ms')
net.addLink(s2, s3, bw=10,  delay='0ms')
net.addLink(s3, s4, bw=100, delay='5ms')
net.addLink(s4, s5, bw=100, delay='5ms')
net.addLink(s5, s6, bw=100, delay='0ms')
net.addLink(s6, s1, bw=10,  delay='0ms')

net.start()
print( "Dumping host connections" )
dumpNodeConnections( net.hosts )
dumpNodeConnections( net.switches )
CLI(net)
net.stop()

参考文献

  1. Whosebug Post 2
  2. Whosebug Post 3
  3. Official Mininet Website

问题:Mininet 中的默认控制器无法处理拓扑中的循环。要解决此问题,我们需要使用 POX 控制器和开关的一些额外配置。

您将需要 运行 两个终端:

  • 一个终端将运行POX控制器作为./pox.pyforwarding.hub
  • 另一个终端将运行您的自定义拓扑python脚本

请查看参考文献#5 和#6,它们展示了一些不错的示例

代码解决方案

from mininet.net import Mininet
from mininet.node import Controller, RemoteController, 
OVSKernelSwitch, UserSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.link import Link, TCLink


def topology():

  "Create a network."
  net = Mininet( controller=RemoteController, link=TCLink, 
  switch=OVSKernelSwitch )

  print("*** Creating nodes")
  h1 = net.addHost( 'h1', mac='00:00:00:00:00:01', ip='10.0.0.1/24' )
  h2 = net.addHost( 'h2', mac='00:00:00:00:00:02', ip='10.0.0.2/24' )
  h3 = net.addHost( 'h3', mac='00:00:00:00:00:03', ip='10.0.0.3/24' )
  h4 = net.addHost( 'h4', mac='00:00:00:00:00:04', ip='10.0.0.4/24' )
  h5 = net.addHost( 'h5', mac='00:00:00:00:00:05', ip='10.0.0.5/24' )
  h6 = net.addHost( 'h6', mac='00:00:00:00:00:06', ip='10.0.0.6/24' )
  h7 = net.addHost( 'h7', mac='00:00:00:00:00:07', ip='10.0.0.7/24' )
  h8 = net.addHost( 'h8', mac='00:00:00:00:00:08', ip='10.0.0.8/24' )

  s1 = net.addSwitch( 's1' )
  s2 = net.addSwitch( 's2' )
  s3 = net.addSwitch( 's3' )
  s4 = net.addSwitch( 's4' )
  s5 = net.addSwitch( 's5' )
  s6 = net.addSwitch( 's6' )

  c7 = net.addController( 'c7', controller=RemoteController, 
  ip='127.0.0.1', port=6633 )

  print("*** Creating links")
  net.addLink( h1, s1 )
  net.addLink( h2, s2 )
  net.addLink( h3, s3 )
  net.addLink( h4, s4 )
  net.addLink( h5, s4 )
  net.addLink( h6, s5 )
  net.addLink( h7, s5 )
  net.addLink( h8, s6 )

  net.addLink( s1, s2, cls=TCLink, bw=10               )
  net.addLink( s2, s3, cls=TCLink, bw=10               )
  net.addLink( s3, s4, cls=TCLink, bw=100, delay='5ms' )
  net.addLink( s4, s5, cls=TCLink, bw=100, delay='5ms' )
  net.addLink( s5, s6, cls=TCLink, bw=100              )
  net.addLink( s6, s1, cls=TCLink, bw=10               ) 

  print("*** Starting network")
  net.build()
  c7.start()
  s1.start( [c7] )
  s2.start( [c7] )
  s3.start( [c7] )
  s4.start( [c7] )
  s5.start( [c7] )
  s6.start( [c7] )

  # Configuring switches
  s1.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
  s1.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.1.0/24,actions=output:1")
  s1.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.2.0/24,actions=output:2")
  s1.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.3.0/24,actions=output:3")
  s1.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.4.0/24,actions=output:3")
  s1.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.5.0/24,actions=output:3")
  s1.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.6.0/24,actions=output:2")
  s1.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.7.0/24,actions=output:2")
  s1.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.8.0/24,actions=output:2")

  s2.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
  s2.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.1.0/24,actions=output:3")
  s2.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.2.0/24,actions=output:1")
  s2.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.3.0/24,actions=output:2")
  s2.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.4.0/24,actions=output:2")
  s2.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.5.0/24,actions=output:2")
  s2.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.6.0/24,actions=output:3")
  s2.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.7.0/24,actions=output:3")
  s2.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.8.0/24,actions=output:3")

  s3.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
  s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.1.0/24,actions=output:3")
  s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.2.0/24,actions=output:3")
  s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.3.0/24,actions=output:1")
  s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.4.0/24,actions=output:2")
  s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.5.0/24,actions=output:2")
  s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.6.0/24,actions=output:2")
  s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.7.0/24,actions=output:2")
  s3.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.8.0/24,actions=output:3")

  s4.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
  s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.1.0/24,actions=output:2")
  s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.2.0/24,actions=output:2")
  s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.3.0/24,actions=output:2")
  s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.4.0/24,actions=output:1")
  s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.5.0/24,actions=output:4")
  s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.6.0/24,actions=output:3")
  s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.7.0/24,actions=output:3")
  s4.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.8.0/24,actions=output:3")

  s5.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
  s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.1.0/24,actions=output:3")
  s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.2.0/24,actions=output:3")
  s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.3.0/24,actions=output:3")
  s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.4.0/24,actions=output:2")
  s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.5.0/24,actions=output:2")
  s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.6.0/24,actions=output:1")
  s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.7.0/24,actions=output:4")
  s5.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.8.0/24,actions=output:3")

  s6.cmd("sh ovs-ofctl add-flow s1 priority=1,arp,actions=flood")
  s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.1.0/24,actions=output:3")
  s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.2.0/24,actions=output:3")
  s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.3.0/24,actions=output:3")
  s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.4.0/24,actions=output:2")
  s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.5.0/24,actions=output:2")
  s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.6.0/24,actions=output:2")
  s6.cmd("ovs-ofctl add-flow s1 priority=10,ip,nw_dst=10.0.7.0/24,actions=output:2")
  s6.cmd("ovs-ofctl add-flow s1 
  priority=10,ip,nw_dst=10.0.8.0/24,actions=output:1")

  print("*** Running CLI")
  CLI( net )

  print("*** Stopping network")
  net.stop()


if __name__ == '__main__':
  setLogLevel( 'info' )
  topology()

参考资料

  1. Dr. Chih-Heng Ke's Post #1
  2. Dr. Chih-Heng Ke's Post #2