首先简介一下什么是Portal认证。Portal认证。通常也会叫Web认证。未认证用户上网时,设备强制用户登录到特定站点,用户能够免费訪问当中的服务。当用户须要使用互联网中的其他信息时,必须在门户站点进行认证。仅仅有认证通过后才干够使用互联网资源。

现金非常多中国移动CMCC、中国联通、中国电信ChinaNet的WIFI都使用这样的认证接入方式。

在OpenWRT上实现Portal认证,实际上早已有解决方式:

1. chillispot,但原维护作者停止更新。被chillispot.info接管继续开发;

2.coova-chilli,它是基于chillispot开发拓展的,功能最为强大;能够去官方看一下Coova-chilli;

3.wifidog

前两个因为原维护作者停止更新。笔者也没有深入研究,重点钻研了wifidog,Wifidog也是OpenWRT和DD-WRT中实现Portal比較出名的。

可是。Wifidog仅仅是实现AP认证网关,须要配合外部的Portalserver才干使用。Portal主要是提供认证所需的WEB页面且实现认证计费等的功能。尽管这也有非常多商用解决方式,比如wiwiz、wifiap等,可是这些商业解决方式的目标都是盈利。即使能够免费使用。免费账号的功能和权限都受到了非常大的限制,比如不能自己定义页面。Web认证页面有广告等等。有条件的人可能打算自己搭建Portalserver。可是看看Wifidog的官方Wiki。对搭建过程实在是难以理解。后来,笔者发现网络上另一个authpuppy方案,官方站点www.authpuppy.org。是一个已实现好的Wifidog认证server,里面包括各种插件供你使用,官方的安装过程也非常easy,假设你懂的HTML和面向对象编程的相关知识且拥有一个server,能够自行改动认证页面。使用authpuppy也是一个不错的方案。

可是。即便如此,这些方案还是不够灵活,经过笔者认真钻研。查阅大量资料并经过多次抓包分析,最终理解了Wifidog的工作原理。

接下来笔者将会跟你介绍怎样自行编写一个轻量级的Web Portal认证server。当然。这须要你具有程序设计基础,HTML、CSS当然是少不得的。后端开发语言能够使用PHP或Python或Java等。

首先,须要简介一下Wifidog的工作原理:

1.client发出初始化请求,比方訪问 www.baidu.com

2.网关的防火墙规则将这个请求重定向到本地网关的port上。这个port是Wifidog监听的port。

3.Wfidog提供一个HTTP重定向回复,重定向到Web认证页面。重定向的Url的Querystring中包括了Gateway的ID,Gateway的FQDN以及其它的信息。

4.用户向认证server发出认证请求

http://portal_server:port/login_script?

gw_id=[GatewayID, default: "default"]

gw_address=[GatewayAddress, internal IP of router]

gw_port=[GatewayPort, port that wifidog Gateway is listening on]

url=[user requested url];

5.网关返回一个(能够是自己定义的)splash(也称作“登录”)页面。

6.用户提供他的凭据信息,比方username和password。

7.成功认证的话,client将会被重定向到网关的自己的web页面上,而且带有一个认证凭据(一个一次性的token),内容比方:

http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token];

8.用户就是用获取到的凭据訪问网关。

9.网关去认证server询问token的有效性。

10.认证server确认token的有效性。

11.网关发送重定向给client。以从认证服务器上获取 成功提示页面,重定向到 http://portal_server:port/portal_script 这个位置。

12.认证server通知客户请求成功,能够上网了。

图解:

然后考察一下Wifidog的配置文件/etc/wifidog.conf,关键的配置项是:

AuthServer {

Hostname             (Mandatory; Default: NONE)

SSLAvailable           (Optional; Default: no; Possible values: yes, no)

SSLPort               (Optional; Default: 443)

HTTPPort             (Optional; Default: 80)

Path                  (Optional; Default: /wifidog/ Note:  The path must be both prefixed and suffixed by /.  Use a single / for server root.)

LoginScriptPathFragment  (Optional; Default: login/?

Note:  This is the script the user will be sent to for login.)

PortalScriptPathFragment (Optional; Default: portal/? Note:  This is the script the user will be sent to after a successfull login.)

MsgScriptPathFragment    (Optional; Default: gw_message.php? Note:  This is the script the user will be sent to upon error to read a readable message.)

PingScriptPathFragment    (Optional; Default: ping/?

Note:  This is the script the user will be sent to upon error to read a readable message.)

AuthScriptPathFragment    (Optional; Default: auth/?

Note:  This is the script the user will be sent to upon error to read a readable message.)

}

