Portal认证上网多用于WiFi营销,通过接入一个开放的WiFi网络,进行Web认证登陆后放行上网,协会有百来号人,直接公开密码不合适,直接设置成一个开放网络更不合适,必须要做认证之后方能允许上网,Portal认证便是一个很好的选择。先前使用的是iKuai的软路由,iKuai提供了集成Portal认证,我也对协会的网站进行了iKuai认证集成,用户可以直接使用协会网站账号登录上网,但由于种种原因,如今不得不将iKuai撤下,换成OpenWRT路由系统。
OpenWRT安装Wifidog很简单,直接使用opkg安装就行
[root@openwrt ~]# opkg update [root@openwrt ~]# opkg install wifidog
配置
网上有提到Web版的配置工具包也就是luci-app-wifidog,多为用户自行编译,我觉得Wifidog就一个conf文件,没有必要在专门去折腾这给luci-app,事实也证明我花了几个小时在这个包上,最后也没啥结果,还是直接vim /etc/wifidog.conf来的快,wifidog.conf文件只需关注一下几个参数就行了:
GatewayID default
GatewayInterface br-lan
GatewayAddress 10.10.16.1
AuthServer {
Hostname auth.mydomain.com
SSLAvailable no
HTTPPort 80
Path /wifidog/
LoginScriptPathFragment login.php?
PortalScriptPathFragment portal.php?
MsgScriptPathFragment message.php?
PingScriptPathFragment ping.php?
AuthScriptPathFragment auth.php?
}GatewayAddress wifidog所在路由的网关IP
Hostname: 提供验证服务的服务器
SSLAvailable, HTTPPort, Path 分别是验证服务对应的 是否可用https, 访问端口, 路径. 路径必须前后带'/'(如果是根目录则只有'/')
LoginScriptPathFragment 和上面的Path联合后得到的登录页地址
PortalScriptPathFragment 验证成功后的页面地址
MsgScriptPathFragment 消息页地址
PingScriptPathFragment 必须返回 Pong --- 注意大小写一致
AuthScriptPathFragment 返回 Auth: 1 或 Auth: 0 代表验证通过/不通过
使用以下命令在前台启用wifidog, 可以看到详细的日志输出
[root@openwrt ~]# wifidog -f
wifidog启动后, 会主动访问验证服务器确认验证服务器在线
GET /wifidog/ping.php?gw_id=default&sys_uptime=1254&sys_memfree=80884&sys_load=0.54&wifidog_uptime=262 HTTP/1.0" 200 5 "-" "WiFiDog 1.3.0"
用户连接wifi后, 会被引导至登录页
GET /wifidog/login.php?gw_address=10.10.16.1&gw_port=2060&gw_id=default&ip=10.10.16.2&mac=aa:aa:aa:aa:aa:aa&url=http%3A%2F%2Fwww.tianjinkun.com%2F HTTP/1.1
用户登录成功后, 验证服务器生成Token并引导返回wifidog的验证页, 其域名, 端口来自于前面的参数, 而/wifidog/auth?token= 这个是固定的,通过URL传参的方式将Token传递给Wifidog。
GET http://10.10.16.1:2060/wifidog/auth.php?token=fa1a7f7ad3c87f21f6f89b3d474e8c0b
Wifidog拿到token后向验证服务器验证该Token的有效性
GET /wifidog/auth.php?stage=login&ip=10.10.16.2&mac=aa:aa:aa:aa:aa:aa&token=fa1a7f7ad3c87f21f6f89b3d474e8c0b&incoming=0&outgoing=0&gw_id=default HTTP/1.0
验证服务器返回“Auth: 1”表示验证成功,Wifidog引导用户跳转到PortalScriptPathFragment 指定的地址,并放行网络权限完成连接,如果返回“Auth: 0”表示验证失败,将引导用户到MsgScriptPathFragment指定的地址,并继续阻止用户上网。
GET /wifidog/portal.php?gw_id=default HTTP/1.1
GET /wifidog/message.php?message=denied HTTP/1.1
wifidog会定时去验证服务器验证访问有效性,当验证服务器返回“Auth: 0”时将会把用户踢下线,以此实现认证的解除。
GET /wifidog/auth.php?stage=counters&ip=10.10.16.2&mac=aa:aa:aa:aa:aa:aa&token=fa1a7f7ad3c87f21f6f89b3d474e8c0b&incoming=73838&outgoing=13952&gw_id=default HTTP/1.0
验证服务器例子
ping.php
<?php echo "Pong"; ?>
auth.php
<?php echo "Auth: 1"; ?>
portal.php
<?php echo "Auth: 1"; $location = 'Location: http://www.tianjinkun.com'; header($location); ?>
message.php
<?php echo "验证失败,你不能再上网了"; ?>
login.php
<html>
<head>
<title>Portal Login</title>
</head>
<body>
<h2>Login</h2>
<?php
if (isset($_POST['user_name']) && isset($_POST['password'])) {
$user_name = $_POST['user_name'];
$password = $_POST['password'];
if ($user_name == 'husky' && $password == '2233') {
$location = 'Location: http://' . $_POST['gw_address'] . ':' . $_POST['gw_port'] .'/wifidog/auth?token='.md5(time());
echo $location;
header($location);
} else {
echo '<h1>账号错误!</h1><br>';
}
}
?>
<form action="login.php" method="post">
Username:<input type="text" name="user_name"/><br>
Password:<input type="password" name="password"/><br>
<?php
echo '<input type="hidden" name="gw_address" value="'. $_GET['gw_address'] . '"><br>';
echo '<input type="hidden" name="gw_port" value="'. $_GET['gw_port'] . '">';
?>
<input type="submit">
<pre>
<?php var_dump($_GET);?>
</pre>
</body>
</html>只要根据自己已有的系统稍加修改便可实现Portal认证上网。
-
« 上一篇:
Server 2019 部署FTP后无法连接
-
WiFiDog的深入配置,使用HTTPS访问认证服务器
:下一篇 »