分类 wifidog配置 下的文章

Wifidog_FAQ-part1

一般常见问题

关于Wifidog 强制网络门户的一般问题

问:Wifidog 是什么?
答:Wifidog 是用来创建无线热点的软件。它是替代NoCat 的下一代产品。如果想了解更多相关细节和历史,请浏览Wifidog 主页。

问:谁开发了Wifidog?
答:ile Sans Fil 技术团队创建了Wifidog 项目。有一些人仍然参与其中,并且有来自世界各地的成员加入。

问:谁可以使用Wifidog?
答:在获得合法许可的前提下,任何人都可以使用Wifidog。这是一个GPL软件。实际上,我们都喜欢得到的答案是面向“每个人”,然而这是不现实的。Wifidog的主要目标用户是网络管理员,热点管理员和“知道他们在做什么的”黑客。可能产生的情况是一般终端用户不会受益,或者能够正确地设置和持续管理Wifidog安装。如果此软件曾得到一次完整的指向-点击缓解,使我们感觉到普通使用者能够进行安全管理,那么我们会将文件升级。

问:它能做什么?
答:1)强制网络门户可以使热点拥有者与使用者之间进行交流。
2)Wifidog网关是为GNU/Linux服务器和嵌入式linux设备而设计。例如:拥有OpenWRT的Linksys WRT54G。
3)支持多语种检索(通过浏览器检测或用户选择),能够使用PO Eeditor增加更多语种
4)通过Ping命令来检测网络活动用以维持用户(热点用户)联络,以此取代不科学的javascript脚本检测方式。这使得掌上电脑,手机和其它没有javascript 服务的设备可以进行联接。
5)可以为不同种类的热点提供服务
6)用户可以直接从任何热点建立一个工作帐号。新用户可以从任何热点进行登录,建立他们的帐号,并且允许确认邮件15分钟。如果他们不进行操作,他们将被断开联接并必须重新注册。
7)热点使用“双向心跳包”监测,所以中央服务器可以了解哪个热点/节点在线,不依赖动态DNS和防火墙等等。
8)可以生成自动节点。

问:它由什么组成?
答:它由两部分组成:
1) 客户端是守护进程,它安装于每一个无线路由器
2) 认证服务器是网络应用,它可安装于管理中心

问:它与NoCat之间有哪些不同?
答:它的客户端更小,没有过多对其他软件包的依赖,并且在嵌入式设备中运行良好。在认证服务器方面,可制定性更高,适合建设热点门户和社区。

问:它是如何运作的?
答:客户端守护进程通过防火墙规则来控制路由器的流量。当一个新用户试图打开一个网页,客户端将透明地将他们重定向至认证服务器以便登录或注册新用户。客户端和认证服务器将协商如何处理该上网用户和是否允许其访问网络。客户端每X分钟就向认证服务器发起请求,以便对其进行动态统计及资料更新,内容包括:正常运行时间,负载,上网用户的流量监测以及在/离线状态。

问:它是如何运行的?
答:客户端可在任何Linux机器中运行,但机器中需安装netfilter 以及iptables 。认证服务器运行于任何支持PHP的web服务器。

问:我可以在同一个Linux box中安装并运行Wifidog认证服务器和Wifidog网关吗?
答:可以。

问:如果要使用Wifidog,我的系统必须要有无线网卡吗?还是只要有个无线路由器就可以?
答:在网关运行的机器不需要无线网卡,但是对于每个无线客户端,Wifidog被设置在入口,网关必须被链接在第二层到以太网关接口处。实际上,无线路由器必须被用作是纯粹的接入点,只有将LAN端口(不是WAN端口)和在网关运行的机器的接口相联接才能实现。

问:我需要使用无线接入点吗?如果不使用无线接入点,我可以使用Wifidog无线路由器吗?
答:一些无线路由器做nat,这种情况会使从无线路由器中获取的MAC地址将客户端的MAC地址进行替换。如果产生这种问题,Wifidog的身份验证将失效,因为它依赖MAC地址去允许/不允许进入。

问:我可以写自己的客户端吗?
答:当然可以,但是为什么呢?我们已经完成了所有的工作。客户端已经用C语言写好,并且足够轻量级,这使得它在像Linksys WRT54G这样的嵌入式环境中都可以平稳运行。这个客户端是久经测试的,并且相当的稳定。它已被广泛用于ile Sans Fil部属的热点中。

问:我可以写自己的认证服务器吗?
答:重申一次,我们已经完成了所有的工作。但是如果你觉得我们所提供的不适合你的需求,并且你希望从头开始写你自己的服务器,整个系统中的客户端必须使用同一种协议。

