分类 wifidog分析 下的文章

如何理解wifidog 认证有效时间 - timeout

在wifidog.conf 里有两个参数是比较重要的:
CheckInterval 60 单位秒
ClientTimeout 5

这两个参数主要是用来检查接入网关的客户端是否超时,具体值根据需要自定义,这里以60 和 5 做讲解。
这里先说下一个知识点:
我们知道wifidog是起线程来实现不同的功能,比如监听http 请求,超时检查, ping协议,wdctl 控制wifidog 进程的线程等,这里加入我们不需要ping 协议,那么我们就可以把ping 协议的线程注释掉:

    /* Start heartbeat thread */
    result = pthread_create(&tid_ping, NULL, (void *)thread_ping, NULL);
    if (result != 0) {
        debug(LOG_ERR, "FATAL: Failed to create a new thread (ping) - exiting");
            termination_handler(0);
    }
    pthread_detach(tid_ping);

这里需要注意一下,注释掉这个线程之后可能会引起一个问题,auth server不能访问了!这是因为默认wifidog 在刚启动时会把auth server 的iptables 放通:
fw_init->iptables_fw_init->iptables_fw_set_authservers, 我们需要来看下这个函数做了些什么事:

    void iptables_fw_set_authservers(void)
    {
        const s_config *config;
        t_auth_serv *auth_server;

        config = config_get_config();

        for (auth_server = config->auth_servers; auth_server != NULL; auth_server = auth_server->next)                
        {
                if (auth_server->last_ip && strcmp(auth_server->last_ip, "0.0.0.0") != 0) 
                {
                        iptables_do_command("-t filter -A " TABLE_WIFIDOG_AUTHSERVERS " -d %s -j ACCEPT", auth_server->last_ip);
                        iptables_do_command("-t nat -A " TABLE_WIFIDOG_AUTHSERVERS " -d %s -j ACCEPT", auth_server->last_ip);
                }
        }

    }

我们看到把auth server的last ip放通了,last ip是什么?last ip实际上是在连接auth server之前用dns 包得到的auth server 最新的IP地址(详见函数_connect_auth_server),那么问题就在这,last ip 是在连接server时才会更新的,但在iptables初始化时,并没有做连接的动作,不过在ping 协议里却是有的,ping 协议会在刚启动时连接auth server,所以关于auth server的iptables 会生效,如果单纯把ping 协议关了,有可能存在不能访问auth server 页面的情况,这里需要注意一下。

同理不需要wdctl 线程,也可以注释掉:

    /* Start control thread */
    result = pthread_create(&tid, NULL, (void *)thread_wdctl, (void *)safe_strdup(config->wdctl_sock));
    if (result != 0) {
            debug(LOG_ERR, "FATAL: Failed to create a new thread (wdctl) - exiting");
            termination_handler(0);
    }
    pthread_detach(tid);

了解了线程的作用,我们重点讲解下超时检查的这个线程:

    result = pthread_create(&tid_fw_counter, NULL, (void *)thread_client_timeout_check, NULL);
    if (result != 0) {
        debug(LOG_ERR, "FATAL: Failed to create a new thread (fw_counter) - exiting");
        termination_handler(0);
    }
    pthread_detach(tid_fw_counter);

这个线程做什么的? 咋一看是用来更新流量的,其实就是更新流量,同时把一段时间没流量更新的客户端踢掉,注意重点,是一段时间没有流量更新的客户端,而不是不管你有没有上网过一段时间都把你踢掉!这个是很重要的条件,因为前者需要和auth server接口做交互,后者可以直接在网关里实现。下面我们来看下代码:
thread_client_timeout_check,这个函数会在每CheckInterval 时间做一次事情,做什么呢?fw_sync_with_authserver:
先去调用iptables_fw_counters_update,这个函数会把每一个客户端的incoming 和outgoing 也就是上下行流量更新下,也会更新一个last_uodated的东西,这个变量其实就是最后一个更新客户端outgoing 流量的时间,更新条件就是客户端记录的流量比iptables 看到的流量小了,换句话说这个客户端还在上网。更新完这些变量之后回到fw_sync_with_authserver:
接着就是把每一个客户端的流量情况上报给auth server,同时对于客户端p1(p1是所有客户端中的一个)
if (p1->counters.last_updated +(config->checkinterval * config->clienttimeout) <= current_time)
下线处理:iptables 设置阻拦此客户端,从客户端列表中删除此客户端,通知auth server该客户端下线。
last_updated变量的作用就在这,结合前面讲的,last_updated是最后有访问外网流量行为即outgoing有变化时的时间,如果最后一次访问外网时间 + 检查流量间隔时间(CheckInterval 60 单位秒 * ClientTimeout 5)不大于当前时间,也就是说,已经有CheckInterval 60 单位秒 * ClientTimeout 5 时间没上网了,那么就做下线处理。
这里为什么是(CheckInterval 60 单位秒 * ClientTimeout 5)? 可以这么理解,网关每CheckInterval 60检查一次流量,检查了ClientTimeout 5 次发现有个客户端都没有访问外网没有outgoing 增加,那网关就认为该客户端已经下线了。

