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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:10:45