问:Wifidog的界面是什么样的?
答:客户端是在后台运行的守护进程。没有终端用户所关注的立即可视的用户界面,但它可以为管理员提供一个简单的命令行和基于网络的界面来查询状态。

问:我可以从哪里获取帮助?
答:如果你需要获取关于Wifidog安装的技术支持,你的信息需包括:
1) 你的Wifidog客户端的版本(ipk 或者你自己编辑的版本)
2) 配置安装(请删除默认配置)
3) Wifidog除错输出信息(命令:Wifidog-f-d 7)

问:我可以使用Wifidog在运行无身份验证的热点运行吗?
答:可以,只要将每个无身份验证的热点在网络设置页面中激活便可。

问:我可以只运行Wifidog网关吗(没有认证服务器)?
答:不可以,这不是Wifidog设计的初衷。你可以试试NoCatSplash,它是为此而设计的。

问:Wifidog支持RADIUS,WISP或者WPA吗?
答:目前Wifidog支持RADIUS用户认证和流量统计。

本文章由 http://www.wifidog.pro/2014/12/26/wifidogFAQ.html 整理编辑,转载请注明出处

如何理解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是搭建无线热点认证系统的解决方案之一,他比nocat、nodog更适合互联网营销思路。常见的使用在openwrt系统上,它实现了路由器和认证服务器的数据交互,在路由器方(客户端)是用C 语言代码,通过wifidog程序和linux iptables防火墙实现接入用户的认证跳转和控制。在认证服务器方(服务端)是通过php(还有java版本的)实现用户的认证流程和管理。

优点:有开源代码,可以很方便的搭建认证系统。方便用户进行需求定制。

缺点:通过iptables方式实现,性能比较差,整体拉低了路由器的数据包处理速度,协议比较繁琐,对认证服务器的造成性能损耗比较大。

二、wifidog 结构分析

Wifidog 客户端代码简析:

├── libhttpd

│ ├── api.c

│ ├── httpd.h

│ ├── httpd_priv.h

│ ├── ip_acl.c

│ ├── Makefile.am

│ ├── protocol.c

│ ├── README

│ └── version.c

├── src

│ ├── auth.c

│ ├── auth.h

│ ├── centralserver.c

│ ├── centralserver.h

│ ├── client_list.c

│ ├── client_list.h

│ ├── commandline.c

│ ├── commandline.h

│ ├── common.h

│ ├── conf.c

│ ├── conf.h

│ ├── debug.c

│ ├── debug.h

│ ├── firewall.c

│ ├── firewall.h

│ ├── fw_iptables.c

│ ├── fw_iptables.h

│ ├── gateway.c

│ ├── gateway.h

│ ├── http.c

│ ├── httpd_thread.c

│ ├── httpd_thread.h

│ ├── http.h

│ ├── Makefile.am

│ ├── ping_thread.c

│ ├── ping_thread.h

│ ├── safe.c

│ ├── safe.h

│ ├── util.c

│ ├── util.h

│ ├── wdctl.c

│ ├── wdctl.h

│ ├── wdctl_thread.c

│ └── wdctl_thread.h

这是wifidog的部分源码。

下面再来看看wifidog的认证流程图:
1.png

认证的大致流程可以从上图中看到。下面结合代码的实现与图1来说下wifidog 的工作过程。

1、在网关上配置好wifidog.conf 后,运行wifidog程序。此时wifidog对wifidog.conf进行解析,并获取其中的配置选项。如:认证服务的地址或url 项Hostname 192.168.2.103 还有认证服务下的文件选项。如果为根目录下就是认证服务的处理程序,那么就设置为 Path /。Wifidog启动时会将这些参数读取,并保持在一个数组中,以供之后使用。然后调用iptables加入防火墙规则,阻止所以连接网关的用户上网。但是到达认证服务器的规则是打开的状态。

 0 ACCEPT     all  --  *      *       0.0.0.0/0            192.168.2.103

 55  2772 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 2060

小结:此节主要用到conf.* 解析配置文件,firewall.* fw_iptables.* 进行防火墙规则添加 。

2、程序运行起来后,当有用户进行外网访问时。根据②中的防火墙规则,会将HTTP请求的外部IP地址和端口通过NAT方式重定向至本地wifidog内嵌HTTP服务器的地址和端口上,并由内嵌HTTP服务器进行服务,而内嵌HTTP服务器的路径和回调处理。然后将具体的请求信息发送给认证服务器。代码不详谈,下面看个实例URL:

