OpenWrt 集成 openNDS 进行 强制门户(Captive Portal) 认证
OpenWrt 集成 openNDS 进行 强制门户(Captive Portal) 认证
openNDS 是一个高性能、轻量级的强制门户(Captive Portal)解决方案。它的核心作用是在公共Wi-Fi网络中,作为一道“看门人”,在设备获得完整互联网访问权限之前,先向用户展示一个特定的登录或通知页面(也就是我们常说的“认证页”或“Splash Page”)。
具体来说,它的作用和价值体现在以下几个方面:
🚪 核心作用:公共网络接入管理
它主要扮演一个“边界控制网关”的角色,用于管理从公共局域网到互联网的访问。这个过程通常是自动触发的:
-
自动拦截:当你的手机或电脑连接到一个由openNDS管理的Wi-Fi网络时,几乎所有现代设备都会自动发起一个网络请求(Captive Portal Detection,CPD)。
-
展示页面:openNDS会识别并拦截这个请求,然后向你的设备推送一个“Splash Page”。
-
授予权限:你在页面上完成所需的操作(比如点击“继续”按钮、同意条款或输入凭证)后,才能获得完整的互联网访问权限。
✨ 两种开箱即用的方式
为了适应不同场景,openNDS默认提供了两种简单的方式:
-
“点击继续”(Click to Continue):这是默认模式。用户连接网络后,只需点击一个按钮(比如“我同意条款”)即可上网,主要用于告知服务条款和记录基本设备信息。
-
用户名/邮箱登录(username/email-address login):用户需要输入用户名和邮箱地址才能继续。这种方式可以用于收集用户信息,便于后续统计或营销,同时也能记录访问日志。
🛠️ 为什么值得关注:功能强大的“引擎”
openNDS的独特之处在于,它不仅仅是一个简单的页面显示工具,更是一个功能强大的开发平台,被设计为复杂认证系统的“引擎”。这得益于它提供的几个关键API:
-
Forward Authentication Service (FAS):这是最主要的认证服务。它允许你把认证页面放在一个独立的网络服务器上(可以是在路由器本地、局域网内,甚至是云端),从而实现高度定制化的登录逻辑。
-
PreAuth:可以看作是FAS的轻量级版本。认证页面直接由openNDS自带的web服务器生成,无需额外搭建独立服务器,非常适合那些硬件资源(如内存、闪存)有限的路由器。
-
BinAuth:一种后认证脚本。当用户认证成功后,可以触发执行一个自定义的脚本或程序,用于实现更复杂的后续操作,比如统计流量、设置带宽限制等。
📜 项目起源:与NoDogSplash的渊源
openNDS源自一个叫NoDogSplash的老牌强制门户项目。后来开发者为了能更专注于开发和创新,决定将其拆分为两个项目:
-
openNDS:目标是开发定制化、功能丰富的强制门户解决方案,也就是现在我们在讨论的这个。
-
NoDogSplash:则专注于保持极简和轻量,以兼容硬件资源极其有限的旧设备。
所以,可以简单地把openNDS理解为NoDogSplash的“进化加强版”,它在易用性的基础上,提供了更广阔的开发和定制空间。
支持 流量配额 上下行限速 以及 通过 FAS 集成 Radius 计费
-
流量配额:支持对单个客户端设置上传和下载的数据总量配额,单位是KB。当客户端使用量超过配额后,会被强制下线,需要重新认证才能继续上网。
-
上下行限速:支持限制客户端的上下行速率,单位是Kb/s。它内置了动态令牌桶过滤器,允许客户端在短时间内突发高速传输(比如快速加载网页),但如果平均速率持续超过阈值,就会开始限速,从而实现“公平使用策略”。你还可以通过配置OpenWrt的SQM(智能队列管理)软件包来实现更精细的流量整形。
-
通过FAS集成Radius计费:这是可行的,主要通过以下两种方式实现:
-
FAS (Forward Authentication Service) 的三种级别:
-
级别 3 (fas_secure_enable=3):这是最标准的方式,使用Authmon守护进程。FAS可以决定每个客户端的配额和速率,并覆盖全局配置,是实现与Radius等外部认证系统集成的推荐路径。
-
级别 0, 1, 2:在这些级别下,也可以通过BinAuth脚本或
ndsctl auth命令来传递并覆盖配额和速率值。
-
-
BinAuth (二进制认证) 脚本:BinAuth是openNDS内置的“后认证”脚本机制,在客户端认证、下线、配额用完等事件发生时被调用。通过编写自定义的BinAuth脚本,你可以:
-
动态下发策略:脚本可以解析从FAS传来的自定义变量,从而覆盖单个客户端的会话时长、数据速率和数据量配额。
-
响应配额事件:当客户端的下载或上传配额用尽时,BinAuth会收到
downquota_deauth或upquota_deauth事件,此时脚本可以执行你定义的操作,比如与Radius服务器进行计费结算。
-
-
⚙️ 配置示例
你可以通过编辑 /etc/config/opennds 文件来设置全局的流量配额和速率限制:
# 全局数据量配额 (单位: KB)
option uploadquota '512000' # 上传配额 500MB
option downloadquota '1024000' # 下载配额 1GB
# 全局数据速率限制 (单位: Kb/s)
option uploadrate '2000' # 上传速率限制为 2Mb/s
option downloadrate '5000' # 下载速率限制为 5Mb/s
# 速率计算窗口 (秒)
option ratecheckwindow '2'
请注意:在openNDS的语境中,"上传"指的是客户端向互联网发送数据,"下载"指的是客户端从互联网接收数据。你可以在社区论坛找到更详细的讨论,例如关于配置配额后是直接断网还是降低速率的方案。
Windows 系统电脑 和 iOS 苹果手机 连接这个网络 进行 强制门户(Captive Portal) 认证
支持主流系统(Windows、Apple iOS、Android 等)的网络探测与认证门户(Captive Portal)检测流程,设备系统无需安装任何第三方软件。支持本地流量配额和限速,配合FAS可实现远程统一云计费和限速。
当前的OpenNDS集成了preauthenticated_fqdn_list(预认证客户端的条件FQDN访问)功能,可以理解是一个白名单功能,用于在未登录的情况仅能访问指定URL的充值网站,反馈网站等,提升用户体验。


============ End

浙公网安备 33010602011771号