简介:这份资源面向网络管理员与RouterOS学习者,聚焦ROS(RouterOS)的Web认证(Hotspot)功能,帮助解决公共场所无线接入的授权与计费问题。压缩包共71个文件,约95KB,以19个html登录与状态页面、21个jpg与18个png界面素材、8个gif图标为主,另含css样式表、md5.js脚本、WISPAccessGatewayParam.xsd及错误日志文本,构成一套可直接套用的认证页面模板。内容覆盖登录、跳转、状态、注销等完整流程页面,并附带错误提示与日志文件,便于对照排查认证失败、页面跳转异常等常见问题。已有306人学习下载。读者可借此快速搭建热点认证界面,理解认证服务器、热点接口与认证策略的配合方式,并在此基础上定制品牌化登录页与访问控制策略。
1. ROS WEB认证:一张被低估的知识地图
很多人第一次接触 ROS WEB 认证,以为它只是路由器上勾选一个“Hotspot”就能跑起来的功能。真到要交付一个能稳定运行、能对接外部计费、能自定义登录页面的认证系统时,才发现它横跨了网络协议、Web 服务、模板渲染、用户管理、计费对接好几个模块。这张地图大致可以分成四块:底层是 Hotspot 网关与 RADIUS 交互,中间是 HTTP 拦截与重定向流程,上层是登录页模板与参数传递,最外层是用户数据、计费策略与日志排查。适合谁看?适合已经会配基础 Hotspot、但一遇到“认证页不跳转”“登录后不跳回原页面”“计费不准”就卡住的人。梳理下来会发现,真正难的不是某一个命令,而是这几层之间的数据怎么流动、状态怎么保持。
2. 认证流程拆解:从客户端请求到放行上网
2.1 未认证客户端的 HTTP 请求到底经历了什么
理解 ROS WEB 认证,第一步是把“用户打开浏览器”到“看到登录页”之间发生的事拆开。客户端连上无线后,会先拿到一个 IP,但这个 IP 在 Hotspot 里处于未认证状态。此时客户端发出的任何 HTTP 请求,都会被 Hotspot 的规则拦截,并重定向到路由器本地的登录页面。这个过程不是简单的 302,而是涉及 DNS 解析、HTTP 拦截、本地 Web 服务响应三个环节。
梳理下来会发现,最容易忽略的是 DNS 环节。如果客户端用的是自定义 DNS,或者 DNS 请求本身没有被正确拦截,浏览器可能直接报“无法解析域名”,而不是跳到登录页。所以排查“登录页不出现”时,第一步不是看模板,而是确认 DNS 请求是否被 Hotspot 接管。
# 查看 Hotspot 服务端配置,确认 DNS 相关参数 /ip hotspot print detail # 关注 address-pool、dns-name 以及 login-by 这几个字段dns-name决定了登录页使用的域名,login-by决定了允许哪些认证方式。如果login-by里没有勾选 HTTP PAP 或 HTTP CHAP,浏览器提交的账号密码就不会被正确处理。参数改完后,需要清理客户端 ARP 表和 DNS 缓存,否则旧状态会干扰测试。
2.2 登录页模板与参数传递的关键字段
登录页不是随便写个 HTML 就能用。ROS 的 Hotspot 会在渲染登录页时注入一批变量,比如$(link-login-only)、$(error)、$(username)。这些变量决定了表单提交到哪个地址、错误信息怎么显示、用户名是否回填。很多人从网上下载一套模板,直接替换文件,结果登录后跳转异常,就是因为模板里写死了 action 地址,没有用变量。
重点在于三个字段:表单的action必须指向$(link-login-only);隐藏域里要带上dst参数,用来记录用户原本想访问的地址;如果启用了 HTTPS 重定向,还要处理ssl相关变量。梳理下来会发现,登录后能不能跳回原页面,几乎全看dst有没有正确传递。
<!-- 登录表单的核心结构,注意 action 和隐藏域 --> <form name="login" action="$(link-login-only)" method="post"> <input type="hidden" name="dst" value="$(link-orig)" /> <input type="hidden" name="popup" value="true" /> <input type="text" name="username" value="$(username)" /> <input type="password" name="password" /> <input type="submit" value="登录" /> </form>$(link-orig)是用户原始请求的 URL,$(link-login-only)是仅用于登录提交的地址。这两个变量不能混用,否则会出现“登录成功但跳回登录页”的循环。参数说明就这些,改模板时逐项对照即可。
2.3 RADIUS 对接与计费策略的衔接点
当 Hotspot 本地用户不够用,或者需要对接外部计费系统时,就要引入 RADIUS。ROS 作为 RADIUS 客户端,把认证请求转发给外部服务器,服务器返回 Accept 或 Reject,同时可以下发速率限制、会话超时等属性。重点在于:本地 Hotspot 用户和 RADIUS 用户的优先级、计费开始时间是从认证成功算还是从拿到 IP 算、中断后重连是否重新计费。
最容易翻车的地方是计费开始时间。如果 Hotspot 的login-by同时启用了 HTTP PAP 和 MAC 认证,而 RADIUS 那边按 MAC 认证也计费,就会出现用户还没打开浏览器就被扣时长的情况。梳理下来,建议在 RADIUS 侧明确区分认证类型,或者在 Hotspot 侧关闭不需要的登录方式。
# 配置 RADIUS 客户端 /radius add service=hotspot address=192.0.2.10 secret=testing123 # 在 Hotspot 服务端启用 RADIUS 认证 /ip hotspot profile set [find] use-radius=yesservice=hotspot表示只对 Hotspot 流量生效,secret要和服务器端一致。改完后用/radius monitor看请求和响应计数,如果只有请求没有响应,优先查网络连通性和共享密钥。
3. 模板与页面定制:登录页、错误页与跳转逻辑
3.1 登录页模板的文件结构与变量清单
ROS 的 Hotspot 模板通常放在hotspot目录下,核心文件包括login.html、status.html、error.html、logout.html。每个文件里可用的变量不同,比如status.html里能拿到$(uptime)、$(bytes-in),而login.html里主要是$(error)、$(username)、$(link-login-only)。很多人把变量写错文件,导致页面显示空白或报错。
梳理下来,建议先列一张变量对照表,改模板时逐项核对。重点注意$(if error)这种条件块,它决定了错误信息是否显示。如果模板里没有这个条件块,用户输错密码后页面不会有任何提示,体验很差。
| 变量名 | 可用页面 | 作用 |
|---|---|---|
$(link-login-only) | login | 登录表单提交地址 |
$(link-orig) | login | 用户原始请求地址 |
$(error) | login | 错误提示文本 |
$(username) | login | 回填用户名 |
$(uptime) | status | 在线时长 |
$(bytes-in) | status | 下载字节数 |
3.2 登录后跳转与 HTTPS 重定向的注意点
登录成功后,Hotspot 会根据dst参数把用户重定向回原地址。如果dst为空,就跳到status.html。这里最容易忽略的是 HTTPS 请求:用户原本访问的是 HTTPS 站点,Hotspot 无法直接拦截并重定向,因为证书不匹配。此时浏览器会报证书错误,用户看到的是安全警告,而不是登录页。
解决办法通常有两种:一是启用 Hotspot 的 HTTPS 重定向功能,让路由器生成一个自签名证书;二是在登录页里引导用户手动访问一个 HTTP 地址。梳理下来,前者配置简单但仍有证书警告,后者体验稍好但需要额外说明。重点在于,无论哪种方式,都要在login.html里处理好ssl变量,否则跳转逻辑会乱。
# 启用 HTTPS 重定向 /ip hotspot profile set [find] login-by=http-chap,http-pap /ip hotspot set [find] ssl-certificate=hotspot-certssl-certificate指定使用的证书,没有证书时 HTTPS 重定向无法工作。改完后用手机浏览器访问一个 HTTPS 站点,看是否跳到登录页。
3.3 错误页与注销页的联动
错误页和注销页经常被当成附属品,随便放个链接就完事。实际上,错误页要能区分“认证失败”“会话超时”“IP 冲突”几种情况,注销页要能正确清理会话并提示用户。如果注销页只是静态 HTML,用户点完注销后浏览器缓存里还有登录状态,再访问时可能直接放行。
重点在于注销页要调用$(link-logout)变量,并且配合 Hotspot 的logout服务。梳理下来,建议在注销页加一个倒计时跳转,跳回登录页,避免用户停留在空白页。错误页则要根据$(error)的内容做简单分支,至少让用户知道是密码错了还是账号过期了。
4. 用户管理与计费:本地用户、RADIUS 与限速
4.1 本地用户与用户配置文件的区别
ROS 里有两个容易混淆的概念:/ip hotspot user和/ip hotspot user profile。前者是具体账号,后者是一组策略模板,比如限速、会话超时、空闲超时。很多人只建用户不建配置文件,结果所有用户共享默认策略,无法做差异化限速。
梳理下来,正确的顺序是先建 profile,再建 user,并在 user 里引用 profile。重点注意rate-limit字段,它决定了上下行速率。如果写错单位,比如把1M写成1m,限速不会生效,用户会跑满带宽。
# 先建用户配置文件 /ip hotspot user profile add name=basic rate-limit=2M/2M session-timeout=1h # 再建用户并引用配置文件 /ip hotspot user add name=user1 password=pass1 profile=basicrate-limit=2M/2M表示上行 2M、下行 2M。session-timeout=1h表示一小时后强制下线。改完后用/ip hotspot active print看在线用户是否应用了正确策略。
4.2 RADIUS 属性下发与限速的优先级
当同时使用本地 profile 和 RADIUS 下发属性时,优先级容易搞混。通常 RADIUS 下发的属性会覆盖本地 profile,但具体行为取决于 Hotspot 的配置。如果 RADIUS 返回了Mikrotik-Rate-Limit,而本地 profile 也有rate-limit,最终生效的是 RADIUS 的值。
最容易忽略的是属性格式。RADIUS 下发的速率限制字符串必须符合 ROS 的格式,比如2M/2M,否则会被忽略。梳理下来,建议在 RADIUS 侧统一管理限速,本地 profile 只做兜底。测试时用/ip hotspot active print detail看实际生效的速率。
4.3 计费开始时间与中断重连的处理
计费开始时间通常以认证成功为准,但如果是 MAC 认证,用户可能还没打开浏览器就已经在线。中断重连时,如果 RADIUS 侧没有做会话恢复,会重新计费。重点在于Acct-Start和Acct-Interim-Update两个计费报文的处理。
梳理下来,建议在 RADIUS 侧配置Acct-Interim-Update间隔,比如每 5 分钟一次,这样即使中断,也能根据最后一次更新估算时长。Hotspot 侧则要确保radius-accounting已启用,否则不会发送计费报文。
# 启用 RADIUS 计费 /ip hotspot profile set [find] radius-accounting=yes # 查看计费报文发送情况 /radius monitor 0radius-accounting=yes表示发送计费报文。如果monitor里只有认证请求没有计费请求,检查service是否包含hotspot。
5. 易漏点与易错点:认证不生效的常见原因
5.1 易漏点:DNS 拦截与客户端缓存
易漏点 → 为什么漏 → 怎么补:DNS 拦截没生效,客户端直接用自定义 DNS 解析,导致登录页不跳转。很多人只检查 Hotspot 配置,忘了客户端可能手动设了 DNS。补法是在 Hotspot 里强制dns-name,并测试时清理客户端 DNS 缓存。
5.2 易错点:模板变量写错文件
易错点 → 为什么错 → 怎么补:把$(uptime)写到login.html里,页面渲染时变量为空,显示异常。原因是不同页面可用变量不同。补法是改模板前先查变量对照表,改完后用浏览器开发者工具看渲染结果。
5.3 易漏点:HTTPS 重定向的证书警告
易漏点 → 为什么漏 → 怎么补:用户访问 HTTPS 站点时看到证书警告,以为认证坏了。原因是自签名证书不被浏览器信任。补法是提前在登录页说明,或者引导用户先访问 HTTP 地址。
5.4 易错点:限速单位与优先级
易错点 → 为什么错 → 怎么补:rate-limit写成1m而不是1M,限速不生效。原因是 ROS 对单位大小写敏感。补法是统一用大写M或k,并在active里确认实际生效值。
5.5 易漏点:计费报文未启用
易漏点 → 为什么漏 → 怎么补:只配了认证没配计费,RADIUS 侧看不到时长。原因是radius-accounting默认关闭。补法是显式启用,并用monitor确认报文发送。
6. 复习清单:从配置到排查的查漏补缺路径
复习 ROS WEB 认证,建议按“配置 → 模板 → 用户 → 计费 → 排查”五步走一遍。配置阶段重点看 Hotspot profile 里的login-by、dns-name、radius-accounting三个字段;模板阶段重点核对login.html的 action 和隐藏域;用户阶段重点确认 profile 引用和限速单位;计费阶段重点看 RADIUS 的Acct-Start和Interim-Update;排查阶段按“DNS → 模板 → 用户 → RADIUS”顺序逐层排除。
| 检查项 | 命令或位置 | 预期结果 |
|---|---|---|
| DNS 拦截 | /ip hotspot print detail | dns-name已设置 |
| 登录表单 | login.html | action 为$(link-login-only) |
| 用户限速 | /ip hotspot active print | 速率与 profile 一致 |
| 计费报文 | /radius monitor 0 | 有 Acct 请求 |
| 错误提示 | login.html | 包含$(if error)块 |
查漏补缺时,最容易忽略的是“改完配置没清缓存”。Hotspot 的状态会缓存在客户端和路由器两侧,改完dns-name或模板后,最好重启 Hotspot 服务,并让客户端断开重连。另一个习惯是每次改模板前先备份原文件,改完后用手机和电脑各测一次,因为不同浏览器对重定向和证书的处理不一样。
从那以后我每次调 Hotspot 认证,都强制走一遍“DNS → 模板 → 用户 → RADIUS → 计费”的检查链,哪怕只是改了一个按钮文字。这套流程帮我省掉了很多次“明明配置没错但就是不生效”的玄学时间。希望帮到你。
本文还有配套的精品资源,点击获取