2014年12月

wifidog认证

前段时间使用wifidog进行wifi强制认证,现在做个小结。
1.首先简单说说wifidog认证的过程
客户端首次连接到wifi后,浏览器请求将会被重定向到:
login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s
验证通过后,客户端被重定向到网关,url格式如下:
http://网关地址:网关端口/wifidog/auth?token=
wifidong会启动一个线程周期性地报告每一个用户的状态信息,并通过如下地址发送给认证
服务器:
auth_server:/auth/?stage=
ip=
mac=
token=
incoming=
outgoing=
认证服务器根据该状态信息决定是否允许该用户继续连接,并回复网关,回复格式为:Auth:状态码,
如:Auth:1
常用状态码:
0:AUTH_DENIED,表示拒绝
1:AUTH_ALLOWED,验证通过
验证通过后,将重定向到如下地址:
portal/?gw_id=%s
wifidog的ping协议
wifidog通过ping协议将当前状态信息发送给认证服务器,发送地址为:
http://auth_sever/ping/?
gw_id=%s
sys_uptime=%lu
sys_memfree=%u
sys_load=%.2f
wifidog_uptime=%lu
认证服务器须返回一个“Pong”作为回应。
2.实战应用
struts配置文件:

<package name="index" namespace="/" extends="interceptorMy,struts-default">
<action name="login/" class="goodsAction" method="login">
<result name="success" type="redirect">/Login/index.jsp</result>
<result name="input">/error.jsp</result>
</action>
<action name="ping/" class="goodsAction" method="ping">
</action>
<action name="auth/" class="goodsAction" method="auth">
</action>
<action name="portal/" class="goodsAction" method="portal">
</action>
</package>

Action方法:

public String login() {
    try{
        System.out.println("login start!");
                System.out.println("gw_port:"+gw_port);
        System.out.println("login end!");                                                                                                                                                                                                                                                                                                                       
     }
    catch(Exception e)
    {
        e.printStackTrace();
        return INPUT;
    }
    return "success";
}
public void ping() {
    try{
        System.out.println("ping start!");
        System.out.println(gw_id);
        ServletActionContext.getResponse().getWriter().write("Pong");
        System.out.println("ping end!");
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}
public void portal() {
    try{
        System.out.println("portal start");
        System.out.println("protal"+token);
        ServletActionContext.getResponse().sendRedirect("/demo/listAction");
        System.out.println("portal end");
     }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}
public void auth() {
    try{
        System.out.println("auth start!");
        System.out.println("mac"+mac);
        System.out.println("stage"+stage);
        System.out.println("token"+token);
        ServletActionContext.getResponse().getWriter().write("Auth: 1");
        System.out.println("auth end!");                                                                                                                                                                                                                                                                                                                       
     }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

/Login/index.jsp代码:

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
DateFormat format=new SimpleDateFormat("yyMMddHHmmss");
String formatData=format.format(new Date());
int ramdom=new Random().nextInt(1000);
String token=formatData+ramdom;
if(session.getAttribute("token")==null)
   session.setAttribute("token",token);

%>
<form method="GET" action='http://192.168.1.1:2060/wifidog/auth'>
<input type='hidden' name='token' value="<s:property value="#session.token" />" />
<input type='submit' value='Welcome!'/>
</form>

上面的192.168.1.1为网关的ip,2060为网关端口。
当然,完全可以在处理完login后直接跳到该地址。我们这里为演示其认证流程,故跳到该页面
效果:
客户端连接到wifi后,打开任何连接均跳到上面的index.jsp中,点击"Welcome"后,跳到/demo/listAction,即我们的目标地址。此后点击其他连接将不再拦截。
提示:安装wifidog的路由器必须可以访问Internet,否则wifidog拦截失败,无法跳到我们设定的页面。

本文章由 http://www.wifidog.pro/2014/12/18/wifidog-%E8%AE%A4%E8%AF%81.html 整理编辑,转载请注明出处

wifidog 稳定性测试

最近很多网友都说wifidog原版不是很稳定,那么怎么测试稳定性?
测试方法有两种:1是通过手机登陆网站;2是通过软件发送多个连接请求来达到测试wifidog处理请求的能力,也就是其稳定性。
测试环境:将刷好的带wifidog认证的路由接入Internet和测试机(电脑或者手机)。使用电脑连接到路由后台,以调试模式运行wifidog,以便随时监控wifidog。
测试条件:wifidog启动中并且测试机没有进行过认证。
预期结果:wifidog死掉或者重启。
方法一:通过多台手机登录网站发送连接请求(登录新浪视频和搜狐视频会不停地发送连接请求),查看后台监控wifidog异常,增加手机链接到测试路由并登陆网站直到wifidog死掉或者重启。
方法二:通过http_load软件发送网站连接请求,查看后台监控wifidog异常,逐渐增加发送连接请求次数直到wifidog死掉或者重启。

本文章由 http://www.wifidog.pro/2014/12/18/wifidog-%E7%A8%B3%E5%AE%9A%E6%80%A7.html 整理编辑,转载请注明出处

wifidog 小知识点

wifidog 用于无线热点的认证,它是下一代取代NoCat 的软件。
1)和NoCat相比,wifidog 网关协议它更小,有更少的依赖,并运行在嵌入式设备;在认证服务器端,它更多的是可定制的,并且是面向资本基础设施建设门户网站和社区的目的;实践方面,nocat 需要打开一个窗口来保持连接,而wifidog,不用。

2)那么wifidog是怎么工作呢?
网关协议使用防火墙规则来控制通过路由器的流量,当一个用户试图访问网络时,网关将会把浏览器导向认证服务器,在认证服务器上他们可以登录或注册,然后网关和认证服务器沟通是否允许用户访问网络。网关本身也会每隔X分钟向认证服务器发包,表明网关还在工作。细节可以参考wifidog 的流程图:
FlowDiagram.png

