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

如何在Mininet中实现3台路由器分别连接对应主机的组网

Mininet多路由器组网问题修复与优化方案

现有代码问题

  • 路由器互联缺失:仅配置了r1与r2的互联链路,r3未与其他路由器建立物理连接,也没有配置互联IP,无法参与网段转发
  • 主机配置错误:规划中属于r3的主机d3,当前IP被配置为r2所属的10.1.0.0/24网段,且错误连接到s2交换机,未关联到r3对应的s3
  • 路由规则不全:仅添加了r1与r2之间的双向路由,没有配置r3到其他网段、其他网段到r3的路由条目
  • 冗余链路无配置:r1和r2之间的第二条互联链路(10.101.0.0/24网段)没有配置对应的路由规则,实际不会生效

3台路由器场景修正代码

#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import Node
from mininet.log import setLogLevel, info
from mininet.cli import CLI


class LinuxRouter(Node):
    def config(self, **params):
        super(LinuxRouter, self).config(**params)
        self.cmd('sysctl net.ipv4.ip_forward=1')

    def terminate(self):
        self.cmd('sysctl net.ipv4.ip_forward=0')
        super(LinuxRouter, self).terminate()


class NetworkTopo(Topo):
    def build(self, **_opts):
        # 新增3台路由器,各对应一个业务网段
        r1 = self.addHost('r1', cls=LinuxRouter, ip='10.0.0.1/24')
        r2 = self.addHost('r2', cls=LinuxRouter, ip='10.1.0.1/24')
        r3 = self.addHost('r3', cls=LinuxRouter, ip='10.2.0.1/24')

        # 每台路由器对应1台接入交换机
        s1 = self.addSwitch('s1')
        s2 = self.addSwitch('s2')
        s3 = self.addSwitch('s3')

        # 路由器和对应交换机互联,配置业务网段网关IP
        self.addLink(s1, r1, intfName2='r1-eth1', params2={'ip': '10.0.0.1/24'})
        self.addLink(s2, r2, intfName2='r2-eth1', params2={'ip': '10.1.0.1/24'})
        self.addLink(s3, r3, intfName2='r3-eth1', params2={'ip': '10.2.0.1/24'})
        
        # 路由器之间全互联,每个互联链路单独占一个网段
        self.addLink(r1, r2, intfName1='r1-eth2', intfName2='r2-eth2',
                     params1={'ip': '10.100.0.1/24'}, params2={'ip': '10.100.0.2/24'})
        self.addLink(r1, r3, intfName1='r1-eth3', intfName2='r3-eth2',
                     params1={'ip': '10.100.1.1/24'}, params2={'ip': '10.100.1.2/24'})
        self.addLink(r2, r3, intfName1='r2-eth3', intfName2='r3-eth3',
                     params1={'ip': '10.100.2.1/24'}, params2={'ip': '10.100.2.2/24'})
     
        # 新增主机,各归属对应路由器的业务网段,默认网关指向对应路由器
        d1 = self.addHost(name='d1', ip='10.0.0.251/24', defaultRoute='via 10.0.0.1')
        d2 = self.addHost(name='d2', ip='10.1.0.252/24', defaultRoute='via 10.1.0.1')
        d3 = self.addHost(name='d3', ip='10.2.0.253/24', defaultRoute='via 10.2.0.1')

        # 主机连接到对应接入交换机
        self.addLink(d1, s1)
        self.addLink(d2, s2)
        self.addLink(d3, s3)


def run():
    topo = NetworkTopo()
    net = Mininet(topo=topo)
    net.start()

    # 配置所有静态路由规则
    # r1路由:到r2业务网段走r1-r2互联,到r3业务网段走r1-r3互联
    info(net['r1'].cmd("ip route add 10.1.0.0/24 via 10.100.0.2 dev r1-eth2"))
    info(net['r1'].cmd("ip route add 10.2.0.0/24 via 10.100.1.2 dev r1-eth3"))
    # r2路由:到r1业务网段走r1-r2互联,到r3业务网段走r2-r3互联
    info(net['r2'].cmd("ip route add 10.0.0.0/24 via 10.100.0.1 dev r2-eth2"))
    info(net['r2'].cmd("ip route add 10.2.0.0/24 via 10.100.2.2 dev r2-eth3"))
    # r3路由:到r1业务网段走r1-r3互联,到r2业务网段走r2-r3互联
    info(net['r3'].cmd("ip route add 10.0.0.0/24 via 10.100.1.1 dev r3-eth2"))
    info(net['r3'].cmd("ip route add 10.1.0.0/24 via 10.100.2.1 dev r3-eth3"))

    CLI(net)
    net.stop()


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

扩展到7台路由器的优化方案

  • 动态路由替代静态路由:在Linux路由器实例中安装启动FRR/Quagga路由组件,开启OSPF或RIP动态路由协议,路由器会自动同步网段信息、生成路由表,无需手动逐条配置,适合3台以上的中大规模组网
  • 静态路由批量生成:如果需要保留静态路由方案,可以将所有路由器的业务网段、互联对、互联IP提前存入字典或列表,通过循环批量生成路由规则,避免手动编写重复代码、减少配置错误
  • 网段规划标准化:提前将业务网段、路由器互联网段按规则编号,比如业务网段用10.{路由器ID}.0.0/24,rX和rY的互联网段用10.200.{min(X,Y)*10+max(X,Y)}.0/24,后续新增路由器时直接按规则分配IP即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:54:03