wifidog认证接口

wifidog是搭建无线热点认证系统的解决方案之一,比nocat 更适合互联网营销思路。实现了路由器和认证服务器的数据交互,在路由器方是用C 语言代码,通过wifidog 程序和linux iptables防火墙实现接入用户的认证跳转和控制,在认证服务器方是通过php 实现用户的认证流程和管理。
优点:有开源代码,可以很方便的搭建认证系统,很容易移植到其他平台。
缺点:通过iptables方式实现,性能比较差,整体拉低了路由器的数据包处理速度,协议比较繁琐,对认证服务器的造成性能损耗比较大,在安全方面都是明文传输,有一定的安全隐患。
这里是官方提供的wifidog 的流程:
QQ图片20141210160552.png

主要用到的API:
1)跳转协议
对于新连接用户,路由器将其产生的任意url请求通过302重定向到认证平台。
请求格式:
http://auth_server/login/?
gw_id=
gw_address=
gw_port=
mac=
url=
例子:
GET /login/?
gw_id=808100949391&gw_address=192.168.81.1&gw_port=80&mac=aa:bb:cc:dd:cc:ee&url=http://www.sina.com.cn/HTTP/1.0
User-Agent:wifidog
Host:wifidog.pro

2)注册协议
平台确定成功注册用户,开通互联网权限,将用户请求重定向到路由器,完成注册。
请求格式:
http://gw_ip/wifidog/auth?
token=
例子:
GET wifidog/auth?token=12312412124
User-Agent:iphone
Host:路由器ip

3)用户状态心跳协议
请求格式:
http://auth_server/auth/?
stage=
ip=
mac=
token=
incoming=
outgoing=
注意:
ip,mac,token为用户的基本信息,incoming/outgoing为用户的连接计数信息。
stage=counter|login|logout,分别表示:已认证,新认证用户,超时需要删除的用户。
回复格式:
Auth:状态码(注意中间冒号和状态码之间有个空格)
状态码:
0-AUTH_DENIED-Userfirewallusersaredeletedandtheuserremoved.
1-AUTH_ALLOWED-Userwasvalid,addfirewallrulesifnotpresent
例子:
GET /auth/?stage=counters&ip=7.0.0.107&mac=00:40:05:5F:44:43&token=4f473ae3ddc5c1c2165f7a0973c57a98&incoming=6031353&outgoing=827770HTTP/1.0
User-Agent:wifidog
Host:wifidog.pro
注册请求成功,以307的方式跳转平台的portal/?gw_id=

4)网关心跳协议
Wifidog将ping协议作为心跳机制向认证服务器发送当前状态信息。实现认证服务器和每个节点的状态双向健康监测的机制。
请求信息:
http://auth_sever/ping/?
gw_id=%s
sys_load=%lu
sys_memfree=%u
sys_load=%.2f
wifidog_uptime=%lu
回复格式:
Pong
例子:
GET /ping/? gw_id=001217DA42D2&sys_uptime=742725&sys_memfree=2604&sys_load=0.03&wifidog_uptime=3861HTTP/1.0
User-Agent:wifidog
Host:wifidog.pro

本文章由 http://www.wifidog.pro/2014/12/10/wifidog%E8%AE%A4%E8%AF%81%E6%8E%A5%E5%8F%A3.html 整理编辑,转载请注明出处

wifidog+authpuppy认证页面的配置

路由器上我们使用wifidog 网关协议,服务器后端管理用authpuppy。
首先,选择自己的操作系统,在http://www.authpuppy.org/doc/Main_Page网站里面,操作系统是Linux。

然后到这个网站http://www.authpuppy.org/doc/Getting_Started去下载check_configuration.php 这个文件是检测电脑安装authpuppy需要哪些环境,下面是配置好的环境

d2facf27gx6Di229KDacc&690.png

然后到这个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这个里面的配置内容

d2facf27gx6Di3RgzV8d2&690.png