3)网关协议运行在具有Netfilter + iptables 的Linux机器上。认证服务器运行在任何支持PHP的Web服务器。当然网关协议和认证服务器可以同时安装在一个linux 机器上。

4)wifidog 认证是不区分有线无线的

5)wifidog 的网关协议和认证服务器都是可以修改的

6)确保ipt_mac.ko和ipt_mark.ko内核模块已经insmod,这些模块都是iptables 的可选部分,iptables这些部分默认不是打开的。

7)auth server交互可以使用xml或者json格式

本文章由 http://www.wifidog.pro/2014/12/18/wifidog-%E6%B3%A8%E6%84%8F%E7%82%B9.html 整理编辑,转载请注明出处

Wifidog协议分析

版本:20090925
1.Flow:
图片1.png

流程描述:
这里把所有和服务器相关的根目录设置成 ‘/’,这个地方可以修改,但服务端也需要相应修改访问目录,这里使用 ‘/'。
如修改成根目录为wifidog,则第二步需要修改成
http://auth_server/wifidog/login/?gw_id=xxx&gw_address=xxx&gw_port=xxx&url=xxx, 这里不做细节讨论
1)客户端浏览器访问www.baidu.com

2)路由器将浏览器请求重定向到auth server:http://auth_server/login/?gw_id=xxx&gw_address=xxx&gw_port=xxx&url=xxx,url 就是访问的www.baidu.com

3)客户端浏览器访问auth server:

http://auth_server/login/? 
gw_id=[GatewayID, default: "default", 如果在.conf里不设置,默认是网关的内网mac 地址]
gw_address=[GatewayAddress, 内网的IP],(内网的IP:192.168.1.1)
gw_port=[GatewayPort, wifidog 监听的端口] (默认是2060)
url=[user requested url] (www.baidu.com), 会使用url 编码

4)Auth Server返回一个login页面。

5)客户端浏览器输入用户名和密码登录。如果不需要校验username 和 password,可以直接忽略4-5步进入到第6步, 从网关协议的code里没有找到相关验证login的内容