那么要是我想实现不管客户端上不上网,过了(CheckInterval 60 单位秒 * ClientTimeout 5)时间我就是要让客户端重新认证怎么做? 很简单:
在client 的结构体里添加个online_time 的字段,在append client时把online_time 字段更新到当前时间(time(NULL)),然后在fw_sync_with_authserver检查时间时,把if条件换成,如果online_time + (CheckInterval 60 单位秒 * ClientTimeout 5) 大于等于当前时间time(NULL),就踢掉,两个当前时间一个是添加客户端时的时间,一个是超时验证时的时间,所以不会相同。

本文章由 http://www.wifidog.pro/2014/12/26/wifidog-%E8%B6%85%E6%97%B6%E6%A3%80%E6%9F%A5.html 整理编辑,转载请注明出处

WiFidog简介

WIFIdog是一种新的认证方式,这种认证方式的优势在于安全性高,不容易被破解验证。
客户端发出初始化请求,比如访问www.baidu.com
网关的防火墙规则将这个请求重定向到本地网关的端口上。这个端口是Wifidog监听的端口。
Wfidog提供一个HTTP重定向回复,重定向到Web认证页面,重定向的Url的Querystring中包含了Gateway的ID,Gateway的FQDN以及其他的信息。
用户向认证服务器发出认证请求。
网关返回一个(可以是自定义的)splash(也称作“登录”)页面。
用户提供他的凭据信息,比如用户名和密码。
成功认证的话,客户端将会被重定向到网关的自己的web页面上,并且带有一个认证凭据(一个一次性的token)
用户就是用获取到的凭据访问网关。
网关去认证服务器询问token的有效性。
认证服务器确认token的有效性。
网关发送重定向给客户端,以从认证服务器上获取 成功提示页面,重定向到 http://portal_server:port/portal_script 这个位置。
认证服务器通知客户请求成功,可以上网了。
整个过程如下图所示:
1.jpg

本文章由http://www.wifidog.pro/2014/12/25/wifidog%E7%AE%80%E4%BB%8B.html 整理编辑,转载请注明出处

wifidog 移植到MIPS平台

使用的是一款Broadcom的芯片,现在上面运行wifidog实现认证上网的功能。由于不是openwrt平台,所以就没了make menuconfig 勾选就能自动编译到版本中的。所以想使用交叉编译的方法将wifidog移植到该平台上。

下面写下步骤吧,不是很复杂,但是开始也破费周折。下载源码到http://dev.wifidog.org 下载就可以了。

./configure CC=/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc-0.9.32-binutils-2.21/usr/bin/mips-linux-gcc CXX=/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc-0.9.32-binutils-2.21/usr/bin/mips-linux-g++ LD=/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc-0.9.32-binutils-2.21/usr/bin/mips-linux-ld RANLIB=/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc-0.9.32-binutils-2.21/usr/bin/mips-linux-ranlib AR=/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc-0.9.32-binutils-2.21/usr/bin/mips-linux-ar --build=i686-pc-linux-gnu --host=mips-wrs-linux-gnu --target=mips-wrs-linux-gnu --prefix=/home/wifidog_install/

使用configure 配置。这里我的平台只使用 ./configure --host=mips-linux-gcc 的方式可以编译成功,但是放在板子上运行会报错"mips-linux-gcc " not found。很莫名其妙的。所以采用上面的配置方法,配置生成Makefile文件后,make ,make install,将/home/wifidog_install/下的lib 与 bin中的文件放到板子上。这里可能遇到执行wifidog 缺少libnsl.so.0这个库,查找交叉编译工具器中是否存在?如果没有就去下载源码,交叉编译一个了。

还有一个就是将wifidog 源码中的wifidog.conf 和wifidog-msg.html 两个文件拷贝到板子上。wifidog.conf 是wifidog运行需要解析的配置文件,而wifidog-msg.html 也是一个必须的框架。这个路径在wifidog.conf中指定。

本文章由 http://www.wifidog.pro/2014/12/25/wifidog-mips%E5%B9%B3%E5%8F%B0.html 整理编辑,转载请注明出处

Wifidog初分析(二)

上一节介绍了wifidog 客户端,及网关协议。
三、认证服务端简介

