RouterOS HotSpot Web认证配置与认证页排障指南
简介这份「ROS WEB认证」资料包面向网络管理员与RouterOS学习者聚焦咖啡厅、图书馆等公共场所的无线接入认证场景帮助读者理解并搭建基于热点门户的用户名密码验证流程。素材覆盖认证服务器与热点接口设置、PAP/CHAP认证策略、登录页品牌化定制、认证后带宽与在线时长限制以及日志审计和认证失败、无法连接等排错思路。压缩包共71个文件约95KB包含html登录、状态、重定向、错误页面jpg与png界面图片gif按钮素材以及css样式、js脚本、txt说明和xsd协议文件目录结构便于对照热点模板。页面与图片素材可直接用于搭建或二次修改热点登录门户减少从零设计认证页的工作量说明文件也有助于快速定位重定向异常与登录失败问题。已有308人学习适合需要参考多语言、自定义认证流程与MAC地址过滤等扩展用法的读者查漏补缺。1. 一台刷好 RouterOS 的路由器卡在认证页弹不出来的那一晚ROS WEB 认证这套东西我第一次装是在一个不到三十平的门店里路由器刷好 RouterOS插上 AP心里想的是「开个 HotSpot十分钟收工」。结果手机连上 WiFi 之后转圈半分钟认证页没弹出来浏览器打开任意网址一片白。后来才明白Web 认证从来不是一个开关它是 DHCP、DNS、walled-garden 和 HTTPS 四件事叠在一起的结果任何一层没对上用户看到的就是「连上了但上不了网」——这类问题最没头绪的地方在于路由器这边看日志一切正常。这套环境在门店访客网络、实验室临时网络、宿舍共享宽带里非常常见连上先登录登录后按账号限速、按时长计费、按 MAC 记 cookie 免重复认证。它适合手里已经有双网口以上设备、想自己掌控认证页样式的运维和开发者如果你是第一次碰 RouterOS建议先按后面的顺序把底包和地址规划做完再动 HotSpot 菜单不然很容易在第三步翻车。2. 选版本与打底RouterOS v6 和 v7 的分岔口装热点之前先把版本定下来这一步比后面所有配置都省事。RouterOS 的 v6 和 v7 在包结构上完全是两套逻辑很多人是照着 v6 的老教程在 v7 上敲命令菜单找不到、向导跑一半报错最后怀疑是固件坏了。2.1 包结构差异决定你后面怎么修v6 是分包制系统功能按包拆开安装升级时要跟着一起升漏装某个包菜单里就直接没有对应入口好处是老设备内存占用低网上能抄的脚本多。v7 把主要功能合并进一个主包附加功能无线、容器这类才单独装好处是升级只盯一个包坏处是设备闪存和内存要求比 v6 高一截老机器刷上去会明显变卡。对比项RouterOS v66.4x 分支RouterOS v77.x 分支包管理分包安装升级要成套主包合并附加包单独装HotSpot 菜单随系统包提供随主包提供HTTPS 登录页支持有限基本靠 http支持更好但证书要自己配硬件占用低老设备友好偏高闪存建议 128MB 起适合场景存量设备、已有 v6 脚本新装、需要长期维护我的取舍很简单新装一律 v7除非手上那台设备只有 32MB 内存、刷完连 Web 界面都卡。存量 v6 环境不折腾能用就别升。定版本之后第一件事是备份两个命令各跑一次一个是文本配置、一个是二进制备份后者是升级失败时唯一的后悔药# 文本导出跨版本可读适合排错时对照 /export filecfg-before-hotspot # 二进制备份同版本内可完整还原 /system backup save namebak-before-hotspot/export出来的是可读脚本换设备、换版本都能参考/system backup出来的是整机快照只能在同一版本或同主版本内还原跨大版本还原大概率起不来。两个都留别只留一个。2.2 刷完之后的第一组命令网口、地址、NAT、DNS热点要在「内网口 外网口」的结构上跑所以先把二层和三层打好。我一般把内网口全部加进一个网桥无线 AP 也接在网桥里这样后面 HotSpot 只需要绑一个接口不用逐个网口配# 建内网网桥把内网物理口和 AP 都挂进来 /interface bridge add namebr-lan /interface bridge port add bridgebr-lan interfaceether2 /interface bridge port add bridgebr-lan interfaceether3 # 内网网关地址后面 HotSpot 的 hotspot-address 就用它 /ip address add address192.168.88.1/24 interfacebr-lan # 外网口由上游分配地址PPPoE 环境改成拨号客户端 /ip dhcp-client add interfaceether1 disabledno # 让路由器自己当 DNS并把上游 DNS 填进来 /ip dns set allow-remote-requestsyes servers223.5.5.5,119.29.29.29 # 出口伪装注意 out-interface 必须是外网口 /ip firewall nat add chainsrcnat out-interfaceether1 actionmasquerade # 确认默认路由已经学到 /ip route print where dst-address0.0.0.0/0allow-remote-requestsyes是这一组里最关键的一行它让路由器对内网提供 DNS 服务热点环境下客户端必须把 DNS 指向网关自己192.168.88.1不能指向公网 DNS——认证前所有流量都被拦只有指向网关的 DNS 请求会被放行这条后面排查会反复用到。out-interfaceether1是最容易写错的参数。PPPoE 拨号环境下这里要换成 PPPoE 拨出来的接口名通常是 pppoe-out1写成 ether1 会导致拨号环境完全不通而 DHCP 环境却是好的很多人因此以为是热点配置错了。配完先验证一遍再往下走拿一台电脑接内网口手动设 IP 192.168.88.50/24、网关 192.168.88.1、DNS 192.168.88.1能打开外网网页才说明底子是通的。底子不通就开热点后面所有异常都会混在一起等于给自己造一个没有头绪的问题。3. 把 HotSpot 服务搭起来从地址池到 setup 向导底子通了之后才开始动热点。这一章按我实际交付的顺序走先清场再跑向导最后补用户和限速。顺序反了会出很多奇怪现象比如向导跑到一半提示地址池已存在、或者客户端拿到地址却认证不了。3.1 先清场把冲突的 DHCP 和地址池处理掉热点向导会自动创建 DHCP 服务器、地址池和 DHCP 网络如果那个接口上已经有一个 DHCP 服务器在跑向导要么直接报错要么创建出一套新的把旧的顶掉最后客户端拿到的地址和热点地址池对不上表现就是「连上了但打不开认证页」。先看一眼现状再决定删谁# 看现有 DHCP 服务器挂在哪个接口 /ip dhcp-server print # 看现有地址池范围重点检查有没有和 192.168.88.0/24 重叠 /ip pool print # 看接口上是否已经有 hotspot 实例重复执行向导会留下多个 /ip hotspot print如果 DHCP 服务器已经挂在 br-lan 上先把它关掉不是删保留配置便于回滚/ip dhcp-server disable [find interfacebr-lan]地址池规划上我一般留出三段192.168.88.1 给网关自己2–9 段留给打印机、AP、管理口这类固定设备10–200 给热点客户端动态分配。固定设备不进池子能省掉一类「隔三差五有人掉线」的怪问题——IP 冲突在热点环境下表现得特别隐蔽客户端会反复重连但你从路由器上看不出异常。3.2 跑一遍 /ip hotspot setup每个提问怎么答向导是交互式的在终端里执行/ip hotspot setup之后会连续问九个问题。下面是我常用的答案以及每一条为什么这么答/ip hotspot setup # 选择接口br-lan必须是有网关地址的内网接口 # local address for hotspot192.168.88.1/24 # select poolhs-pool没有就选 none向导会自己建 # ssl certificatenone先用 http 跑通证书后面单独加 # ip address of smtp server0.0.0.0不用邮件通知就留空 # dns servers192.168.88.1一定要指网关自己 # dns namehs.local给用户一个能记住的入口 # name of local hotspot useradmin # password for the user自己设一个强口令dns servers这一项填成公网 DNS 是新手最常犯的错填完认证页永远弹不出来因为客户端在认证前解析不了任何域名。dns name填 hs.local 的实际作用是认证前用户手工输入 http://hs.local 也能打开认证页这是弹窗失败时唯一可靠的入口。向导跑完之后等价的配置其实是这样几条理解了它们后面改配置就不用再重跑向导# 热点服务配置绑接口、指定地址池和配置文件 /ip hotspot profile set [find namehsprof1] \ hotspot-address192.168.88.1 \ dns-namehs.local \ login-byhttp-chap,cookie \ html-directoryhotspot /ip hotspot add namehs-guest interfacebr-lan \ address-poolhs-pool profilehsprof1 \ addresses-per-mac2 disablednologin-byhttp-chap,cookie这两个值是配合使用的http-chap表示用 CHAP 方式提交口令密码不以明文过网络cookie表示认证成功后在客户端写一个 cookie下次连上直接放行有效期由用户配置文件里的mac-cookie-timeout控制。addresses-per-mac2允许同一个 MAC 同时占两个地址这样手机开热点共享给笔记本时不会互相顶掉代价是地址池消耗快一点池子小的话改成 1。手动建 hotspot 时要特别注意向导会顺带创建 DHCP 服务器手动/ip hotspot add不会。所以如果跳过向导DHCP 服务器和 DHCP 网络要自己补否则客户端连地址都拿不到# 地址池与 DHCP 网络向导已建过就不要重复执行 /ip pool add namehs-pool ranges192.168.88.10-192.168.88.200 /ip dhcp-server network add address192.168.88.0/24 \ gateway192.168.88.1 dns-server192.168.88.1 /ip dhcp-server add namedhcp-hs interfacebr-lan \ address-poolhs-pool lease-time1h disablednolease-time1h是有意设短的。热点场景里客户端来来去去租期太长会让地址池慢慢被占满出现「明明没人连池子却显示耗尽」。1 小时对门店和实验室都够用租期一定要大于等于热点的会话时长这一条后面排查还会提到。3.3 用户配置文件限速、并发、会话向导建出来的默认用户配置文件什么限制都没有直接用等于给访客开了全速宽带。我一般单独建一个 guest 配置文件把限速和会话参数一次配好# 访客配置文件2M 上行 / 4M 下行允许 2 台设备同时在线 /ip hotspot user profile add nameguest \ shared-users2 \ rate-limit2M/4M \ session-timeout8h \ idle-timeout10m \ keepalive-timeout2m \ add-mac-cookieyes \ mac-cookie-timeout3d # 建账号并绑定配置文件 /ip hotspot user add nameguest01 passwordGuest2024 profileguest参数常用值说明shared-users2同一账号允许同时在线的终端数rate-limit2M/4M斜杠前是终端上行斜杠后是下发给终端的下行session-timeout8h到点强制下线需要重新认证idle-timeout10m无流量多久判定离线别设太短keepalive-timeout2m保活探测间隔小于 1m 容易误踢在线用户add-mac-cookieyes认证成功后写 MAC cookiemac-cookie-timeout3dcookie 有效期到期后重新认证rate-limit的方向最容易搞反。RouterOS 里斜杠前是 rx也就是从终端收上来的流量等于终端的上行斜杠后是 tx等于终端的下行。写成 4M/2M 就是上行比下行还快用户会反馈「打开网页慢但上传很快」这个现象很有辨识度。账号多了手工加不现实用脚本批量生成一行一条跑完再抽查# 批量建 20 个访客账号编号 guest01 到 guest20 :for i from1 to20 do{ /ip hotspot user add name(guest . [:pick 0000 0 4] . $i) \ password(G . $i . 2026) profileguest }这段脚本里[:pick 0000 0 4]只是用来补齐位数的辅助写法实际用的时候按自己的命名规则改就行重点是profileguest一定要带上否则账号会落到默认配置文件上限速全部失效。规模再大一点几十个账号、需要按时长计费、需要跨设备统一账号就该把认证交给外部 RADIUS 了。RouterOS 这边只要加一条# 把热点的认证请求转发到 RADIUS 服务器 /radius add servicehotspot address192.168.88.9 secretRadius2026servicehotspot表示这条记录只对热点服务生效别写成serviceall把管理登录也一起送出去secret两边必须完全一致差一个字符认证全部失败日志里只会看到一句认证被拒很容易误判成账号问题。加完 RADIUS 之后本地用户配置文件的限速参数依然生效计费和限速是两回事不要指望 RADIUS 帮你限速。4. 换成自己的认证页目录、变量与放行名单到这一步默认的蓝色认证页已经能弹出来了但交付的时候没人愿意用默认页。改页面这件事坑集中在两处文件放错目录和表单的提交地址写错。前者表现为 404后者表现为输完密码又弹回登录页。4.1 hotspot 目录里哪些文件不能删热点页面是一组静态文件放在路由器的hotspot目录下默认html-directoryhotspot。改之前先按清单过一遍删错一个文件就会出现「登录成功但白屏」或者「错误提示不显示」文件作用能不能删login.html认证页主体不能rlogin.html已认证用户再次打开时的跳转页不能alogin.html认证成功后展示的过渡页建议保留status.html登录后状态页显示流量和时长建议保留logout.html主动下线页建议保留error.html认证失败提示不能redirect.html认证后跳回原地址不能md5.jsCHAP 加密脚本用 http-chap 就不能删errors.txt错误码文案v7 常见可以改不建议删我只替换 login.html 和 status.html其余原样保留。整站重做看着彻底实际是把所有兜底路径都自己重写了一遍出错面大得多。换目录也是同样思路新建一个hotspot-guest目录放自己的页面然后改配置指向它这样升级或者手滑删文件时原版目录还在随时能切回去# 指向自定义目录路径相对路由器文件系统根目录 /ip hotspot profile set [find namehsprof1] html-directoryhotspot-guest # 确认改成功了 /ip hotspot profile print detail where namehsprof1文件名大小写要留意RouterOS 的文件系统区分大小写Login.html在浏览器里请求login.html就是 404。上传方式我一般用 WinBox 的文件窗口直接把整个目录拖进去或者开 FTP 传覆盖同名文件经常失败稳妥做法是先删再传传完在文件列表里看一眼大小对不对传了一半的 html 浏览器打开就是白屏。4.2 变量替换$(link-login-only) 和 $(link-login) 不是一回事认证页的模板变量是路由器在响应请求时现场替换的所以页面里那些$(...)不是前端语法写错一个整个认证流程就断了。最常见的错误是把表单提交地址写成$(link-login)它指向的是一个普通页面提交过去什么也不发生用户看到的就是「点了没反应」。!-- login.html 精简版只保留认证必需的部分 -- form namelogin action$(link-login-only) methodpost !-- 把用户原本想访问的地址带回去认证成功后自动跳转 -- input typehidden namedst value$(link-orig) / input typehidden namepopup valuetrue / !-- CHAP 认证依赖这两个隐藏域删掉就只能走明文口令 -- input typehidden namechap-id value$(chap-id) / input typehidden namechap-challenge value$(chap-challenge) / input typetext nameusername value$(username) placeholder账号 / input typepassword namepassword placeholder密码 / !-- $(error) 为空时不显示任何内容 -- p classerr$(error)/p button typesubmit连接网络/button /form script srcmd5.js/scriptaction必须是$(link-login-only)这是唯一接受提交的地址dst用$(link-orig)认证完成后路由器会按这个地址把用户送回原页面chap-id和chap-challenge两个隐藏域配合md5.js完成 CHAP 加密只要配置文件里login-by还带着http-chap这两个域缺一不可。想省事就把原版 login.html 的doLogin()脚本整段留着只改样式和外层结构这是最不容易出错的做法。$(error)用来显示失败原因注册码错、账号被占用、会话到期都会往这里填内容。样式上给它留一行固定高度不然消息一出现整个页面往下跳用户在手机上会以为页面崩了。4.3 walled-garden认证前必须放行的东西认证之前客户端除了能访问热点自身其余流量全部被拦。这带来一个很现实的问题手机和电脑判断「这个网络要不要弹认证页」靠的是访问系统自带的连通性探测地址如果这些地址被拦掉了系统就认为这个网络没网认证页自然不弹。放行名单我一般写这几类# 系统连通性探测地址不放行就不会自动弹认证页 /ip hotspot walled-garden add dst-hostcaptive.apple.com actionallow /ip hotspot walled-garden add dst-hostconnectivitycheck.gstatic.com actionallow /ip hotspot walled-garden add dst-hostwww.msftconnecttest.com actionallow # 认证页自身的样式和脚本走 CDN 时才有必要 /ip hotspot walled-garden add dst-host*.yourstatic.example actionallow # 管理员的内网管理地址认证前也要能访问 /ip hotspot walled-garden ip add actionaccept dst-address192.168.88.0/24walled-garden按域名放行走的是 DNS 解析后按 IP 匹配walled-garden ip按网段放行适合内网地址和固定 IP 的服务。两者的区别要注意域名放行在客户端自己解析 DNS 的情况下不一定生效所以热点环境下 DNS 必须指向网关这一点在第 3 章已经设过了。必须说清楚一个前提热点只能对 HTTP 请求做重定向HTTPS 请求在认证前是被直接丢弃的不会跳到认证页。这就是为什么现在很多手机连上之后不弹页面——系统探测用的是 HTTP能弹但用户自己打开的网站全是 HTTPS打不开也不会跳转。解决办法不是去拦 HTTPS做不到而是两件事一是保证探测域名能放行让系统自己弹二是在店里贴一张纸写上「连不上时浏览器打开 http://hs.local」。5. 认证页不弹、登录后掉线五个真实排查记录热点这套东西的异常表现高度相似但原因分散在四个层面。我按「认证页这一层」「登录之后这一层」「页面和升级这一层」分组记下来每条都按现象、原因、解决三段写照着对号入座基本能定位。5.1 认证页这一层不弹、白屏、循环回登录页现象一手机连上 WiFi不弹认证页浏览器打开任意网址一直转圈直到超时。原因客户端的 DNS 没有指向网关或者指向了网关但路由器上的 DNS 服务没开。认证前只有指向热点自身的 DNS 请求会被放行指向公网 DNS 的请求全部被丢弃域名解析不了浏览器连请求都发不出去。 解决先看 DHCP 网络里的 DNS 参数是不是 192.168.88.1/ip dhcp-server network print再看/ip dns print里allow-remote-requests是不是 yes。改完让客户端断开重连重新拿一次地址。还不行就在客户端上手动设 DNS 试一次能通就说明是 DHCP 下发的问题。现象二认证页能弹出来输完账号密码点连接页面刷新一下又回到登录页反复循环。原因自制的 login.html 把表单action写成了$(link-login)或者删掉了chap-id、chap-challenge两个隐藏域但配置文件里还留着http-chap。 解决先把action改成$(link-login-only)再确认这两个隐藏域在位。临时验证可以用一条命令把认证方式改成明文如果改完能登录就百分百是 CHAP 那两个域的问题# 临时改成明文口令用来验证是不是 CHAP 相关的问题 /ip hotspot profile set [find namehsprof1] login-byhttp-pap,cookie验证完记得改回来。明文口令在这个场景下能用但不该长期用尤其是在多人共用的访客网络里。5.2 登录之后这一层能上内网上不了外网、集体掉线现象三认证成功能打开路由器的管理页面和内网共享外网全部超时。原因出口伪装规则的out-interface写错或者默认路由没学到。DHCP 上游环境写成 ether1 通常没问题PPPoE 环境必须写拨号接口名很多人是从 DHCP 环境复制过来的配置一换环境就整片不通。 解决先看路由/ip route print where dst-address0.0.0.0/0有没有一条可达的默认路由再看 NAT 规则的计数器有没有在涨# 看 NAT 规则命中次数不涨说明流量根本没走到这条规则 /ip firewall nat print stats计数一直是 0就是接口名写错了计数在涨但外网还不通就往上游查别再折腾热点。现象四用了几个小时之后所有在线终端同时掉线要重新认证。原因两种可能。一是keepalive-timeout设得太短比如 30s客户端休眠或者短暂无流量就被判定离线二是 DHCP 租期比热点会话时长短地址到期续租时触发了重新认证。 解决keepalive-timeout不要低于 2midle-timeout不要低于 10mDHCP 租期设成大于等于会话时长前面给的lease-time1h配session-timeout8h是没问题的但如果你把会话设成 30 分钟、租期还是 12 小时反而会出现地址被长期占用。两个参数要一起看不要只调一个。5.3 页面与升级这一层文件传上去了却不生效现象五自定义页面传上去了浏览器打开还是默认页或者直接 404。原因html-directory指向的目录名和实际目录对不上或者文件名大小写不一致或者同名文件覆盖失败留下了半截文件。 解决三步走。先确认目录/ip hotspot profile print detail where namehsprof1看html-directory的值再确认文件在文件列表里核对目录名和文件名login.html必须全小写最后确认内容完整删掉重传一次传完看文件大小是不是和本地一致。改完目录之后新的请求才会生效已经连着的老客户端要断开重连。顺带提一句升级v6 升 v7 之后热点整块消失的情况基本都是主包没升完整或者附加包残留导致的。升级前把/export出来的配置存一份到本地升级后对着导出的内容逐段核对热点部分比在菜单里翻要快得多。6. 交付前怎么验三条命令加一台手机的走查清单热点配完之后别急着交我固定跑一遍下面这套验收五分钟能挡掉八成返工。第一条看在线会话。只有真的有人在线上这条命令才有输出输出里能看到终端 IP、MAC、登录时间和已用流量# 在线会话详情重点看 uptime 和 bytes-in/out 是否在增长 /ip hotspot active print detail第二条看主机表。它列出所有拿到地址的终端以及每一台的状态是已认证还是被放行用来判断「连上了但没认证」的设备有多少# 主机表authorized 为 yes 表示已放行或已认证 /ip hotspot host print第三条看日志。热点的登录、登出、认证失败都会写进日志排查时这是唯一能还原现场的东西# 只看热点相关日志按时间倒序翻最近的记录 /log print where topics~hotspot然后是手机走查这一步不能省因为绝大多数问题只在真实终端上才暴露检查项操作期望结果自动弹窗忘记网络后重连310 秒内弹出认证页手动入口浏览器打开 http://hs.local能打开认证页认证成功输入账号密码跳回原页面可访问外网免重复认证断开再连一次不弹认证页直接可上网限速生效跑一次测速上下行接近配置值不超主动下线打开 status 页点注销回到认证页外网断开最后一行建议一定要测。注销页面涉及logout.html和$(link-logout)变量很多自制页面把这块漏了用户想主动下线只能等会话超时体验很差。限速是否真的生效手机上测速只能看个大概我一般用路由器自己的工具看实时流量比测速软件直观# 实时观察内网口流量按 q 退出 /tool torch interfacebr-lan从那以后我每次交付前都强制走一遍这份清单尤其是「断开重连免认证」和「主动下线」这两项——它们不影响能不能上网却决定用户第二天还愿不愿意连这个网络。希望帮到你。本文还有配套的精品资源点击获取