分类 wifidog原理 下的文章

wifidog认证之自带HTTP 服务器lighttpd分析

wifidog的源码里除了会编译出wifidog 的主程序,还会有一个库libhttpd.so,这个库是wifidog自带的http server,就是在wifidog 的http 监听线程中会用到这个库,而且在wifidog的几个回调函数中也会用到:

 if ((webserver = httpdCreate(config->gw_address, config->gw_port)) == NULL) {
                debug(LOG_ERR, "Could not create web server: %s", strerror(errno));
                exit(1);
        }

        debug(LOG_DEBUG, "Assigning callbacks to web server");
        httpdAddCContent(webserver, "/", "wifidog", 0, NULL, http_callback_wifidog);
        httpdAddCContent(webserver, "/wifidog", "", 0, NULL, http_callback_wifidog);
        httpdAddCContent(webserver, "/wifidog", "about", 0, NULL, http_callback_about);
        httpdAddCContent(webserver, "/wifidog", "status", 0, NULL, http_callback_status);
        httpdAddCContent(webserver, "/wifidog", "auth", 0, NULL, http_callback_auth);
        /*get free client by this way*/
        httpdAddCContent(webserver, "/wifidog", "getfree", 0, NULL, http_get_free);

        httpdAddC404Content(webserver, http_callback_404);

以及:

r = httpdGetConnection(webserver, NULL);
接受客户端http 请求

result = pthread_create(&tid, NULL, (void *)thread_httpd, (void *)params);
把创建的httpd 结构传给http 线程

这里用的是 1.3 版本的库。

本文章由 http://www.wifidog.pro/2015/04/09/wifidog-lighttpd.html 整理编辑,转载请注明出处

wifidog认证优缺点wifidog原理

portal认证方式有多重,我们选择了十分普遍额开源项目wifidog,支持openwrt,用户群体大,资料较完善,中文资料多。
主要优点:

  1. 开源(https://github.com/wifidog github,上提供了源码及基于php的认证网关源码)
  2. 国内使用wifidog的情况比较普遍,二次开发更容易。
  3. 代码可移植性高,各种平台几乎都不受限制

(总结:低成本,易上手。)

目前也存在一定的缺点

  1. 通过实际抓包发现,心跳包不断的检查用户在线情况,网关服务器性能开销较大。
  2. 基于iptables,协议繁琐,性能比较差。
  3. 隐私问题,没有加密url直接传递含隐私的信息。

下面来看下wifidog工作机制:
工作机制
/ping 心跳接口

"GET /ping/?gw_id=网关id&sys_uptime=1183&sys_memfree=105884&sys_load=0.14&wifidog_uptime=1169 HTTP/1.0"

/login 新用户认证跳转页面

GET /login/?gw_address=111&gw_port=111&gw_id=111&mac=88:72:0d:f2:88:29&url=url HTTP/1.1

/auth 用户检测

/auth/?stage=counters&ip=192.168.10.81&mac=88:72:0d:f2:a8:29&token=85ea71f2484b2c52fee&incoming=5638570&outgoing=722214&gw_id=111 HTTP/1.0

本文章由 http://www.wifidog.pro/2015/04/09/wifidog%E8%AE%A4%E8%AF%81%E4%BC%98%E7%BC%BA%E7%82%B9.html 整理编辑,转载请注明出处

wifidog认证wifidog流程auth server简单配置

前段时间使用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/2015/04/08/wifidog%E6%B5%81%E7%A8%8Bwifidog%E8%AE%A4%E8%AF%81.html 整理编辑,转载请注明出处

OpenWrt wifidog 实现收费提醒效果

需求场景

有一个免认证的 Wifi SSID,比如叫:OpenWrt,附近的同学可以随便连上这个 SSID,没有缴过费的同学不管访问什么地址,都会被跳转到收费提醒页面,而缴过费的同学就可以开心上网了。

解决办法

从需求上来说,这是一个非常标准的 WifiDog 效果,如果未来有很复杂的需求,可以直接通过 WifiDog 来实现跳转,然后再通过 AuthPuppy 来实现账户管理,不过想在 OpenWrt 上同时部署 WifiDog 与 AuthPuppy 也不是一件很容易的事情。

因此我们准备考虑直接通过 iptables 来实现这个需求,未来如果有复杂的扩展需求,也不影响扩展到 WifiDog 来实现。

实现流程

通过 SSH 登录到 OpenWrt,打开 /etc/config/uhttpd,在文件的最顶部增加以下配置

config uhttpd 'portal'
list listen_http '0.0.0.0:11990'
option home '/www/portal'
option error_page '/index.html'

然后在 /www/portal 下新建一个名为 index.html 的静态文件,文件内容可以如下

<html>
<head>
  <meta http-equiv="cache-control" content="no-cache">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Wifi</title>
</head>
<body>
  Email: xxxx@xxx.com
</bodu>
</html>

之后再打开 /etc/firewall.user 文件,在末尾添加如下配置:

iptables -t nat -A prerouting_lan_rule -p tcp -m tcp --dport 80 -m mark ! --mark 8 -j REDIRECT --to-ports 11990
iptables -t filter -A forwarding_lan_rule -m mark ! --mark 8 -j REJECT

保存后执行 /etc/init.d/firewall restart 重新载入 iptables 的配置
然后再执行 /etc/init.d/uhttpd restart 重新载入 uhttpd 的配置

然后用手机连接这个无线网络,你就会发现总是弹出这个提示页面了

用户授权

当有用户缴费了之后,向他要到他的MAC地址,同样打开 /etc/firewall.user 文件,比如这个用户有 2 个设备,MAC 地址分别是 00:00:00:00:BB:AA 与 00:00:00:00:BB:BB 则添加以下 2 条 规则,以后这 2 个设备就可以随便上网了!

iptables -t mangle -A fwmark -m mac --mac-source 00:00:00:00:BB:AA -j MARK --set-mark 8
iptables -t mangle -A fwmark -m mac --mac-source 00:00:00:00:BB:BB -j MARK --set-mark 8

添加后同样需要执行 /etc/init.d/firewall restart 以使配置生效

注意事项

如果通过以太网口访问 OpenWrt luci 管理界面也是那个收费提示,只需要把该机器的 MAC 地址同样授权一样即可

本文章由 http://www.wifidog.pro/2015/04/08/openwrt-wifidog-5.html 整理编辑,转载请注明出处