# Listen on this port

GatewayPort 2060

# Parameter: CheckInterval

# Default: 60

# Optional

#

# How many seconds should we wait between timeout checks.  This is also

# how often the gateway will ping the auth server and how often it will

# update the traffic counters on the auth server.  Setting this too low

# wastes bandwidth, setting this too high will cause the gateway to take

# a long time to switch to it’s backup auth server(s).

CheckInterval 60

# Parameter: ClientTimeout

# Default: 5

# Optional

#

# Set this to the desired of number of CheckInterval of inactivity before a client is logged out

# The timeout will be INTERVAL * TIMEOUT

ClientTimeout 5

AuthServer是Portalserver的配置项。GatewayPort是Wifidog监听的地址。默认是2060。一般保持默认就可以;CheckInterval是心跳时长。单位是秒。什么是心跳呢,client认证成功之后,假设有网络訪问动作,Wifidog getway就会每隔一段时间訪问Portalserver的一个脚本。用于认证计费。当然。假设客户使用超时或超流量,也能够通过心跳强制client下线。ClientTimeout是用户一次认证成功后的网络訪问时长,超过这个时间须要又一次认证,这个时长并不是由ClientTimeout单独决定。取决于INTERVAL
* TIMEOUT。

具体的配置信息能够訪问:http://dev.wifidog.org/browser/trunk/wifidog/wifidog.conf

