Mininet脚本无法静态设置主机MAC地址问题求助
Mininet静态设置主机MAC地址不生效的解决办法
问题现象
通过自定义Topo类设置主机MAC地址后,实际网卡并未使用指定值:
自定义Topo脚本
from mininet.net import Mininet from mininet.node import Node from mininet.topo import Topo class CustomTopo(Topo): def build(self): # 静态分配主机MAC地址 h1 = self.addHost('h1', mac='D3:13:1C:1B:76:A0') h2 = self.addHost('h2', mac='8B:94:91:62:F1:65') s1 = self.addSwitch('s1') s2 = self.addSwitch('s2') self.addLink(s1,s2) self.addLink(h1,s1) self.addLink(h2,s2) topo = CustomTopo() topos = { 'customtopo': ( lambda: CustomTopo() ) }
验证输出
执行以下命令启动并验证:
sudo mn -c sudo mn --custom script.py --topo customtopo --controller=remote
在Mininet CLI中执行h2 ifconfig,发现eth0的MAC为自动生成值而非指定的8B:94:91:62:F1:65:
h2-eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.2 netmask 255.0.0.0 broadcast 10.255.255.255 inet6 fe80::f4da:8dff:fe8d:c696 prefixlen 64 scopeid 0x20<link> ether f6:da:8d:8d:c6:96 txqueuelen 1000 (Ethernet) RX packets 40 bytes 5598 (5.5 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 676 (676.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
问题原因
当使用--custom参数加载Topo类启动Mininet时,Topo中addHost设置的mac参数仅作为主机节点的属性存储,不会自动应用到主机的网络接口上。Mininet默认会为每个接口自动生成MAC地址,覆盖了Topo中的配置。
解决方案
方案1:在添加链路时指定接口MAC
修改Topo类的build方法,在addLink时通过params1参数为主机端的接口指定MAC地址:
from mininet.net import Mininet from mininet.topo import Topo class CustomTopo(Topo): def build(self): h1 = self.addHost('h1') h2 = self.addHost('h2') s1 = self.addSwitch('s1') s2 = self.addSwitch('s2') self.addLink(s1, s2) # 为h1的eth0接口指定MAC self.addLink(h1, s1, params1={'mac': 'D3:13:1C:1B:76:A0'}) # 为h2的eth0接口指定MAC self.addLink(h2, s2, params1={'mac': '8B:94:91:62:F1:65'}) topo = CustomTopo() topos = { 'customtopo': ( lambda: CustomTopo() ) }
方案2:直接使用Mininet实例化方式
不通过Topo类,直接创建Mininet实例并添加主机,此时addHost的mac参数会直接应用到接口:
from mininet.net import Mininet from mininet.cli import CLI from mininet.node import Controller net = Mininet() h1 = net.addHost('h1', mac='D3:13:1C:1B:76:A0') h2 = net.addHost('h2', mac='8B:94:91:62:F1:65') s1 = net.addSwitch('s1') s2 = net.addSwitch('s2') c0 = net.addController('c0') net.addLink(s1, s2) net.addLink(h1, s1) net.addLink(h2, s2) net.start() CLI(net) net.stop()
验证方法
重新启动Mininet后,在CLI中执行h1 ifconfig和h2 ifconfig,查看ether字段是否为指定的MAC地址即可确认配置生效。
内容的提问来源于stack exchange,提问作者unusualsuspect
相关产品推荐
相关产品推荐