POST /authpuppy/web/login/?gw_address=192.168.2.1&gw_port=2060&gw_id=default&url=http%3A//quietmadman.blog.51cto.com/3269500/1384761 HTTP/1.1

当我访问时,wifidog 将我访问的url重定向到上述的url上。目的就是去服务端做认证。

可以看到这里有这几个参数信息:

gw_address,路由器的LAN地址

gw_port:为wifidog的监听端口

gw_id:路由器的标识名

mac:客户端设备的MAC地址

url:为客户端访问的原URL(以便于重定向)

3、接步骤2,wifidog发送上述的url给认证服务器。这里我们使用的认证服务器是authpuppy。安装了apAuthSplashOnlyPlugin 插件。该插件无需输入用户名、密码,但需要点击按钮方可上网,也算是无秘钥认证。

接下来说下抓包看到的认证过程:

POST /authpuppy/web/login/?gw_address=192.168.2.1&gw_port=2060&gw_id=default&url=http%3A//quietmadman.blog.51cto.com/3269500/1384761 HTTP/1.1

... ...

Referer: http://192.168.2.103/authpuppy/web/login/?gw_address=192.168.2.1&gw_port=2060&gw_id=default&url=http%3A//quietmadman.blog.51cto.com/3269500/1384761

Cookie: authpuppy=3oft24lljrish4731dibh2ji80

gw_id=default&gw_address=192.168.2.1&gw_port=2060&authenticator=apAuthSplashOnly&submit%5BapAuthSplashOnlyConnect%5D=Connect&apAuthSplashOnly%5Boptional_name%5D=HTTP/1.1 302 Found

... ...

Location: http://192.168.2.1:2060/wifidog/auth?token=8eb3aae0ade3492cad361443ac54b9dcb644dbb2

上述过程是wifidog给认证服务器发送请求认证的URL,服务器收到后回送一个带token值的url到网关上。此段处理在服务端。网关收到后再次发送信息给认证服务器,如下报文:

GET /wifidog/auth?token=8eb3aae0ade3492cad361443ac54b9dcb644dbb2 HTTP/1.1

... ...

HTTP/1.0 307 Redirect to portal

Server: Hughes Technologies Embedded Server

Location: http://192.168.2.103:80/authpuppy/web/portal/?gw_id=default

Date: Mon, 07 Jul 2014 15:16:00 GMT

... ...

GET /authpuppy/web/auth/?stage=login&ip=192.168.2.222&mac=64:27:37:e1:c3:d3&token=8eb3aae0ade3492cad361443ac54b9dcb644dbb2&incoming=0&outgoing=0&gw_id=default HTTP/1.0

... ...

网关GET到token后,陆续的向认证服务器发送相关认证信息。

这里主要是两大步骤:
1)通过调用 auth_server_request(&auth_response, REQUEST_TYPE_LOGIN, r->clientAddr, mac, token, 0, 0); 让 认证服务器 对该客户端的 token 进行校验;

2)根据 认证服务器 返回的 token 校验结果进行不同的处理(主要是对该客户端的防火墙过滤规则进行不同的设置),这里主要以 AUTH_ALLOWED 校验结果进行分析,这里主要是两个动作:

2).1,通过 fw_allow 函数调用对此客户端"放行";

2).2,返回重定向至 认证服务器的 portal 路径访问的响应

GET /authpuppy/web/portal/?gw_id=default HTTP/1.1

Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, /

Referer: http://192.168.2.103/authpuppy/web/login/?gw_address=192.168.2.1&gw_port=2060&gw_id=default&url=http%3A//quietmadman.blog.51cto.com/3269500/1384761

... ...

Host: 192.168.2.103

... ...

Location: http://quietmadman.blog.51cto.com/3269500/1384761

Wifidog返回信息到认证服务器的portal,portal返回给网关的信息如上。最后重定向到用户最初始访问的url上。

Wifidog 的client代码大致是这些。

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

Wifidog+Authpuppy认证页面的配置

路由器上用的是wifidog client,服务器后端管理用的是authpuppy。
首先,选择自己的操作系统,在http://www.authpuppy.org/doc/Main_Page网站里面,我的操作系统是Linux。然后到这个网站http://www.authpuppy.org/doc/Getting_Started去下载check_configuration.php 这个文件是检测你的电脑安装authpuppy需要哪些环境,下面是我配置好的环境。
1.jpg