我们重点讨论Portalserver的配置项,Hostname是Portalserver的ip或者是域名。SSLAvailable和SSLPort是SSL加密配置,假设你的Portalserver有配置HTTPS加密,则须要配置这两项。Path是指你的脚本路径(举例。http://a.com/to/,则a.com是域名。/to/是路径),注意路径必须以“/”开头和结尾,假设是根路径。则填一个“/”就可以;接下来的5个配置指明你的脚本名,这说明了我们须要写五个脚本,我会具体说明。

(下面文中涉及的“第几步”均是指Wifidog认证过程的步骤)

LoginScriptPathFragment配置项配置的是登陆脚本,它通过GET方式接受传入參数gw_address、gw_port、gw_id、mac和url。gw_address是AP Getway的ip地址;gw_port是Wifidog监听的端口。即上面介绍的wifidog.conf中的GatewayPort配置;gw_id是AP Getway的id。配置文件wifidog.conf中能够配置,默认值是default,这个值的作用是当存在多个AP是,server或管理员能够依据不同的id确定用户的接入点;mac是客户计算机的网卡物理地址。注意不是AP网关的mac。这个mac是用来识别客户计算机的;url是客户初始訪问的Url。这些Querystring都是AP
Getway向client发出重定向请求自己主动生成的。

这个脚本同一时候须要提供登陆页面,假设登陆成功,须要向客户。端返回302重定向,重定向到:http://gw_address:gw_port/wifidog/auth?

token=[token];即实现第7步。当中[token]是你自己自己主动生成的token字符串,随机生成一个字符串就可以,可是长度最好长些,安全性更高,另外,token须要依据不同用户保存,最好保存于数据库中,之后的AP Getway询问token有效性(第9步)还须要用到。这里最好使用cookie或session,使之后的登陆成功页面能够推断用户已经成功,阻止未登录成功的人訪问认证成功页面。

PortalScriptPathFragment配置项配置的是登陆成功后server展示的脚本(第11步),它通过GET方式接受1个传入參数,gw_id。这个脚本比較简单。告知用户登陆成功就可以,当然,最好重定向到用户之前想要方位的url。即第1步用户输入的URL。

MsgScriptPathFragment配置项配置的是错误信息展示脚本,它通过GET方式接受一个传入參数message,这个脚本也非常easy,展示message的内容就可以。目的是当认证过程出现错误,AP Getway会重定向到这个脚本,URL中含有错误的信息。

PingScriptPathFragment配置项配置的是心跳脚本。这个脚本它通过GET方式接受5个传入參数,gw_id,sys.uptime,sys.memfree,sys.load,wifidog.uptime,当中,sys.uptime指的是AP Getway的启动时间。sys.memfree指的是AP Getway的空暇内存,sys.load指的是AP Getway的CPU负载。wifidog.uptime指的是wifidog的启动时间,这个脚本每隔一段时间(Wifidog.conf里配置的CheckInterval),Wifidog会自己主动訪问,可是其目的不是用户验证,而是帮助管理员管理AP节点,了解AP节点的负载情况,适时添加节点等,Wifidog訪问这个脚本时,须要这个脚本返回Pong。假设你没有统计AP节点负载数据的需求,能够丢弃这些数据。直接回应Pong,注意,这个回应仅仅包括“Pong”字符串。无需包括其它html标签。

AuthScriptPathFragment是用户认证脚本。实现的是第10步的功能。这个脚本它通过GET方式接受7个传入參数:stage、ip、mac、token、incoming、outcoming和gw_id。当中stage的值是login,ip是client的ip,注意不是AP Getwap的ip;mac是client的网卡物理地址。token就是你在认证脚本生成并返回给client的。incoming和outcoming用于流量控制,默认值为0;gw_id同上。

怎样识别用户登录成功,通过mac和token吧,LoginScriptPathFragment登陆脚本在用户登陆成功后须要记录用户的mac和token。然后在此处验证,假设匹配。回复Auth:
1,否则。回复Auth: 0。

另外,这个脚本也是心跳脚本。每隔一段时间Wifidog会自己主动訪问,假设用户使用时间超过限制或流量超过额度。server能够及时回应Auth: 0结束用户的訪问。

另外须要注意的是。回应相同无需包括html标签,另外,在Auth后的冒号和0/1之间,有一个空格,缺少这个空格也会导致出错。

在配置Wifidog的配置文件wifidog.conf是。配置脚本的配置项都必须以“?

”结尾,否则以GET方式传递的QueryString会因Url缺少问号訪问错误的脚本。

看到了吧。只5个简单脚本。就能够实现利用Wifidog的Portal认证,当然。这过中还能够有非常多应用尚未发掘,比方流量控制、带宽控制、结合Radiusserver实现认证等。你的开发也能够更上一层楼。实现很多其它功能。只是笔者另一个建议。在登录页面除了username和password意外,最好加个验证码,防止不怀好意之人暴力破解。

这样,你仅仅须要一个免费的空间,甚至是简单的百度云、新浪SAE等。就能够实现一个认证server。有的人可能还会问,能不能把这些脚本集成到路由器其中,我的回答是能,仅仅要你的脚本的功能不多。问题应该不大,可是这么做的风险比較大,路由的负载比較高,导致路由的执行会非常不稳定,甚至常常死机,这也是笔者亲身实践的结果,所以笔者不建议这么做。

最后啰嗦提醒的是,WiFidog是使用iptables基于三层协议工作的,所以使用Wifidog的结果是。不仅是Wifi接入须要Portal认证,有线接入相同须要认证。

避免这样的情况最简单的做法是设立mac白名单。可能有的人又会问。能不能做到仅是Wifi接入须要认证,有线接入的无需认证。有的人可能想更上一层楼,能不能开两个Wifi,仅当中一个Wifi须要认证,还有一个Wifi和有线网络不须要Portal认证,我的回答是能。至于详细做法,以后再介绍。

wifidog 认证的更多相关文章

  1. 家用环境下部署wifidog认证服务器(java版)

    本文所讲的是基于一个java版wifidog认证服务器的开源项目,在windows环境下搭建wifidog认证服务器配合apfree固件实现用户名密码的认证. 大致步骤如下: 一,准备 1.搭建硬件及 ...

  2. 在SuSE安装wifidog认证服务器和网关

    在SuSE安装认证服务器和网关 在openSuSE 10.3安装wifidog 认证服务器和网关在同台设备中安装完毕.以下是openSuSE的详细安装指南.这个安装是非常初级的,所以请验证或更正. - ...

  3. wifidog源码分析 - 用户连接过程

    引言 之前的文章已经描述wifidog大概的一个工作流程,这里我们具体说说wifidog是怎么把一个新用户重定向到认证服务器中的,它又是怎么对一个已认证的用户实行放行操作的.我们已经知道wifidog ...

  4. OpenWRT下实现Portal认证(WEB认证)

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

  5. wifidog用php实现验证流程

    原创性声明 此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/25384909假设进行转载请注明出处.本文作者原创,邮箱zhujunx ...

  6. java4wifidog_server_README

    项目地址:https://github.com/C-hill/java4wifidog_server 开发环境:Windows  JDK7  Tomcat6  Myeclipse8.5  MySQL5 ...

  7. wifidog源码分析 - 认证服务器心跳检测线程

    引言 但wifidog启动时,会自动启动认证服务器心跳检测线程,此线程默认每隔60s与认证服务器交互一次,会将路由器的信息(系统启动时长,内存使用情况和系统平均负载)告知认证服务器,并通过一个&quo ...

  8. Wifidog及认证过程初分析

    Wifidog初分析 一.综述 wifidog是搭建无线热点认证系统的解决方案之一,他比nocat.nodog更适合互联网营销思路.常见的使用在openwrt系统上,它实现了路由器和认证服务器的数据交 ...

  9. asp.net MVC 使用wifidog 协议实现wifi认证

    在网上看到的很多实现的wifidog 协议一般都是PHP 的,了解一下PHP 但是比较喜欢.net ,所以实现了简单的一个进行登录认证的功能 (好多协议中的功能目前没有实现) 1. 开发环境(vs20 ...

随机推荐

  1. Java中的值传递与“引用传递”

    首先,Java没有 引用传递 这么一说. Java仅仅有值传递.传递的都是值,基本数据类型传递的是值.引用类型传递的是地址值. 我来理一下这当中宛如米线跟米面绞在一起了,再跟粉丝混在一起的关系. 好的 ...

  2. 倍福TwinCAT(贝福Beckhoff)应用教程13.1 TwinCAT控制松下伺服 NC高级

    本节主要演示了使用自定义函数实现电机的运动(梯形曲线和S曲线都有实现),这里的JOG+和JOG-,针对单个关节实现了PTP的运动(跟贝福的MoveAbsolute功能块实现效果一致),在此没有介绍运动 ...

  3. 序列化和反序列化Java 8的时间/日期类

    序列化 假如有 Clock 类: public class Clock { private LocalDate localDate; private LocalTime localTime; priv ...

  4. 【BIEE】14_开发流程介绍

    以上是BIEE开发的流程图,通过流程图我们可以看出在BIEE中存在以下主要内容: 仪表盘 仪表盘页 分析 仪表盘提示 主题区域 Catalog RPD 以下是一些文件以及资料库存储路径 资料库存储路径 ...

  5. linux小技巧(1)

    1.避免文件夹拼写错误 shopt命令: 演示一下: 我想进入/home文件夹可是不小心拼写错了: [fulinux@ubuntu ~]$ cd /hoem-bash: cd: /hoem: No s ...

  6. 华为AR路由器AR207-S配置pppoe拨号上网图解实例

  7. jQuery中事件绑定

    一.前言 最近在做项目中要用到jQuery来绑定事件,首先想到的是$(selector).事件名();这样绑定事件的方式,这种方式对事件进行绑定其实也就是bind()方法,但当选择器匹配的元素过多,$ ...

  8. JsCal( JS Calendar)

    http://www.dynarch.com/projects/calendar Doc: http://www.dynarch.com/jscal/ This is the documentatio ...

  9. [转载]几个开源Javascript图形库

    [转载]原文地址:http://www.cnblogs.com/webgis8/articles/1516639.html 因为Google Map项目的需要,最近一直在寻求相关的Javascript ...

  10. OpenURL的一些用法

    openURL的使用方法: view plaincopy to clipboardprint? [[UIApplication sharedApplication] openURL:[NSURL UR ...