如何用Mininet创建A<->B<->C三节点拓扑,使流量始终经B转发
实现Mininet三节点拓扑并强制A-C流量经B转发
方案思路
要实现A与C的流量必须通过B转发,最直接的方式是构建链式拓扑(A-B-C)或星型拓扑(A、C均连接到B),物理上切断A与C的直接链路,同时确保节点路由配置默认走中间节点B。以下以链式拓扑为例提供Python实现代码。
完整代码实现
from mininet.net import Mininet from mininet.node import Controller, OVSKernelSwitch from mininet.cli import CLI from mininet.log import setLogLevel, info def createTopology(): # 初始化网络,使用OVS交换机和默认控制器 net = Mininet(controller=Controller, switch=OVSKernelSwitch) info('*** 添加控制器\n') net.addController('c0') info('*** 添加节点\n') # 创建三个主机节点A、B、C A = net.addHost('A', ip='10.0.0.1/24') B = net.addHost('B', ip='10.0.0.2/24') C = net.addHost('C', ip='10.0.0.3/24') info('*** 添加交换机\n') # 创建两个交换机,分别连接A-B和B-C s1 = net.addSwitch('s1') s2 = net.addSwitch('s2') info('*** 添加链路\n') # 构建A-s1-B-s2-C的链式连接,确保A与C无直接链路 net.addLink(A, s1) net.addLink(s1, B) net.addLink(B, s2) net.addLink(s2, C) info('*** 启动网络\n') net.start() info('*** 配置静态路由(强制流量走B)\n') A.cmd('ip route add 10.0.0.3/24 via 10.0.0.2') C.cmd('ip route add 10.0.0.1/24 via 10.0.0.2') info('*** 进入命令行界面\n') CLI(net) info('*** 停止网络\n') net.stop() if __name__ == '__main__': setLogLevel('info') createTopology()
关键说明
- 拓扑结构:通过交换机将A与B、B与C分别连接,A和C之间无直接链路,所有流量必须经过B节点转发。
- 路由配置:手动添加静态路由,强制A访问C时将数据包发往B,C访问A时同理,进一步确保流量路径。
- 验证方法:
- 启动网络后,在CLI中输入
A ping C,验证连通性 - 输入
A traceroute C,可看到数据包路径为A -> B -> C,确认流量经过B节点
- 启动网络后,在CLI中输入
星型拓扑替代方案
若想用星型拓扑,只需将代码中的交换机和链路部分修改为:
# 修改交换机和链路部分 s1 = net.addSwitch('s1') net.addLink(A, s1) net.addLink(B, s1) net.addLink(C, s1)
这种情况下,需保留静态路由配置,强制A、C的流量通过B转发,避免交换机直接转发A与C的数据包。
内容的提问来源于stack exchange,提问作者D. Wang
相关产品推荐
相关产品推荐

