☰
RouterOS热点Web认证实战:从配置到RADIUS对接与排错
2026/10/14 4:03:48 网站建设 项目流程

简介:这份资源面向网络管理员与RouterOS使用者,聚焦ROS(RouterOS)的Web认证(Hotspot)功能,帮助解决公共场所无线接入的授权与管控问题。压缩包共71个文件,约95KB,以19个html登录与状态页面、21个jpg与18个png界面素材、8个gif图标、1个css样式表、1个js脚本及xsd、txt说明文件为主,构成一套可直接套用的热点认证页面模板。内容涵盖登录、注销、状态、重定向、广告等页面,并配有图片与样式资源,便于按品牌需求替换logo、调整布局与文案。已有306人学习下载,适合需要快速搭建或美化ROS热点认证界面的读者参考,可从中获取页面结构、素材组织与认证流程呈现的完整思路,减少从零设计登录页的工作量。

1. ROS WEB认证:从热点登录到权限放行的完整落地链路

很多人第一次听到 ROS WEB认证,脑子里浮现的是在浏览器里弹出一个登录框,输入账号密码就能上网。但真正动手做的时候才发现,事情远不止一个登录页那么简单。它本质上是一套基于 RouterOS 的强制门户认证体系,核心逻辑是:未认证用户的所有 HTTP 请求被拦截并重定向到认证页面,认证通过后防火墙动态放行该设备的流量。这套方案常见于酒店、校园、企业访客网络等场景,解决的是「谁在用网、用了多久、能访问什么」这三个问题。如果你手头有一台 RouterOS 设备,想给访客网络加一层认证门槛,或者想替换掉老旧的门禁式上网方案,这篇内容会从热点配置一路讲到认证页面对接和排错,新手能跟着做,熟手能看到参数边界。

2. 热点服务怎么配:从零搭出一套可用的认证环境

2.1 先搞清楚 Hotspot 的工作链路

RouterOS 的 Hotspot 功能不是简单开一个 Web 服务就完事。它的完整链路是这样的:客户端连上无线或有线后获取到 IP,首次发起 HTTP 请求时被防火墙的 NAT 规则劫持到 Hotspot 服务端口,Hotspot 返回一个重定向响应,把浏览器导向登录页面。用户提交凭证后,Hotspot 校验通过,在防火墙里动态插入一条放行规则,同时启动计时和流量统计。

这里面有几个关键角色:/ip hotspot定义热点服务实例,绑定到具体接口;/ip hotspot user和/ip hotspot user profile管理账号和限速策略;/ip hotspot walled-garden控制免认证白名单;/ip hotspot active是当前在线列表。理解这几个模块的关系,后面调参数才不会迷路。

我一般会先在测试环境把最小闭环跑通,再去动生产配置。最小闭环就是:一个热点实例、一个用户、一个能弹出登录页的客户端。

2.2 用命令行搭出最小可用热点

下面这段配置是在 RouterOS v7 上验证过的,接口名和网段按你的实际情况替换。假设内网接口是bridge-hotspot,网关地址是10.10.0.1/24,地址池用10.10.0.100-10.10.0.200。

# 创建地址池,供热点客户端分配 /ip pool add name=hs-pool ranges=10.10.0.100-10.10.0.200 # 创建 DHCP 服务,绑定到内网接口 /ip dhcp-server add name=hs-dhcp interface=bridge-hotspot address-pool=hs-pool disabled=no # 给内网接口配网关地址 /ip address add address=10.10.0.1/24 interface=bridge-hotspot # 创建热点服务实例,绑定接口和地址池 /ip hotspot add name=hotspot1 interface=bridge-hotspot address-pool=hs-pool profile=default disabled=no # 创建热点用户配置文件,设置限速和会话超时 /ip hotspot user profile add name=guest-profile rate-limit=5M/5M session-timeout=8h idle-timeout=30m shared-users=1 # 创建一个测试用户 /ip hotspot user add name=testuser password=test123 profile=guest-profile

这段配置的逻辑是:地址池负责给客户端分 IP,DHCP 服务让客户端自动获取地址,热点实例把接口上的 HTTP 流量劫持到认证流程,用户配置文件决定了认证后的限速和超时行为。rate-limit=5M/5M表示上下行各限 5Mbps,session-timeout=8h是单次认证最长 8 小时,idle-timeout=30m是空闲 30 分钟自动踢下线,shared-users=1限制一个账号只能一台设备用。

