Mininet中自定义POX控制器与默认控制器配合的通信故障排查
Mininet多控制器拓扑Ping不通问题排查与修复
核心问题分析
- 控制器端口冲突:两个控制器
c1和c2都使用6633端口,导致第二个控制器无法启动(端口被占用),交换机s2无法连接到有效控制器。 - 作用域错误:
CustomSwitch类的start方法引用了函数内部定义的cmap变量,触发NameError,导致交换机启动失败。 - 跨网段+跨控制器转发能力缺失:
- 主机
h1和h2分属不同网段,forwarding.l2_learning仅支持同网段二层转发,无法处理跨网段三层路由。 - 两个交换机连接不同控制器,默认情况下控制器无协同机制,无法传递跨交换机的转发/路由信息。
- 主机
- 默认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()
额外说明
- 多控制器协同:若必须保留多控制器架构,需让POX控制器间交换路由信息,可使用
openflow.discovery组件自动发现拓扑,配合forwarding.l3_learning的分布式扩展。 - 同网段测试:若仅需验证二层连通性,可将两台主机改为同一网段(如10.0.10.0/24),使用
forwarding.l2_learning组件即可,仍需解决端口冲突和作用域问题。 - 问题排查:若ping仍不通,可在Mininet CLI中用
dpctl dump-flows查看交换机流规则,或查看POX控制器日志(默认在POX目录的log文件夹)排查报错。
内容的提问来源于stack exchange,提问作者Mouloudous
相关产品推荐
相关产品推荐

