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

首先简单介绍一下什么是Portal认证,Portal认证,一般也会叫Web认证,未认证用户上网时,设备强制用户登陆到特定站点,用户能够免费访问其中的服务。当用户须要使用互联网中的其它信息时,必须在门户网站进行认证,只有认证经过后才可使用互联网资源。现金不少中国移动CMCC、中国联通、中国电信ChinaNet的WIFI都使用这种认证接入方式。php

 

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

1. chillispot,但原维护做者中止更新,被chillispot.info接管继续开发;java

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

3.wifidog数据库

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

可是,Wifidog只是实现AP认证网关,须要配合外部的Portal服务器才能使用,Portal主要是提供认证所需的WEB页面且实现认证计费等的功能。虽然这也有不少商用解决方案,例如wiwiz、wifiap等,可是这些商业解决方案的目标都是盈利,即便能够无偿使用,免费帐号的功能和权限都受到了很大的限制,例如不能自定义页面,Web认证页面有广告等等。有条件的人可能打算本身搭建Portal服务器,可是看看Wifidog的官方Wiki,对搭建过程实在是难以理解。后来,笔者发现网络上还有一个authpuppy方案,官方网站www.authpuppy.org,是一个已实现好的Wifidog认证服务器,里面包含各类插件供你使用,官方的安装过程也很简单,若是你懂的HTML和面向对象编程的相关知识且拥有一个服务器,能够自行修改认证页面,使用authpuppy也是一个不错的方案。后端

可是,即使如此,这些方案仍是不够灵活,通过笔者认真钻研,查阅大量资料并通过屡次抓包分析,终于理解了Wifidog的工做原理。接下来笔者将会跟你介绍如何自行编写一个轻量级的Web Portal认证服务器。固然,这须要你具备程序设计基础,HTML、CSS固然是少不得的,后端开发语言可使用PHP或Python或Java等。api

首先,须要简单介绍一下Wifidog的工做原理:安全

1.客户端发出初始化请求,好比访问 www.baidu.com服务器

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

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

4.用户向认证服务器发出认证请求

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.用户提供他的凭据信息,好比用户名和密码。

7.成功认证的话,客户端将会被重定向到网关的本身的web页面上,而且带有一个认证凭据(一个一次性的token),内容好比:

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

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

9.网关去认证服务器询问token的有效性。

10.认证服务器确认token的有效性。

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

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

图解:

图解Wifidog工做原理

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

Source code    
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是Portal服务器的配置项;GatewayPort是Wifidog监听的地址,默认是2060,通常保持默认便可;CheckInterval是心跳时长,单位是秒,什么是心跳呢,客户端认证成功以后,若是有网络访问动做,Wifidog getway就会每隔一段时间访问Portal服务器的一个脚本,用于认证计费,固然,若是客户使用超时或超流量,也能够经过心跳强制客户端下线。ClientTimeout是用户一次认证成功后的网络访问时长,超过这个时间须要从新认证,这个时长并不是由ClientTimeout单独决定,取决于INTERVAL * TIMEOUT。详细的配置信息能够访问:http://dev.wifidog.org/browser/trunk/wifidog/wifidog.conf

咱们重点讨论Portal服务器的配置项,Hostname是Portal服务器的ip或者是域名,SSLAvailable和SSLPort是SSL加密配置,若是你的Portal服务器有配置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是,服务器或管理员能够根据不一样的id肯定用户的接入点;mac是客户计算机的网卡物理地址,注意不是AP网关的mac,这个mac是用来识别客户计算机的;url是客户初始访问的Url,这些Querystring都是AP Getway向客户端发出重定向请求自动生成的。这个脚本同时须要提供登录页面,若是登录成功,须要向客户;端返回302重定向,重定向到:http://gw_address:gw_port/wifidog/auth?token=[token];即实现第7步,其中[token]是你本身自动生成的token字符串,随机生成一个字符串便可,可是长度最好长些,安全性更高,另外,token须要根据不一样用户保存,最好保存于数据库中,以后的AP Getway询问token有效性(第9步)还须要用到。这里最好使用cookie或session,使以后的登录成功页面能够判断用户已经成功,阻止未登陆成功的人访问认证成功页面。

PortalScriptPathFragment配置项配置的是登录成功后服务器展现的脚本(第11步),它经过GET方式接受1个传入参数,gw_id,这个脚本比较简单,告知用户登录成功便可,固然,最好重定向到用户以前想要方位的url,即第1步用户输入的URL。

MsgScriptPathFragment配置项配置的是错误信息展现脚本,它经过GET方式接受一个传入参数message,这个脚本也很简单,展现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是客户端的ip,注意不是AP Getwap的ip;mac是客户端的网卡物理地址,token就是你在认证脚本生成并返回给客户端的;incoming和outcoming用于流量控制,默认值为0;gw_id同上。如何识别用户登陆成功,经过mac和token吧,LoginScriptPathFragment登录脚本在用户登录成功后须要记录用户的mac和token,而后在此处验证,若是匹配,回复Auth: 1,不然,回复Auth: 0。另外,这个脚本也是心跳脚本,每隔一段时间Wifidog会自动访问,若是用户使用时间超过限制或流量超过额度,服务器能够及时回应Auth: 0结束用户的访问。另外须要注意的是,回应一样无需包含html标签,另外,在Auth后的冒号和0/1之间,有一个空格,缺乏这个空格也会致使出错。

在配置Wifidog的配置文件wifidog.conf是,配置脚本的配置项都必须以“?”结尾,不然以GET方式传递的QueryString会因Url缺乏问号访问错误的脚本。

看到了吧,仅仅5个简单脚本,就能够实现利用Wifidog的Portal认证,固然,这过中还能够有不少应用还没有发掘,好比流量控制、带宽控制、结合Radius服务器实现认证等,你的开发也能够更上一层楼,实现更多功能。不过笔者还有一个建议,在登陆页面除了用户名和密码意外,最好加个验证码,防止不怀好意之人暴力破解。

这样,你只须要一个免费的空间,甚至是简单的百度云、新浪SAE等,就能够实现一个认证服务器;有的人可能还会问,能不能把这些脚本集成到路由器当中,个人回答是能,只要你的脚本的功能很少,问题应该不大,可是这么作的风险比较大,路由的负载比较高,致使路由的运行会很不稳定,甚至常常死机,这也是笔者亲身实践的结果,因此笔者不建议这么作。

最后啰嗦提醒的是,WiFidog是使用iptables基于三层协议工做的,因此使用Wifidog的结果是,不只是Wifi接入须要Portal认证,有线接入一样须要认证。避免这种状况最简单的作法是设立mac白名单。可能有的人又会问,能不能作到仅是Wifi接入须要认证,有线接入的无需认证,有的人可能想更上一层楼,能不能开两个Wifi,仅其中一个Wifi须要认证,另外一个Wifi和有线网络不须要Portal认证,个人回答是能,至于具体作法,之后再介绍。

This entry was posted in OpenWRT and tagged Openwrt by zhyaof. Bookmark the permalink.

相关文章
相关标签/搜索