分享wifidog的增强版: wifidogx

news/2025/2/22 21:07:45/

j同学前阵子有段时间在维护wifidog,然后就重复发明了个轮子:wifidogx。当然也不能算完全重复,j同学认为以下几方面wifidog做的不是很好:

  • 多线程的架构欠佳,性能不强,健壮性也不好,坑还多。(LOCK_CLIENT_LIST,LOCK_CLIENT_LIST,LOCK_CLIENT_LIST,讨厌的事情也说三遍)。
  • 通信协议过于简单,与服务端交互效率不高,服务端的远程控制能力也不好。
  • 在已认证用户比较多的时候,对mac地址进行逐一规则匹配会降低路由器的包处理能力。不过j同学目前还没有实验数据。
  • 不支持https。
  • c语言开发效率低。虽然比j同学更懒的人不多,但是反复枯燥的交叉编译-远程复制-opkg install,即便是勤奋的你也会厌烦的。

wifidogx差不多克服了上面所有的缺点,来掰一掰吧:

  • 单线程架构,采用epoll来支持并发。
  • 采用新的认证通信协议。
  • 提供以ipset的方式进行防火墙规则管理(需要6.22及以上版本,并且j同学目前还不知道怎么做流量统计)。
  • 与认证服务器的通信支持https。
  • 全部用lua开发。
  • 以及一个小小的bonus: 支持简单的静态文件服务。
    wifidogx目前处于alpha版本,可能bug还比较多,但是j同学会一直维护。另外,wifidogx采用MIT许可证。

下载,编译,运行

