首先简介一下什么是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. 初识Kafka:构架、生产消费模型以及其他相关概念

    当前使用的事件总线采用的是Kafka分布式消息队列来完成的,近来项目需要接入到事件总线中,故开启了kafka的学习之旅(之前一直在听说kafka这玩意儿,但是学习计划中还没有将它安排进去,借着这个机会 ...

  2. mysql增量备份(2/2)

    前言 这是在百度文库里看到的文章,原名叫做<MYSQL 完全与增量备份及恢复文档 >,是关于完全备份和增量备份以及恢复文档的...... 文档介绍 本文档采用 mysqldump  对数据 ...

  3. B9:备忘录模式 Memento

    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态 UML: 示例代码: class Role { private $hp; pri ...

  4. ArcGIS Engine读取GDB中的Shape

    string gdbPath = @"D:\Documents\ArcGIS\Default.gdb"; FileGDBWorkspaceFactoryClass pFileGDB ...

  5. 用JDOM读取XML文件

    用JDOM读取XML文件需先用org.jdom.input.SAXBuilder对象的build()方法创建Document对象,然后用Document类.Element类等的方法读取所需的内容.IB ...

  6. Loadrunner11之VuGen常用函数lr_user_data_point(一)

    Loadrunner11之VuGen常用函数lr_user_data_point(一) 上一篇 / 下一篇  2011-11-15 00:15:33 / 精华(1) / 置顶(1) / 个人分类:性能 ...

  7. python读取文件下的所有文档

    两类文档存储在两个路径下,假设每类文档有25个文档 def spamTest(): docList = [] classList = [] fullText = [] for i in range(1 ...

  8. 一种在MVC3框架里面设置模板页的方法,不使用_ViewStart

    1.新建MasterFilterAttribute类继承ActionFilterAttribute,重写方法OnActionExecuted ,指定ViewResult的MasterName = &q ...

  9. VS2017、netcore版本更新升级

    VS2017 剩下的就是下一步了. netcore 访问:https://www.microsoft.com/net/download/archives 找到对应版本(最新版本) 下载安装就可以了 装 ...

  10. CSDN开源夏令营 百度数据可视化实践 ECharts(4)

    ECharts知识点总结: 在应用过程中总会遇到一些难以理解的概念和属性,这里就总结了一下比較难的知识点,方便理解概念.进而更好的掌握ECharts. (1)1.  一个完整的option包括什么?能 ...