然后到这个http://launchpad.net/authpuppy 下载authpuppy的源码,然后把解压后的authpuppy目录放到apache2的站点目录,我的是ubuntu12.10,安装后的apache2目录是/etc/apache2/sites-available/default,
打开的内容是

<VirtualHost *:80>
   ServerAdmin webmaster@localhost

   DocumentRoot /var/www/
   <Directory />
           Options FollowSymLinks
           AllowOverride All
   </Directory>
   <Directory /var/www/authpuppy/web/>
           Options Indexes FollowSymLinks MultiViews
           AllowOverride All
           Order allow,deny
           allow from all
   </Directory>

   ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
   <Directory “/usr/lib/cgi-bin”>
           AllowOverride None
           Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
           Order allow,deny
           Allow from all
   </Directory>
   ErrorLog ${APACHE_LOG_DIR}/error.log

   # Possible values include: Debug, info, notice, warn, error, crit,
   # alert, emerg.
   LogLevel warn

   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

由于刚开始什么都不懂,都不知道里面目录是什么意思,所以就挑几个来说明下

DocumentRoot /var/www 这个目录是apache2服务器的根目录,也就是说当你打开浏览器在地址栏输入127.0.0.1时,就是进入/var/www/这个目录里面

<Directory /var/www/>
           Options Indexes FollowSymLinks MultiViews
           AllowOverride All
           Order allow,deny
           allow from all
   </Directory>

这个是你在apache里面架设服务器的根目录,比如我架设的是authpuppy,当我一进入authpuppy是/var/www /authpuppy/web/这个目录下的文件,其他的也没什么好讲的。所以我们应该把authpuppy目录放在/var/www/这个目录下面。

接下来就是配置这个apache这个,这个是让我最头疼的地方,配置了好几天,才搞明白是怎么回事。
首先咱们来看下http://www.authpuppy.org/doc/Getting_Started这个里面的配置内容。

2.jpg

我一开始也没多想就直接复制和粘帖,结果安装到第三步就出错了。哦,忘了说怎么安装了,在浏览器的地址栏上输入127.0.0.1查看authpuppy的目录在哪,然后进入authpuppy里面web的目录,就会在网页上跳出安装页面。

再回过来说说apache怎么配置吧,先给大家看看我的配置文件

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName authpuppy.localhost
  ServerAlias authpuppy.test

  DocumentRoot /var/www/
  DirectoryIndex index.php

   <Directory /var/www/authpuppy/web/>
          Options Indexes FollowSymLinks MultiViews
          AllowOverride All
          Order allow,deny
          allow from all
  </Directory>

  Alias /sf /var/www/authpuppy/lib/vendor/symfony/data/web/sf
  <Directory “/var/www/authpuppy/lib/vendor/symfony/data/web/sf”>
          AllowOverride All
          Allow from All
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log
  # Possible values include: Debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn

  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

不知道大家有没发现这两个目录不一样
ErrorLog /var/log/apache2/authpuppy/error.log
CustomLog /var/log/apache2/authpuppy/access.log

我在我的电脑里面发现/var/log/apache2/里面没有authpuppy这个目录,后来我就把这两个目录改了,最后安装成功。当你见到如下图片的时候就说明你已经安装成功,接下来尽管next就行了。
3.jpg

现在authpuppy已经安装完了,先松一口气吧。

接下来我们就来配置wifidog.conf文件以实现和authpuppy相链接。
这是wifidog.conf文件

http://dev.wifidog.org/browser/trunk/wifidog/wifidog.conf

由于第一次接触路由,所以有几个地方先说明下,自己老是搞乱,给以后的新手留给经验。

最最重要的一点是,在这个配置文件里面第一格不能是空格,否则就会出错。

ExternalInterface br-lan 这个是lan口,这样才能连上路由,比如手机

GatewayInterface eth0.2 这个是wan口,通过这个与authpuppy server通信。所以主机的网卡要和wan同一网络,
我的wan口ip是192.168.2.200,要和Hostname同一网段,才能通信。

AuthServer {
Hostname 192.168.2.2
SSLAvailable yes
Path /authpuppy/web/
}
还有这个Path,一开始我是设置成 / 根目录,结果不行,出现了这个问题:
HTTP Response from Server: [HTTP/1.1 404 Not Found

后来设置成这个目录才可以。还有一点要注意的是Path的目录两边都要加/,不然也会出错。

本文章由 http://www.wifidog.pro/2014/12/24/wifidog-authpuppy%E8%AE%A4%E8%AF%81%E9%A1%B5%E9%9D%A2.html 整理编辑,转载请注明出处