配完之后,用手机连上这个接口对应的无线网络,浏览器随便打开一个 HTTP 网站,应该能看到 RouterOS 默认的登录页面。如果没弹出来,先检查/ip hotspot active里有没有出现客户端记录,没有的话大概率是 DHCP 或接口绑定出了问题。

2.3 认证页面自定义:从默认模板到自己的登录页

RouterOS 默认的登录页比较简陋,实际项目里一般都要换成自己的页面。Hotspot 的页面文件存放在/ip hotspot实例对应的目录下,可以通过 FTP 或 WinBox 的文件管理上传。核心文件是login.html、redirect.html、status.html和error.html。

自定义页面时,表单的提交地址必须指向/login,字段名必须是username和password,否则认证不会生效。下面是一个最小化的登录页示例:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>网络接入认证</title> </head> <body> <form action="/login" method="post"> <input type="text" name="username" placeholder="账号" required> <input type="password" name="password" placeholder="密码" required> <button type="submit">登录</button> </form> </body> </html>

这里的关键点是action="/login"和两个name属性。RouterOS 的 Hotspot 服务会监听这个路径,解析 POST 数据后校验用户。如果你用了 AJAX 提交,注意跨域和重定向的处理,Hotspot 的认证成功响应会带一个重定向头,前端需要跟随跳转。

上传页面后,在/ip hotspot里把html-directory指向你的页面目录,或者直接覆盖默认目录下的文件。改完记得在浏览器里强制刷新,Hotspot 的页面缓存有时候很顽固。

3. 认证方式怎么选:本地用户、RADIUS 还是外部 Portal

3.1 三种认证模式的适用边界

RouterOS 的 Hotspot 支持三种认证来源:本地用户数据库、RADIUS 服务器、以及外部 Portal 对接。本地用户适合小规模场景,比如几十个固定账号的访客网络,配置简单,不依赖外部服务。RADIUS 适合有统一账号体系的场景,比如企业里已经有 AD 或 LDAP,通过 RADIUS 代理做认证,RouterOS 只负责转发请求。外部 Portal 适合需要自定义认证逻辑的场景,比如短信验证码、微信扫码、第三方 OAuth,RouterOS 把认证请求通过 HTTP 回调发给你的业务服务器,由服务器决定放行还是拒绝。

选型的时候先问自己三个问题:账号存在哪里、认证逻辑复杂不复杂、有没有计费和审计需求。如果账号就在 RouterOS 本地,用本地用户最省事;如果账号在外部系统且需要集中管理,上 RADIUS;如果需要短信或扫码,走外部 Portal。

3.2 对接 RADIUS 的关键参数

RADIUS 对接的核心是/radius和/ip hotspot里的use-radius开关。下面这段配置假设 RADIUS 服务器地址是192.168.1.100,共享密钥是shared-secret。

# 添加 RADIUS 服务器 /radius add address=192.168.1.100 secret=shared-secret service=hotspot timeout=3s # 在热点实例上启用 RADIUS 认证 /ip hotspot set hotspot1 use-radius=yes # 如果需要 RADIUS 计费,开启 accounting /radius set [find address=192.168.1.100] accounting=yes

timeout=3s是等待 RADIUS 响应的超时时间,超过这个时间 RouterOS 会认为认证失败。service=hotspot限定这个 RADIUS 条目只用于热点认证,不影响其他服务。accounting=yes会定期发送计费包,用于流量统计和在线时长记录。

这里有个血泪经验:RADIUS 服务器的响应格式必须严格符合 RFC,尤其是Framed-IP-Address和Session-Timeout这两个属性,格式不对会导致认证成功但无法正常放行。排查的时候在 RouterOS 上开/radius monitor看交互日志,能省很多时间。

3.3 外部 Portal 的 HTTP 回调怎么接

外部 Portal 模式下,RouterOS 会把用户的认证请求以 HTTP GET 或 POST 的方式转发到你指定的 URL。你需要在/ip hotspot的login-by里启用http-pap,并配置http-cookie或http-header来传递参数。

常见做法是:RouterOS 把username、password、ip、mac等参数拼到 URL 里,你的服务器校验后返回一个特定格式的响应,RouterOS 根据响应决定是否放行。响应格式一般是Access-Accept或Access-Reject加上属性列表。

下面是一个用 Python 写的极简回调处理示例:

