You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mininet中自定义POX控制器与默认控制器配合的通信故障排查

Mininet多控制器拓扑Ping不通问题排查与修复

核心问题分析

  1. 控制器端口冲突:两个控制器c1和c2都使用6633端口,导致第二个控制器无法启动(端口被占用),交换机s2无法连接到有效控制器。
  2. 作用域错误:CustomSwitch类的start方法引用了函数内部定义的cmap变量,触发NameError,导致交换机启动失败。
  3. 跨网段+跨控制器转发能力缺失:
    • 主机h1和h2分属不同网段,forwarding.l2_learning仅支持同网段二层转发,无法处理跨网段三层路由。
    • 两个交换机连接不同控制器,默认情况下控制器无协同机制,无法传递跨交换机的转发/路由信息。
  4. 默认Controller功能不足:Mininet默认Controller类运行的是simple_switch,仅支持基础二层转发,无三层路由能力。

修复方案

步骤1:解决端口冲突与作用域问题

  • 给两个控制器分配不同监听端口,避免端口占用。
  • 移除有问题的CustomSwitch类,直接在启动交换机时指定对应控制器,规避作用域错误。

步骤2:启用三层转发能力

将自定义POX控制器的组件替换为forwarding.l3_learning,支持跨网段三层路由转发;若需保留多控制器架构,需确保控制器间能交换路由信息(如使用POX分布式组件),最简单的测试方式是先让交换机连接同一L3控制器验证连通性。

修改后的完整代码

from mininet.log import setLogLevel, info
from mininet.net import Mininet
from mininet.cli import CLI
from mininet.node import Controller, OVSSwitch
from os import environ

# DO NOT MODIFY THIS PART 
POXDIR = environ['HOME'] + '/pox'

class CustomPOX(Controller):
    "Custom POX() subclass that loads L3 learning component"
    def __init__(self, name, cdir=POXDIR,
                 command='python pox.py',
                 cargs=('openflow.of_01 --port=%s '
                         'forwarding.l3_learning'),
                 **kwargs):
        Controller.__init__(self, name, cdir=cdir,
                             command=command,
                             cargs=cargs, **kwargs)

# THIS PART CAN BE CHANGED AND ADAPTED IF REQUIRED 
setLogLevel('info')

def multiControllerNet():
    "Create a network from semi-scratch with multiple controllers."
    # 给两个控制器分配不同端口,避免冲突
    c1 = CustomPOX('pox', ip='127.0.0.1', port=6633)
    c2 = CustomPOX('pox2', ip='127.0.0.1', port=6634)

    net = Mininet(switch=OVSSwitch, build=False, waitConnected=True)

    info("*** Creating controllers\n")
    for c in [c1, c2]:
        net.addController(c)

    info("*** Creating switches\n")
    s1 = net.addSwitch('s1')
    s2 = net.addSwitch('s2')

    info("*** Creating hosts\n")
    h1 = net.addHost('host1', mac='00:00:00:00:10:01', ip='10.0.10.1/24')
    h2 = net.addHost('host2', mac='00:00:00:00:20:01', ip='10.0.30.1/24')
    # 可选:给主机添加默认网关,POX的L3学习组件会自动处理路由
    # h1.cmd('ip route add default via 10.0.10.254')
    # h2.cmd('ip route add default via 10.0.30.254')

    info("*** Creating links\n")
    net.addLink(s1, h1)
    net.addLink(s2, h2)
    net.addLink(s1, s2)

    info("*** Starting network\n")
    net.build()
    c1.start()
    c2.start()
    # 直接指定交换机连接的控制器,规避作用域问题
    s1.start([c1])
    s2.start([c2])

    info("*** Testing network\n")
    net.pingAll()

    info("*** Running CLI\n")
    CLI(net)

    info("*** Stopping network\n")
    net.stop()

if __name__ == '__main__':
    setLogLevel('info')  # for CLI output
    multiControllerNet()

额外说明

  1. 多控制器协同:若必须保留多控制器架构,需让POX控制器间交换路由信息,可使用openflow.discovery组件自动发现拓扑,配合forwarding.l3_learning的分布式扩展。
  2. 同网段测试:若仅需验证二层连通性,可将两台主机改为同一网段(如10.0.10.0/24),使用forwarding.l2_learning组件即可,仍需解决端口冲突和作用域问题。
  3. 问题排查:若ping仍不通,可在Mininet CLI中用dpctl dump-flows查看交换机流规则,或查看POX控制器日志(默认在POX目录的log文件夹)排查报错。

内容的提问来源于stack exchange,提问作者Mouloudous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:10:32