Mininet Python - 在自定义拓扑中 Ping 其他主机的问题

问题描述 投票:0回答:1

信息
主机操作系统:Windows 10
首次尝试来宾操作系统:Mininet-VM
第二次尝试访客操作系统: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)并遇到了同样的问题。

无论如何,我查看了 stackoverflow(下面的参考文献),但没有一个解决方案对我有用。虽然,有些人建议使用 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. StackOverflow 帖子 1
  2. StackOverflow 帖子 2
  3. StackOverflow 帖子 3
  4. 迷你网官方网站
python networking network-programming mininet
1个回答
2
投票

问题: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. 博士。 Chih-Heng Ke 的帖子#1(链接不起作用)
  2. 博士。 Chih-Heng Ke 的帖子#2(链接不起作用)
© www.soinside.com 2019 - 2024. All rights reserved.