from http.server import BaseHTTPRequestHandler, HTTPServer from urllib.parse import urlparse, parse_qs class PortalHandler(BaseHTTPRequestHandler): def do_GET(self): # 解析 RouterOS 传来的查询参数 query = parse_qs(urlparse(self.path).query) username = query.get('username', [''])[0] password = query.get('password', [''])[0] client_ip = query.get('ip', [''])[0] # 这里替换成你自己的校验逻辑 if username == 'vip' and password == 'vip123': # 认证通过,返回 Access-Accept self.send_response(200) self.send_header('Content-Type', 'text/plain') self.end_headers() self.wfile.write(b'Access-Accept') else: self.send_response(200) self.send_header('Content-Type', 'text/plain') self.end_headers() self.wfile.write(b'Access-Reject') if __name__ == '__main__': server = HTTPServer(('0.0.0.0', 8080), PortalHandler) server.serve_forever()

这段代码的逻辑是:接收 RouterOS 转发的 GET 请求,解析出用户名和密码,做简单校验后返回Access-Accept或Access-Reject。实际项目里你会在这里查数据库、调短信接口、验证 token。注意 RouterOS 对响应时间有要求,一般不超过 5 秒,超时会走 fallback 逻辑。

参数说明:username和password是用户在登录页填的,ip是客户端地址,mac是客户端 MAC。这些字段名可以在/ip hotspot的http-header里自定义,但建议保持默认,减少对接成本。

4. 避坑与排查:认证不弹窗、登录失败、频繁掉线的处理

4.1 登录页不弹出,浏览器直接超时

现象:客户端连上网络后,打开浏览器访问任何网站都超时,没有重定向到登录页。

原因:最常见的是 DNS 解析问题。Hotspot 需要把未认证用户的 DNS 请求也劫持到自己的服务,如果 DNS 配置不对,客户端连域名都解析不了,自然到不了重定向那一步。另一个可能是防火墙的 NAT 规则被手动改过,导致 HTTP 流量没有被正确劫持。

解决:检查/ip hotspot实例的dns-name是否配置,确保/ip dns里允许远程请求。用/ip firewall nat print看有没有 Hotspot 自动生成的 NAT 规则,如果被删了,重新启用热点实例会自动重建。还可以在客户端上用nslookup测试 DNS 是否可达。

4.2 输入正确账号密码仍然提示认证失败

现象:登录页能弹出,账号密码确认没输错,但提交后返回错误页面。

原因:可能是用户配置文件里的session-timeout或idle-timeout设置过短,导致认证瞬间就被踢;也可能是 RADIUS 服务器返回了Access-Reject但没带原因;还有一种情况是用户已经在线,shared-users=1限制了重复登录。

解决:先用/ip hotspot active print看当前在线列表,确认账号是否已经存在。如果用了 RADIUS,开/radius monitor看交互日志,重点看Reply-Message属性。本地用户的话,检查/ip hotspot user print detail里的uptime和bytes-in/out,确认账号没有被禁用或过期。

4.3 认证成功后频繁掉线,需要反复登录

现象:登录后能用几分钟,然后突然断网,重新弹出登录页。

原因:idle-timeout设置太短,用户稍微没有流量就被判定为空闲;或者session-timeout到了强制下线;还有一种可能是客户端 IP 变了,Hotspot 的会话绑定的是 IP,IP 一变会话就失效。

解决:把idle-timeout调到 30 分钟以上,session-timeout根据实际需求设,访客网络一般 8 到 12 小时。如果是 IP 变化导致的,检查 DHCP 租期是否太短,把/ip dhcp-server的lease-time设长一点,比如1d。另外确认无线网络没有开启漫游强制重连,有些 AP 的快速漫游会导致客户端重新获取 IP。

4.4 部分网站能打开,部分网站打不开

现象:认证通过后,大部分网站正常,但某些特定网站或 App 无法访问。

原因:Hotspot 的walled-garden白名单可能误拦截了某些域名,或者 DNS 解析走了不同的路径。还有一种情况是 HTTPS 网站的 SNI 被干扰,但这种情况在 Hotspot 场景里比较少见。

解决:检查/ip hotspot walled-garden和/ip hotspot walled-garden ip的规则,确认没有误加限制。如果是 DNS 问题,在/ip hotspot的dns-name里配置一个可靠的 DNS 服务器。还可以在客户端上用tracert看流量在哪个节点被阻断。

4.5 大量用户同时认证时服务无响应

现象:用户少的时候一切正常,用户一多就出现认证页面加载慢、提交无响应。