我一开始也没多想就直接复制和粘帖,结果安装到第三步就出错了。哦,忘了说怎么安装了,在浏览器的地址栏上输入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

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

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

12.png

现在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/10/wifidog-authpuppy.html 整理编辑,转载请注明出处

wifidog 代码简单分析(2)

上一节提到httpdAddC404Content 及它的回调函数,还有相应的流程,只是讲解功能,并不是指注册了回调函数就可以执行回调函数了,而是要等客户端触发回调函数才执行。下面接着讲解其他部分。

fw_destroy(), 清掉和wifidog 有关的iptables 规则,这里不细说。

fw_init(), 添加wifidog 相关的iptables 链及规则,这里的规则主要是wifidog.conf 里设置的firewall rule set, global/validating-users/known-users/unknown-users/locked-users,这里unknown-users 默认的四条关于53/67 port 的allow 规则需要打开。除了.conf里的,还有认证服务器也会被加入白名单,以使得客户端能够正常和认证服务器交互。

接下来,wifidog 会创建几个线程,注意,wifidog 是多线程运行不是fork 子进程:
1,超时检查线程:函数thread_client_timeout_check;
2,ping协议线程:函数thread_ping;
3,和wdctl 交互的线程,wdctl 是控制wifidog 结束,重启的程序,这里不细说;
4,httpd处理线程,函数thread_httpd,这个线程是在一个while 死循环里接受http 连接然后处理连接的线程,可以读取http 请求的具体内容,主要调用了两个函数httpdReadRequest/httpdProcessRequest,读取和处理http 请求。

我们主要来讲解下超时检查和ping 协议线程.
1) 函数thread_client_timeout_check 调用了fw_sync_with_authserver,其他部分代码是线程锁,我们只需要关注fw_sync_with_authserver 函数。
fw_sync_with_authserver 函数功能:网关每隔config.checkinterval 时间检查,把所有客户端链表的信息发送给认证服务器进行流量更新,并且计算每一个客户端距离上次认证成功之后所经过的时间,如果距离上次认证成功经过的时间超过config.checkinterval * config.clienttimeout,即认为已经超时,网关会发送此客户端的logout 通知认证服务器,并将此客户端的iptables 白名单移除,客户端需要重新认证。
2) 函数thread_ping 调用ping 函数。
ping()函数功能:网关定时发送Ping 协议包通知认证服务器证明自己是活的,发包的时间间隔也是config.checkinterval, ping协议格式:http://auth_server/ping/?gw_id=xxx&sys_uptime=xxx&sys_memfree&sys_load=xxx&wifidog_uptime=xxx,这些都是网关的参数,和客户端没有的关系。

本文章由 http://www.wifidog.pro/2014/12/09/wifidog%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90-1.html 整理编辑,转载请注明出处

wifidog 代码简单分析(1)

本文针对wifidog-20090925版本解释下wifidog的代码功能。
源码包括wifidog网关协议src 文件夹以及自带的libhttpd 库libhttpd 文件夹(libhttpd库用来创建wifidog 的http 服务,后面会提到这个库具体做什么),wifidog的配置文件wifidog.conf,这里主要分析src 文件夹里的源码。

按照看源码的习惯,在gateway.c main 里的开始,按流程分析。
config_get_config()函数,是一个获取全局变量config的函数,全局变量config 是关于网关全部配置的结构体,config 的成员变量都在wifidog.conf 文件里,这个变量时贯穿全部流程的一个全局变量,要看懂主要的变量的作用。如下所说config 都是指这个全局变量config。

config_init()函数,设置config 成员的默认初始值,有些设置成NULL,详细的看conf.c 的config_init函数,对照config 的结构体定义。

parse_commandline()函数,通过命令行获取config 结构体的某些成员值,如wifidog -c /etc/wifidog.conf, 通过-c 设置configfile 的值。

config_read(),读取configfile, 设置config 的成员值。这里要注意,config_read会覆盖parse_commandline 设置的config 成员值,parse_commandline会覆盖config_init设置的config 成员值。