6)Auth server 重定向客户端的请求到路由器, http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token], token由auth server 生成, 用来检验客户端是否合法登陆(这里目录wifidog 是网关在wifidog目录下建了一个关于auth 访问的回调函数,如果auth server 重定向浏览器时不加这个功能,需要网关协议相应修改,这里使用带wifidog目录的url)

7)客户端带着第6 步的token使用上面的重定向url访问路由器,触发网关协议关于auth文件的访问回调

8)网关在auth文件的回调里,会使用如下url到auth server验证第7 步客户端发过来的token:http://auth_server/auth/?stage=login&ip=xxx&mac=xxx& token=xxx&incoming=xxx&outgoing=xxx&gw_id=xxx

auth_server/auth/?
stage=login //新的客户端认证
ip=
mac=
token=
incoming=
outgoing=
gw_id=
ip/mac/token 是客户端的信息,incoming/outgoing是用户连接计数信息
stage是请求类别,counters/login/logout,表示已认证的保活/新认证用户/超时删除用户

这里路由器会等待auth server的回复auth code做进一步处理,Auth Server返回Auth Code的格式 Auth: 1, Auth后面带空格。

9)Auth Server检查token:
Wifidog 网关处理如下几种Auth code

0 - AUTH_DENIED - User firewall users are deleted and the user removed.
6 - AUTH_VALIDATION_FAILED - User email validation timeout has occured and user/firewall is deleted
1 - AUTH_ALLOWED - User was valid, add firewall rules if not present, 认证允许通过
5 - AUTH_VALIDATION - Permit user access to email to get validation email under default rules
-1 - AUTH_ERROR - An error occurred during the validation process 

所以Auth server可以返回如上几种Auth Code

10)对于AUTH_ALLOWED,路由器重定向客户端到 http://auth_server/portal/?gw_id=xxx,表明认证通过, gw_id 还是上面的那个值。
对于AUTH_DENIED, 重定向到http://auth_server/gw_message.php? message= denied
对于AUTH_VALIDATION,重定向到http://auth_server/gw_message.php? message= activate
对于AUTH_VALIDATION_FAILED,重定向到http://auth_server/gw_message.php? message= failed_validation

11)客户端访问http://auth_server/portal/?gw_id=xxx,Auth server 确认客户端请求成功,auth server 将客户端重定向回www.baidu.com, 认证完成。

2.Timeout检查:
路由器会隔一段时间(在wifidog.conf设置)给auth server发个http://auth_server/auth/?stage=counters&ip=xxx&mac=xxx& token=xxx&incoming=xxx&outgoing=xxx&gw_id=xxx,更新每一个客户端的traffic counters,并重新认证之前已经认证通过的客户端。
1)路由器对于timeout的客户端向auth server发送个logout请求包: http://auth_server/auth/?stage=logout&ip=xxx&mac=xxx& token=xxx&incoming=xxx&outgoing=xxx&gw_id=xxx
2)Auth server 的返回码,和stage=login的返回码一样:

0 - AUTH_DENIED - User firewall users are deleted and the user removed.
6 - AUTH_VALIDATION_FAILED - User email validation timeout has occured and user/firewall is deleted
1 - AUTH_ALLOWED - User was valid, add firewall rules if not present, 认证允许通过
5 - AUTH_VALIDATION - Permit user access to email to get validation email under default rules
-1 - AUTH_ERROR - An error occurred during the validation process
  1. 网关的保活协议:Ping - pong协议,网关和auth server的交互,表明wifidog的网关还活着。http://auth_server/ping/?gw_id=xxx&sys_uptime=xxx&sys_memfree&sys_load=xxx&wifidog_uptime=xxx, 等auth server回复字符串”Pong”。收到Pong路由器并没有做什么,这个可以自定义。

本文章由 http://www.wifidog.pro/2014/12/18/wifidog-%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90.html整理编辑,转载请注明出处