原因:RouterOS 设备的性能瓶颈,Hotspot 服务本身比较吃 CPU,尤其是开启了 HTTPS 重定向和复杂页面的时候。另外 RADIUS 服务器的并发处理能力也可能是瓶颈。

解决:先看/system resource print里的 CPU 占用,如果持续高于 80%,考虑升级硬件或减少 Hotspot 的并发连接数。RADIUS 那边可以加缓存或做负载均衡。页面方面,尽量精简 HTML 和 CSS,避免在登录页加载大图或外部资源。

5. 进阶技巧:用脚本做自动放行和认证日志分析

5.1 用 RouterOS 脚本实现定时清理和自动放行

Hotspot 的active列表会保留已认证用户的会话,但有时候用户异常下线后会话不会立即清除,导致账号被占用。可以写一个定时脚本,清理超过一定时间没有流量的会话。

# 每 10 分钟检查一次,清理空闲超过 1 小时的会话 /system scheduler add name=clean-idle interval=10m on-event={ /ip hotspot active print detail where uptime > 1h # 实际清理需要根据 uptime 和 bytes 判断,这里仅做示例 }

更实用的场景是自动放行:比如某个 MAC 地址的设备需要免认证上网,可以用脚本在检测到该 MAC 上线时自动添加到ip-binding里。

# 监听 DHCP 租约,发现特定 MAC 自动加入免认证绑定 /system scheduler add name=auto-bind interval=1m on-event={ /ip dhcp-server lease print detail where mac-address="AA:BB:CC:DD:EE:FF" # 如果发现该租约,执行绑定 /ip hotspot ip-binding add mac-address="AA:BB:CC:DD:EE:FF" type=bypassed }

这段脚本的逻辑是定期检查 DHCP 租约表,发现目标 MAC 就把它加入 Hotspot 的 IP 绑定,类型设为bypassed表示免认证直接放行。实际部署时要注意去重,避免重复添加同一条绑定。

5.2 认证日志的采集和分析

RouterOS 的 Hotspot 日志默认记录在/log里,可以通过logging配置把 Hotspot 相关日志单独输出到远程 syslog 服务器。关键日志字段包括:用户名、客户端 IP、MAC、认证结果、上线时间、下线时间。

下面是一个用 Python 解析 syslog 并统计认证成功率的简单示例:

import re from collections import defaultdict # 模拟从 syslog 文件读取的日志行 log_lines = [ "hotspot,info,debug hotspot1: testuser logged in from 10.10.0.101", "hotspot,info,debug hotspot1: testuser logged out from 10.10.0.101", "hotspot,info,debug hotspot1: baduser login failed from 10.10.0.102", ] success = defaultdict(int) fail = defaultdict(int) for line in log_lines: # 匹配登录成功 m = re.search(r'(\S+) logged in from (\S+)', line) if m: success[m.group(1)] += 1 continue # 匹配登录失败 m = re.search(r'(\S+) login failed from (\S+)', line) if m: fail[m.group(1)] += 1 print("认证成功统计:", dict(success)) print("认证失败统计:", dict(fail))

这段代码用正则从日志行里提取用户名和结果,分别统计成功和失败次数。实际项目里可以把结果写入数据库,做趋势分析和异常告警。比如某个账号短时间内大量失败,可能是暴力破解,需要自动封禁。

参数说明:正则里的(\S+)匹配非空白字符,logged in from和login failed from是 RouterOS 日志的固定格式,不同版本可能略有差异,部署前先用实际日志验证。

5.3 一个容易被忽略的细节:HTTPS 重定向

现在大部分网站默认走 HTTPS,Hotspot 的 HTTP 劫持对 HTTPS 请求是无效的。用户如果在浏览器里直接输入https://开头的地址,可能不会触发重定向。解决办法是在无线网络层面做 Captive Portal 探测,让操作系统自动弹出认证页。iOS 和 Android 都有各自的探测机制,RouterOS 的 Hotspot 默认会响应这些探测请求。

如果发现部分设备不弹窗,检查/ip hotspot的login-by里是否启用了http-pap,以及walled-garden里是否放行了操作系统的探测域名。这个细节在项目交付时经常被忽略,导致用户以为网络坏了。

我自己在部署这类方案时,习惯先把最小闭环跑通,再逐步加自定义页面和外部认证,每加一层就测一遍。最怕的是一上来就全套配置堆上去,出了问题不知道是哪一层导致的。另外,认证日志一定要提前规划好采集和存储,后期排查问题时,日志就是唯一的后悔药。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询