wifidogx依赖于j同学开发的一个基于lua的工具包[lask](https://github.com/spyderj-cn/lask)。 lask导出了常用的posix api,并提供了一个异步通信框架。

下载

git clone https://github.com/spyderj-cn/wifidogx.git

编译

Wifidogx中(只)包含了支持openwrt的makefile文件,将源码包放在某个src-link的的目录下即可。 同wifidog一样,wifidogx也在menuconfig的/Network/Captive Portals栏目下。

本质上wifidogx不需要编译,其编译实际上是安装过程。

运行

启动
/etc/init.d/wifidogx start
停止
/etc/init.d/wifidogx stop

目前不支持restart哦


Wifidogx详细的启动参数
选项含义
-a认证路径,会覆盖配置文件中的AuthURL
-c配置文件路径,默认为/etc/wifidogx.conf
-f不要以守护进程的方式运行
-p日志路径
-l日志等级
-t测试配置文件是否正确
-I初始化防火墙规则后退出
-D销毁防火墙规则后退出
-h帮助信息
-v显示版本
wdxctl(对应wdctl)工具
命令作用
clients获取连接了wifi的用户信息
jclients获取连接了wifi的用户信息(json输出)
logread当日志保存在wifidogx内存中时,读取日志
logcapture截获日志
startwifidogx异常退出后,会将traceback和日志分别保存到/tmp/wifidogx.traceback和/tmp/wifidogx.logdump,然后执行wdxctl start。wdxctl start先尝试将错误信息文件POST到指定的bugreport_url,然后删除文件,接着执行/etc/init.d/wifidogx start。

可以修改wdxctl.lua的BUGREPORT_URL为你的服务器URL, 也可以设置为false或者nil来禁用此功能。


文件服务

wifidogx启动后检查/tmp/wifidogx-www是否存在,如果不存在则将/etc/wifidogx-www下的所有内容 复制到/tmp/wifidogx-www,并以/tmp/wifidogx-www为docroot开启文件服务。 如果来访的URL是“/wifidogx-static/*”格式则视其为请求静态文件。 当错误发生时,wifidogx自动回送/tmp/wifidogx-www目录下的以下文件
文件名错误原因
netdown.htm外网不通
serverunreach.htm有外网但认证服务器连不上
servererror.htm服务器返回的数据不对
internalerror.htm路由器系统/wifidogx 内部错误,如arp表中根据来访的ip找不到mac
在后续和服务器的通信中,如果服务器的应答配置了StaticGZ, 则wifidogx根据StaticGZ指定的URL下载该压缩包,并将压缩包的内容解压到/tmp/wifidogx-www中。

一些典型的StaticGZ用法:

  • 替换wifidogx的错误提示页面。
  • 缓存login等页面上的图片。
  • 指定RedirectHostname为GatewayAddress,完全进行本地推送认证页面。

配置文件

配置文件中的选项,大部分都可以由认证服务器动态修改,除了以下几项: AuthURL GatewayID (可选) GatewayPort (可选) GatewayAddress GatewayInterface ExternalInterface (可选) Firewall Rules (这一项也应当被动态修改,但是j同学还没想好具体做法)

一些改动

  • 不再支持AuthServer块和多个认证服务器,只支持单个AuthURL。

    (如有特殊字符请先编码,wifidogx不自动进行url编码。)
    示例:
    AuthURL https://mysite.com:8888/index.php?s=/Wifidogx/auth

  • 重定向服务器可以和认证服务器不同,由RedirectHostname指定。

    RedirectPort指定跳转端口,默认为80。
    几个跳转路径分别由PortalPath/MessagePath/LoginPath指定。
    (PortalPath/MessagePath/LoginPath尾部的&(或?)是必要的;并且如有特殊字符请先编码)。
    示例:
    RedirectHostname www.mysite2.com
    PortalPath /index.php?s=/Wifidogx/portal
    MessagePath /index.php?s=/Wifidogx/message
    LoginPath /index.php?s=/Wifidogx/login

  • ClientTimeout的意义改为认证后能上网的时间(秒)。

    示例:
    ClientTimeout 7200

  • 添加PingInterval字段,意义是和服务器的心跳间隔(秒)。

    示例:
    PingInterval 30

  • 配置文件中的黑白MAC名单将被忽略。


通信协议

技术特点

通信过程是wifidogx和wifidog区别最大的一块,j同学认为wifidogx的通信技术需求应当有以下几方面:


  • 能进行批量认证,数据采用json编码,使用post方法发送http请求。
  • 数据量比较大的时候使用gzip压缩。
  • 最多只和认证服务器建一条tcp连接,所有认证都通过这条连接进行。
  • 报文的发送间隔和远程控制的延时成正比。因此心跳间隔不适合太大,并且双方的http报文应启用keep-alive。

请在http应答中指定Content-Length为实际长度,或者启用Chunked的传输编码,wifidogx无法自动探测消息体的结束。

请求

报文示例
{"id": "11:11:11:11:11:11""version": "1.0.0","clients": [{"mac" : "11:11:11:11:11:12""ip" : "192.168.1.123","token" : "whateverthetokenis","state" : "authed","incoming" : 1111,"outgoing" : 2222,"starttime" : 1234,},{"mac" : "11:11:11:11:11:13"...},...],"uptime": 333,"seq": 20,"sys_uptime" : 123132,"status": {"sys_memfree":9284,"sys_load":"0.03"},  
}
字段意义详解

*表示必需的,非必需项的属性名可以不存在,也可能其值为false或者{}

字段名说明
id*即GatewayID,若无指定则是GatewayInterface的mac地址
version*wifidogx版本号
uptime*wifidogx启动后经过的秒数
sys_uptime*系统启动后经过的秒数(即/proc/uptime)
seq*报文序号,每成功完成一次http交互后加一,初始为0
clients需要认证处理的用户信息
status当前系统状态



clients为用户信息数组,每个元素的各字段意义是:

字段名说明
mac用户mac
ip用户使用的ip
tokentoken
state当前状态
starttime进入此状态的时间戳(自系统启动),即sys_uptime - starttime为状态已持续时间
outgoing发送的流量
incoming接收的流量



几种状态:

状态名称解释
login用户还未认证,防火墙规则未放行
authed已认证,已放行
logout认证期已过,规则已关,通知了认证服务器后此用户信息会被删除

应答

报文示例
{"config":{"ClientTimeout":7200,"PingInterval":20,"CheckInterval":300,"StaticGZ":"http://mysite.com/Public/wifidogx.tar.gz","SetWhiteMaclist":["9c:c1:72:5e:51:49","11:11:11:11:11:12"],"SetBlackMaclist":["11:11:11:11:11:13","11:11:11:11:11:14"],"GreenHostname" : ["www.baidu.com", "1.2.3.4"]},"clients":[{"mac":"08:7a:4c:8a:c1:62","auth":1}]
}
配置项

当应答中指定了config时,wifidogx将立即接受这样配置并予以生效。
这些是wifidogx新增的配置项:

配置名解释
StaticGZ见文件服务部分
SetWhiteMaclist设置白名单
AddWhiteMaclist添加白名单
DelWhiteMaclist删除白名单
SetBlackMaclist设置黑名单
AddBlackMaclist添加黑名单
DelBlackMaclist删除黑名单
GreenHostname无论是否认证都可直接访问的主机名
认证结果

wifidogx不支持wifidog的试用期功能,认证结果只能是1或者0,其他值不合法。

附录

服务端开发示例

PHP版本(基于ThinkPHP)

wifidogx的AuthURL指定为 http://mysite.com/index.php?s=/Wifidogx/auth

class WifidogxAction extends Action
{public function auth(){$resp = array();$req = false;$content = file_get_contents('php://input');if ($content && $_SERVER['CONTENT_ENCODING'] && strpos($_SERVER['CONTENT_ENCODING'], 'gzip') !== false)$content = gzdecode($content);if ($content)$req = json_decode($content);if (!$req || !$req->id)return;if ($req->seq == 0) {$resp['config'] = array('ClientTimeout' => 7200,'PingInterval' => 20,'CheckInterval' => 300,'StaticGZ' => 'http://mysite.com/Public/wifidogx.tar.gz','SetWhiteMaclist' => array('9c:c1:72:5e:51:49', '11:11:11:11:11:12'),'SetBlackMaclist' => array('11:11:11:11:11:13', '11:11:11:11:11:14'),'RedirectHostname' => 'mysite.com','LoginPath' => '/index.php?s=/Wifidogx/login&','MessagePath' => '/index.php?s=/Wifidogx/message&''PortalPath' => '/index.php?s=/Wifidogx/portal&');}if ($req->clients) {$clients = array();foreach ($req->clients as $client) {$clients[] = array('mac' => $client->mac,'auth' => 1,);}$resp['clients'] = $clients;}$json_resp = json_encode($resp);header('Content-Length: ' . strlen($json_resp));header('Content-Type: application/json');echo $json_resp;}public function login(){// ...}public function message(){// ...}public function portal(){// ...}
}

http://www.ppmy.cn/news/675973.html

相关文章

wifidog 认证

首先简单介绍一下什么是Portal认证,Portal认证,通常也会叫Web认证,未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其中的服务。当用户需要使用互联网中的其它信息时,必须在门户网站进行认证…

wifidog安装以及自写wifidog认证服务器

前言 最近在做关于路由器认证相关的工作,由于需求,认证的过程同往常的网页认证有稍许不同,因此,自己开始尝试编写wifidog的认证服务器,查阅了中外的一些资料,现将经验总结一下。 Wifidog的原理 下图是在…

Wifidog入门教程

曾经撸了两台K2路由器,刷成了华硕固件。以前就比较好奇什么肯德基,星巴克那种连上wifi就弹出一个页面进行验证什么的,是怎么弄的,昨天发现这个华硕固件里有这个功能,就是wifidog。 首先来看截图: 这里打开w…

利用Wifidog实现微信wifi连接

前言 大家如果有用公共场合wifi的习惯,想必都有过如下的体验。 这就是利用微信身份来进行wifi连接认证,主要目的是商家为了吸引顾客,推广其公众号。别的也不多说,下面就来讲一讲怎么实现这样的wifi认证方式。 本篇文章要讲的是por…

wifidog浏览器弹窗认证 — 基于OpenWRT路由器

一、移植 wifidog功能 1、功能介绍 wifidog是一种能够实现让路由器局域网设备(包括wifi连接和网线连接设备)在上网前先进行 portal认证的工具,主要应用于手机端上网认证,手机在连接wifi后会自动打开浏览器并跳转出 login界面,用户在该页面上…

Wifidog扫盲篇

何谓wifidog?wifidog即利用iptables规则结合认证服务器可以管理上网客户端的东东。 当然管理客户端一定是需要认证服务器吗?有个仿wifidog的nodogsplash地址如下 https://github.com/nodogsplash/nodogsplash官网的wifidog代码比较少,复杂度也一般功能部分无非有以…

无线热点认证解决方案 WifiDog

WifiDog 是一款开源的用来实现无线认证的软件,可以集成到路由器或者网关中,对于连接到路由器或者网关的设备,使其先登录云端认证服务器,然后通过认证才能上网。比如在星巴克上网,浏览器会先弹出一个广告页面&#xff0…

wifidog基础

定义: wifidog是路由器的一种上网认证功能, 如果开启此功能, 所有通过路由器上网的设备(电脑,笔记本,手机等)都会跳转到指定的界面, 需要通过某种方式认证才可以上网.目前支持DD-WRT以及OPEN-WRT系统,他实现了路由器和认证服务器的数据交互,…