分享wifidog的增强版: wifidogx
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 | 截获日志 |
start | wifidogx异常退出后,会将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/loginClientTimeout的意义改为认证后能上网的时间(秒)。
示例:
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 |
token | token |
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(){// ...}
}
分享wifidog的增强版: wifidogx相关推荐
- android 禁用dlsym_[原创] 分享一个最近新撸增强版的绕过Android/iOS的dlopen/dlsym限制的dlfunctions库...
简介 byOpen是一个绕过移动端系统限制的dlopen库. 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持). Android 7以上dl ...
- 小程序 a标签_微慕WordPress小程序增强版V2.0新版上线
2020年7月10日,我进行了一场微信小程序的直播,直播主题:微慕小程序增强版v2.0版新功能说明, 在直播里对微慕增强版v2.0版全面阐述了新版本增加的功能. 微慕小程序增强版定位是使用wordpr ...
- 字符串位加密 php,PHP字符串加密增强版
这篇文章介绍的内容是关于PHP字符串加密增强版,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下为了增加数据的安全性 避免相同字符多次加密得到结果是一致的 可以设置密文有效期 下面列举了一 ...
- 阿里云HBase增强版全文索引功能技术解析
新用户9.9元即可使用6个月云数据库HBase,更有低至1元包年的入门规格供广大HBase爱好者学习研究,更多内容请参考链接 阿里云HBase增强版(Lindorm)简介 阿里云数据库HBase增强版 ...
- Facebook 开源增强版 LASER,可使用90多种语言
为了加速将自然语言处理(NLP)应用到更多的语言,Facebook 开源了增强版 LASER 库,成为第一个成功地与 NLP 社区分享的大型多语种句子表示工具.该工具目前可以使用90多种语言,涉及28 ...
- 小鹏汽车CEO疑似隔空回应偷窃技术传闻;苹果明年新款iPhone将使用增强版5nm芯片;Windows诞生35周年|极客头条...
整理 | 郑丽媛 头图 | CSDN 下载自东方 IC 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 一分 ...
- 优秀课程案例:使用Scratch制作坦克大战增强版!
点击上面微信号关注我关注我哟每天坚持推送文章,争取做到日更,喜欢的可以设置星标,并分享点赞我们的文章,非常感谢大家的支持,您的点击的在看就是我们的动力! 今天我们来分享一个坦克大战增强版.同时大家持续 ...
- 修改app绕过模拟器检测_雷电模拟器(增强版)
雷电模拟器是老牌的安卓模拟器了,功能丰富且操作简单.但是有广告就很难受,不过没广告人家没收入又怎么有资金来维护更新.但是作为极客消费者,我们是不能接受广告的!所以今天给大家带来了增强版的雷电模拟器!! ...
- 解决Flash Player过期的问题——谷歌浏览器Chrome 87.0.4270.0绿色免安装增强版
更新为Chrome 87.0.4270.0绿色免安装版.谷歌浏览器,又称Google浏览器.Chrome浏览器,是谷歌Google推出的一款强大好用的基于Chromium内核的网页浏览器.Google ...
最新文章
- 2018-3-26论文(GWO和WOA)中Table1--Table3中的benchmark函数F1-F23图形
- IRNet:弱监督实例分割 | 步步为营,隔山打牛
- 字符串匹配算法 KMP
- 在java的内存分配中存在下面一些内存划分
- QML for Android 实现二维码扫描(QZXing)
- 玩cf出现outofmemory_完美解决outofmemory|Win7系统CF出现out of memory的解决方法
- 蚂蚁金服入职考试_程序员入职蚂蚁金服被质疑,网友评论人生污点,不把外包当人?...
- BinaryWrite方法输出验证码
- java处理表单变量_jsp处理表单及JS和JAVA变量互传
- 前端Swiper滑动的时候最右一个反弹回去了
- 一阶电路误差分析_PDE有限差分方法(12)——对流方程数值格式的分析方法
- 【JavaScript设计模式】(一)
- oracle的sid如何修改,Oracle数据库修改实例名SID的方法步骤
- HDLC和PPP协议总结
- 23andme的申请流程和注意事项
- 【平衡二叉樹】超市促銷
- 第一章 复数 1-2 复数的几何表示
- HBuilderx 配置多环境发行
- 记一次安装 ubuntu 18.04 双系统 (双硬盘)
- Visual Studio Code修改HTML Snippets插件中默认模板内容
热门文章
- 前端技术基础--笔记
- apache代理503
- js获取PC设备信息,js获取手机设备信息,最全
- python柠檬班第三期错误报告
- 计算机处理io和cpu,虚拟化技术原理(CPU、内存、IO)
- BeanUtils.populate()抛出异常处理
- Photoshop CS4 CS5 CS6永久序列号全面整理
- Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(6) POI检索, 根据地址输入提示检索 Sug
- java版Spring Cloud+b2b2c多商户分布式微服务
- 清华计算机考研报考人数,2020部分院校考研报考人数统计