config_validate(),检查config 的auth_server 和 gw_interface 值是否为空,因为这两个变量值最为重要。

client_list_init(), 这个函数涉及到另一个全局变量firstclient, 这个结构体主要保存客户端的信息,如ip, mac, token, incoming, outgoing等,客户端信息被存储到一个链表里,firstclient是链表头。

init_signals(),处理一些信号,如quit 信号,会清理一些iptables 规则,杀掉ping 协议线程和counter 协议线程,前者是网关不断发ping 包给认证服务器证明自己是活的,后者是网关向认证服务器更新客户端信息。

main_loop(),wifidog 流程开始。
首先检查config 的 gw_address 和 gw_id 有没有值,如果没有值,通过get_iface_ip 和get_iface_mac 来获取,这里gw_id 设置成网关gw_interface 的mac 地址,gw_address 是网关 gw_interface 的IP,一般gw_interface 是br0, 在wifidog.conf 里设置。

接着在网关 gw_interface 的IP 和 gw_port 上用libhttpd 库运行一个http server,并创建对于文件'wifidog'、''、'about'、'auth'、'status'的访问回调函数:http_callback_wifidog、http_callback_wifidog、http_callback_about、http_callback_auth以及http_callback_status,这里所谓的访问回调函数可以理解成当客户端访问auth 文件时会执行http_callback_auth函数,其他函数同理。

这里还有一个libhttpd的函数,httpdAddC404Content,这个函数是用来处理客户端第一次http 访问外网时执行回调函数,回调函数就是这个函数的第二个参数http_callback_404。

对于上面四个访问回调函数,我们下面会提到http_callback_auth,其余三个不重要,这里就不细说了。在此之前,我们先来看一下流程用到的第一个函数http_callback_404。

这里需要有个场景:我们连上了一个路由器(等同于这里的网关),这个路由器有wifigdog,并且绑定到了无线的interface 上,然后我们第一次上网,输入url: www.baidu.com。

在http_callback_404函数里,会把上述场景中的url 请求通过lihttpd 记录下来,然后判断认证服务器是否可达,接着就会把客户端的浏览器重定向到认证服务器: http://auth_server/login/?gw_id=xxx&gw_address=xxx&gw_port=xxx&url=www.baidu.com
接着网关就是等待认证服务器重定向客户端浏览器http://gatewayip:gatewayport/wifidog/auth?token=xxx, 这个token是认证服务器生成的,用来标识唯一客户端。浏览器重新访问网关,网关调用auth 的回调函数:http_callback_auth,这个函数就是拿着客户端浏览器发送的token 去认证服务器上核对token 的过程。

http_callback_auth(),该函数首先会检查http 报文里有没有token,然后通过arp_get 拿该报文发送者的ip 对应的MAC 地址,然后到之前提到的客户端链表里搜此ip 和mac 对应的客户端,如果搜不到,说明是新的客户端接入,那么就需要把它追加到链表里;如果这个客户端是logout请求(http报文请求里有logout),那么网关会发一个关于此客户端下线的通知到认证服务器;如果不是logout请求,那么不管是不是新的客户端,都需要再次认证一下,这时交由函数authenticate_client 处理。

authenticate_client(),因为我们之前已经把这个客户端追加到链表里了,所以首先去客户端链表里找,如果找得到这个客户端,那么就继续进行。网关将此客户端的mac、ip、token发送个login 请求到认证服务器[auth_server_request(&auth_response, REQUEST_TYPE_LOGIN, r->clientAddr, mac, token, 0, 0);],验证此token 和之前认证服务器给客户端的token 是否一致,如果一致会返回一个auth code=auth_allowed 给网关,通知网关对此客户端放通,网关收到后会将此客户端加入上网白名单(设置iptables 规则允许上网,客户端不再看到访问www.baidu.com 弹出非百度窗口),然后将客户端重定向到http://auth_server/portal/?gw_id=xxx, 到此网关协议工作完成,但我们的源码解析还没有完成,下面回到http 几个回调函数地方,接着讲解。

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