j同学前阵子有段时间在维护wifidog,然后就重复发明了个轮子:wifidogx。当然也不能算完全重复,j同学认为以下几方面wifidog做的不是很好:
wifidogx差不多克服了上面所有的缺点,来掰一掰吧:
wifidogx目前处于alpha版本,可能bug还比较多,但是j同学会一直维护。另外,wifidogx采用MIT许可证。
本质上wifidogx不需要编译,其编译实际上是安装过程。
目前不支持restart哦
选项 | 含义 |
---|---|
-a | 认证路径,会覆盖配置文件中的AuthURL |
-c | 配置文件路径,默认为/etc/wifidogx.conf |
-f | 不要以守护进程的方式运行 |
-p | 日志路径 |
-l | 日志等级 |
-t | 测试配置文件是否正确 |
-I | 初始化防火墙规则后退出 |
-D | 销毁防火墙规则后退出 |
-h | 帮助信息 |
-v | 显示版本 |
命令 | 作用 |
---|---|
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来禁用此功能。
文件名 | 错误原因 |
---|---|
netdown.htm | 外网不通 |
serverunreach.htm | 有外网但认证服务器连不上 |
servererror.htm | 服务器返回的数据不对 |
internalerror.htm | 路由器系统/wifidogx 内部错误,如arp表中根据来访的ip找不到mac |
一些典型的StaticGZ用法:
- 替换wifidogx的错误提示页面。
- 缓存login等页面上的图片。
- 指定RedirectHostname为GatewayAddress,完全进行本地推送认证页面。
不再支持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的通信技术需求应当有以下几方面:
请在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,其他值不合法。
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()
{
// ...
}
}