服务端官方推荐的有两个,一个是authpuppy,还有一个是wifidog-auth。两个环境都已经搭建成功。

Authpuppy主要是一个authpuppy.core.php ,类似Linux的管理方式,中心是一个内核文件。扩展功能是以plugin插件的方式进行加载、卸载管理的。

优点:可管理性比较好,随用随加载;不用既可以卸载掉。

缺点:代码不易阅读。因要求易于管理,插件模块形式要求严格。对于小型功能来说浪费时间。

Wifidog-auth显得就是“全面”,理解起来稍微简单。

认证主要分为三块,ping保活、login认证、portal认证。代码可能有不同,但是有相同的协议,以及相同的回复内容。下面是wifidog与服务端通信协议的几个例子。

网关心跳(Ping协议)

Wifidog将ping协议作为心跳机制向认证服务器发送当前状态信息。这可以实现为认证服务器每个节点的状态生成中央日志。

Wifidog客户端在conf文件中进行设置,目的是通过http定期启动thread(ping_thread.c)向认证服务器发送状态信息。信息格式如下:

http://auth_sever/ping/?

gw_id=%s

sys_uptime=%lu

sys_memfree=%u

sys_load=%.2f

wifidog_uptime=%lu"

通过系统调用wifidog客户端收集的数据

Headers/

HTTP/1.0\r\n"

"User-Agent: WiFiDog %s\r\n"

"Host: %s\r\n"

一个典型的HTTP需求应该是:

GET /ping/?gw_id=001217DA42D2&sys_uptime=742725&sys_memfree=2604&sys_load=0.03&wifidog_uptime=3861 HTTP/1.0( k# O# X) };

User-Agent: WiFiDog 1.1.3_beta62 T. R"

Host: auth.ilesansfil.org

认证服务器认证协议

这个页面描述了当用户已经被认证并允许访问互联网时,为了认证用户和进程,wifidog网关和认证服务器之间的信息传送。

Wifidog客户端将定期的启动一个thread来报告每个用户的连接状况。目前它被用来报告每个用户输入/输出计数器,以显示用户依然在现,并允许认证服务器将不再连接的用户断开。

以下是发给每个在线用户的信息

auth_server:/auth/index.php?

stage=

ip=

mac=

token=

incoming=

outgoing=

注意:stage=计数器/登录,取决于是否是新客户端

即使输入输出变量会在所有信息中出现,但他们只对处于counter阶段的信息有效。其它情况下输入输出经常设置为0。

在做回复时,认证服务器会以有效身份或新用户信息,或者认证服务器错误提示形式进行回复。

回复格式如下:

Auth:

新用户状态为:

0 - AUTH_DENIED - User firewall users are deleted and the user removed.% u) i D; j: i4 J' X) \/ P

6 - AUTH_VALIDATION_FAILED - User email validation timeout has occured and user/firewall is deleted7 A% n+ s. z3 O9 r

1 - AUTH_ALLOWED - User was valid, add firewall rules if not present! A" _/ B* a8 ~$ g

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

注意:认识服务器错误一般不会改变防火墙或用户状态

标准的URL为:

GET /auth/?stage=counters&ip=7.0.0.107&mac=00:40:05:5F:44:43&token=4f473ae3ddc5c1c2165f7a0973c57a98&incoming=6031353&outgoing=827770 HTTP/1.0

User-Agent: WiFiDog 1.1.3_beta6

Host: auth.ilesansfil.org

网关重定向浏览器

客户端浏览器在不同情况下会被重定向到其它页面:

初始化请求:

基于捕捉,客户端会被网关重定向到以下URL:

l login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s

例如:https://auth.ilesansfil.org/login/?gw_id=0016B6DA9AE0&gw_address=7.0.0.1&gw_port=2060

初始化请求之后

当请求被处理并且客户端已经被重定向到网关时

如果服务器回复AUTH_DENIED:注意你通常在标准认证服务器上看不到这样的提示。客户端将不会被重定向回网关。

l gw_message.php?message=denied

如果服务器回复AUTH_VALIDATION:

l gw_message.php?message=activate

如果服务器回复AUTH_ALLOWED:这是门户重定向

l portal/?gw_id=%s

如果服务器回复AUTH_VALIDATION_FAILED:注意你将不会在标准认证服务器看到此回复。客户端将不会重定向回网关。

l gw_message.php?message=failed_validation

认证服务器重定向浏览器

基于成功登录,客户端将被重定向到网关。 http://" . $gw_address . ":" . $gw_port . "/wifidog/auth?token=" . $token

URL示例:http://7.0.0.1:2060/wifidog/auth?token=4f473ae3ddc5c1c2165f7a0973c57a98

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