ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

RouterOS多SSID一键切换:SSID/IP/MAC批量管理脚本实战

RouterOS多SSID一键切换:SSID/IP/MAC批量管理脚本实战 简介面向需要集中管理多台软路由无线设备的运维人员这套成品脚本聚焦多无线网络、多网络名称的批量切换需求可一键完成网络地址、物理地址与网络名称的更换支持一台设备拖带40台甚至更多终端适用于连锁门店、园区无线覆盖等场景。压缩包共7个文件含6个文本脚本和1个配置模板整体仅25KB十分轻量文本脚本区分单品牌、多品牌、单密码、多密码等组合配置模板用于快速引用默认参数用户只需将脚本粘贴到路由器脚本区运行即可自动生成配置省去逐台设置。属于成品代码而非半成品无需预先登录后台无线环境可直接生成多个品牌命名的网络名称有线环境可配合外接接入点使用并附简易说明方便新手部署。目前已有6371人学习下载是网络批量配置场景中实用的工具型资料。 做网络运维或者说批量设备管理的朋友应该都经历过这种场景手上一台RouterOS主控后面挂着几十个无线接入点每个点位要求输出不同的SSID、不同的IP网段隔一段时间还要整体换一套参数。我第一次接这种活的时候老老实实一台一台登设备手动改改到后面头都是大的不是漏了某台就是把某台的IP和另一台的网段写串了。后来把整个切换逻辑整理成脚本主设备上执行一次底下40口、100口设备全部按预定规则完成SSID、IP、MAC的一键切换时间从半天压缩到几分钟。这篇东西就是把我这个方案的设计思路、核心命令和踩过的坑完整拆出来给同样在折腾RouterOS多SSID批量管理的朋友一份可参考的模板。注意这里的ROS指的是MikroTik RouterOS不是机器人操作系统ROS别搞混了。1. 先搞懂多SSID一拖多在ROS里到底是怎么组网的1.1 一个射频口承载多个SSIDVAP虚拟AP机制RouterOS里做多SSID并不是说每个SSID都得配一块独立的无线网卡。MikroTik的无线驱动支持在同一块物理射频卡上创建多个虚拟AP也就是常说的VAP。物理接口作为master虚拟接口挂载上去每个虚拟接口可以独立设置自己的SSID、认证方式、加密策略甚至可以单独划到不同的VLAN里。底层原理其实不复杂WiFi的Beacon帧里可以携带多个SSID信息元素手机或电脑在扫描时能看到这些名字用户按SSID选择要接入的网络。射频介质是共享的所有SSID都跑在同一个信道和频宽上所以一个radio理论上可以挂出很多个VAP。但在实际项目里我不建议在一个射频上挂超过4到5个SSID。原因是Beacon帧会占用空口开销SSID数量越多无线的有效吞吐量掉得越明显终端一多延迟和丢包率都会上来。创建VAP的标准命令大概长这样/interface wireless add master-interfacewlan1 namevap-guest ssidGuest-Net security-profileguest-profile /interface wireless enable vap-guest这个机制是整个多SSID方案的地基。后面所有脚本操作本质上就是在操作这些虚拟接口。1.2 40口、100口的一拖多到底拖的是什么很多朋友看到一拖多40口100口第一反应是一个无线射频挂40个SSID。按上面的分析和实际性能表现真这么干网络基本就废了。在实际项目里40口、100口通常指的是两种典型拓扑。第一种是多AP的CAPsMAN集中管理架构。主控RouterOS开启CAPsMAN服务下挂几十个甚至上百个无线AP。所有AP通过二层网络注册到主控SSID、安全配置、VLAN全部由主控统一下发。这种场景下你只需要在主控上执行脚本AP端不需要任何操作SSID切换自动同步到全网所有AP。我实际维护过一套60多台AP的无线网用这种方式切换SSID整个拓扑的收敛时间也就一两分钟。第二种是x86软路由或CRS系列RouterOS一体机机内插多张无线网卡或者通过VLAN把不同SSID映射到不同网段每个出口对应一路独立业务。这里的口更多指的是有线出口或VLAN接口数量不是物理WiFi接口。比如一个40口设备可能意味着40个有线接口要按规则批量修改IP、MAC参数。不管是哪种拓扑脚本的核心处理逻辑一致定位要修改的对象集合按顺序批量下发参数再做结果验证。理解了这一点就不会被一拖多这个说法带偏。1.3 IP和MAC在批量切换中的角色分工IP层面的切换通常包含三块接口IP地址、DHCP地址池、DHCP租约。多SSID场景下一般一个SSID对应一个VLAN网段。比如Guest-Net落在192.168.88.0/24Staff-Net落在192.168.89.0/24切换IP就是把这一整组网段、网关、DHCP池整体替换。MAC层面的切换要分成两种情况看。一种是无线VAP接口的MACRouterOS默认会基于物理radio的MAC派生也允许手动指定。在一些按MAC做接入认证的无线环境里这种做法能方便地控制不同SSID的接入权限。另一种是有线接口的MAC通常用于设备替换时保持原MAC以继承上层交换机或认证服务器的绑定关系也用于多WAN场景下匹配运营商侧的绑定策略。这里必须提醒一句手动指定MAC时建议使用本地管理地址段也就是MAC第一字节的第二个十六进制字符为2、6、A或E的地址比如02:AA:BB:CC:DD:01。这样能有效避免和真实网卡厂商的MAC撞车防止二层网络里出现地址冲突。2. 一键切换脚本的原理拆解先搞清楚改什么、按什么顺序改2.1 SSID切换不是改个字符串那么简单RouterOS里改SSID最直接的方式是/interface wireless set [find where namevap-guest] ssidNewSSID-2024这个命令本身很简单但有个关键细节修改运行中的无线接口参数时驱动会触发一次接口重置所有连接到这个SSID的客户端会瞬间断开重连。如果在生产环境直接执行set终端侧会看到WiFi闪断部分老旧的设备甚至要手动重新连接。我习惯的做法是先把接口disable再set参数最后enable。禁用、修改、启用这个闭环看起来基础但它是整个一键切换脚本稳定性的基石。另一个容易忽略的问题是SSID重名。批量切换时如果新SSID与范围内已有SSID同名终端会在多个AP之间随机漫游表现出来就是明明连上了但获取不到IP。所以脚本里我会加一步预检切换前先把范围内所有无线接口扫描一遍确保没有同名SSID存在。2.2 IP切换接口地址、DHCP池、租约要一起动IP切换最容易踩的坑是只改接口地址DHCP池没跟着动。结果终端连上新SSID后拿到的还是旧网段的IP网关对不上上不了网。一个完整的IP切换至少包含四步修改接口IP地址对应命令是 /ip address set 或 add。修改DHCP地址池范围对应 /ip pool set。修改DHCP服务器与接口的绑定关系对应 /ip dhcp-server set。清理或更新DHCP租约对应 /ip dhcp-server lease remove。我在脚本里会把网段参数全部定义成变量方便批量替换:local oldSubnet 192.168.88.0/24 :local newSubnet 192.168.100.0/24 :local newGateway 192.168.100.1/24 :local newPool 192.168.100.10-192.168.100.200 /ip address set [find where address$oldSubnet] address$newGateway /ip pool set [find where namedhcp_pool] ranges$newPool执行顺序上有个细节要先改接口IP再改DHCP池最后清理租约。如果先清租约再改地址中间窗口期内终端无法获取地址在批量场景下会集中出现大量客户端掉线。2.3 MAC切换规则和连带影响RouterOS里改有线接口MAC的命令/interface ethernet set [find where nameether2] mac-address02:AA:BB:CC:DD:01改无线VAP接口的MAC命令/interface wireless set [find where namevap-guest] mac-address02:AA:BB:CC:DD:02MAC切换最大的坑是重复MAC。批量脚本如果用了固定模板比如每台都设成02:AA:BB:CC:DD:01二层广播域里交换机的MAC表会来回抖动网络时断时续。我一般用设备序号作为MAC末位比如第3台就是02:AA:BB:CC:DD:03保证全局唯一。另外改完MAC之后如果上层有DHCP或认证绑定务必确认新MAC是否在允许名单内。有些场景下切换MAC的目的就是要走另一组认证绑定没有问题但有时候只是想把统一参数刷下去结果认证没跟上终端就会一直卡在连接阶段。2.4 状态机设计关、改、启、验、滚一键脚本的核心状态机可以归纳为五个字关、改、启、验、滚。关把要修改的无线接口disable避免在变更过程中有客户端中途连入。改更新SSID、IP、MAC等参数。启重新enable接口让配置生效。验切换后立刻检查SSID是否正常广播、网关IP能否ping通、MAC是否已变更。滚任一步失败自动执行配置恢复。执行前我会把当前关键配置导出一份作为备份/export filepre-switch-backup如果验证阶段发现问题就执行/import filepre-switch-backup.rsc这个状态机是整个脚本可靠性的核心。没有回滚逻辑的批量切换脚本风险太高40台设备一旦有部分执行失败逐台排查的工时远超过脚本本身那点编写成本。3. 可直接落地的脚本实现与批量执行流程3.1 单设备切换核心脚本下面这段是单设备切换的核心逻辑我加了详细注释方便直接抄改# 定义目标参数 :local targetSsid BizNet-2024 :local targetGw 192.168.100.1/24 :local targetPool 192.168.100.10-192.168.100.200 :local targetMac 02:AA:BB:CC:DD:05 :local ifaceName vap-biz # 1. 关闭目标无线接口 /interface wireless disable $ifaceName # 2. 修改SSID /interface wireless set [find where name$ifaceName] ssid$targetSsid # 3. 修改接口IP /ip address set [find where interfacebridge-biz] address$targetGw # 4. 修改DHCP池 /ip pool set [find where namepool-biz] ranges$targetPool # 5. 修改MAC地址 /interface wireless set [find where name$ifaceName] mac-address$targetMac # 6. 重新启用接口 /interface wireless enable $ifaceName # 7. 验证 :delay 3s :if ([/interface wireless print count-only where name$ifaceName and ssid$targetSsid] 0) do{ :log info SSID switch OK } else{ :log warning SSID switch failed, rolling back... /import filepre-switch-backup.rsc }这里有个经验启用接口后加上3秒延迟再验证因为无线接口重新初始化需要一点时间。验证如果不通过就触发回滚同时用 :log 输出警告信息。在批量模式下每个设备的执行日志都会汇总到主控的日志文件里方便事后排查。3.2 40口/100口批量执行的三种方式第一种是主ROS循环加参数数组。把所有设备或VAP的名称写进一个数组循环执行上面的核心脚本。这种方式适合设备规模固定、命名规律的场景。:local vapNames {vap-1; vap-2; vap-3; vap-4} :foreach vap in$vapNames do{ /interface wireless disable $vap /interface wireless set [find where name$vap] ssidBatchNet-$vap /interface wireless enable $vap }第二种是CSV或文本参数文件批量导入。把每台设备的SSID、IP、MAC参数按行写进文件脚本逐行读取并解析。好处是参数和脚本分离以后改参数不用动脚本主体适合经常调整网段的场景。第三种是CAPsMAN集中下发。如果走CAPsMAN架构主控上修改完SSID模板后所有注册的AP会自动同步。脚本只需要在主控上执行一次配置变更AP侧完全透明。这种方式最适合上百台AP的大规模无线网络。3.3 验证与回滚的落地细节批量执行场景下建议分三步做验证。第一步是配置层面验证检查接口参数是否已经被正确修改看值是否和目标值一致。第二步是网络层面验证从主控ping各网段的网关地址能通就说明有线侧配置生效。第三步是无线侧验证可以用便携设备连接新SSID确认能获取到对应网段的IP地址。三关全过才算是真正切换成功。回滚操作要特别注意的一点是RouterOS的/import导入配置文件时本身也是逐条执行的中途一旦出错也可能留下半套配置。所以稳妥的做法是提前把备份文件拆成独立的部分比如IP部分的备份、无线部分的备份分开哪里出错就回滚哪里避免把所有环节绑在一起反而引入新的问题。4. 批量场景下最容易翻车的五个细节根据我自己跑过的几十次批量切换下面这五个问题出现频率最高整理成一个表方便对照问题现象根因解决思路切换后终端找不到新SSID无线接口enable后未等驱动完全初始化就开始验证增加3到5秒延迟分两轮验证部分终端拿到旧网段IPDHCP池改了但租约未清理切换后按旧网段批量清除租约网络广播风暴、时断时续批量脚本用了固定MAC全网重复MAC末位用序号生成保证唯一主控通过WiFi管理时切换后掉线修改的是管理接口所属的无线参数管理口尽量走有线或用带外管理新SSID与周边已有SSID同名未做重名预检终端漫游错乱切换前扫描全量SSID并去重展开说几个实际教训。第一个是主控通过WiFi管理的问题。早期我做测试时为了省事直接通过无线连上主控执行脚本结果脚本一跑无线接口disable主控自己先掉了线后面的命令全部断在半路。从那以后凡是涉及无线接口的批量操作我一定会确认当前管理会话走的是有线链路或者至少有带外管理通道。这个习惯帮我避免了很多次灾后救援。第二个是RouterOS v6和v7的差异。v7版本开始MikroTik主推的无线驱动从传统的wireless包换成了wifi包命令路径从/interface wireless变成了/interface wifi。如果手上的设备是v7命令格式会有明显区别。批量处理前务必先确认所有设备的系统版本统一否则同一套脚本跑在不同版本上会有一批成功一批报错。第三个是SSID名称长度和字符集。RouterOS对SSID长度有限制常规是32个字节以内。批量生成SSID时如果带中文、带特殊符号不同驱动的兼容性差别很大。我自己做批量切换时新SSID一律用纯字母加数字避免终端设备端出现显示乱码或连接异常。最后再分享一个小技巧。批量执行前先在两台设备上做小范围试点跑通了再全量下发。我听过的绝大多数切换事故都是因为跳过了试点直接全网执行。我的习惯是先在主控上把目标参数生成好选两台设备手动执行一次脚本拿其中一台做回滚演练确认恢复流程也正常然后再用循环脚本扫全量。折腾下来虽然多花十几分钟但比起几十台设备同时出问题的风险这点时间是绝对值得的。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进