如何在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
相关产品推荐
相关产品推荐

