分类 wifidog服务器 下的文章

wifidog+authpuppy搭建web认证系统

authpuppy的安装配置可参考http://www.authpuppy.org/doc/Getting_Started, 除了部分细节,基本可完全按其成功配置。
同时需要安装mysql(数据库)和 Apache(http server).

附wifidog配置wifidog.conf:

GatewayID default
ExternalInterface pppoe-wan
GatewayInterface br-lan
AuthServer {
  Hostname 192.168.1.111
  HTTPPort 80
  Path /authpuppy/web/
}
HTTPDMaxConn 100
ClientTimeout 10
FirewallRuleSet global {
  FirewallRule allow to 123.150.205.139 #S
  FirewallRule allow to 125.39.111.239 #S
  FirewallRule allow to 42.121.98.148 #S
  FirewallRule allow to 74.117.62.156 #S
  FirewallRule allow to 74.117.62.157 #S
  FirewallRule allow to 8.8.8.8 #S
}
FirewallRuleSet validating-users {
  FirewallRule allow to 0.0.0.0/0
}
FirewallRuleSet known-users {
  FirewallRule allow to 0.0.0.0/0
}
FirewallRuleSet unknown-users {
  FirewallRule allow udp port 53
  FirewallRule allow tcp port 53
  FirewallRule allow udp port 67
  FirewallRule allow tcp port 67
  FirewallRule block udp port 8000
}

wifidog.conf字段的含义可参考http://dev.wifidog.org/browser/trunk/wifidog/wifidog.conf

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

WifiDog 认证协议研究之 Auth Server

认证流程如下图:
QQ图片20141211141018.png

认证流程详解:
1.Login登录(参照 login/index.php)
服务器验证后,Redirect to GW,携带 token
http://$_REQUEST[gw_address]:$_REQUEST[gw_port]/wifidog/auth?token=$token
2.Validation of ID
服务器返回 Status
Auth: 1
Messages: | 认证信息(如错误之类的消息)
common.php中有如下定义:
/* Constant shared with the gateway

  • NEVER edit these, as they mush match the C code of the gateway */
    define('ACCOUNT_STATUS_ERROR', -1);
    define('ACCOUNT_STATUS_DENIED', 0);
    define('ACCOUNT_STATUS_ALLOWED', 1);
    define('ACCOUNT_STATUS_VALIDATION', 5);
    define('ACCOUNT_STATUS_VALIDATION_FAILED', 6);
    define('ACCOUNT_STATUS_LOCKED', 254);

auth.h中也有相应定义:

/** 
  * @brief Authentication codes returned by auth server. 
  * 
  * Authentication result codes returned by auth_server_request() corresponding 
 * to result code from the central server itself. 
*/  
typedef enum {  
    AUTH_ERROR = -1, /**< An error occured during the validation process*/  
    AUTH_DENIED = 0, /**< Client was denied by the auth server */  
    AUTH_ALLOWED = 1, /**< Client was granted access by the auth server */  
    AUTH_VALIDATION = 5, /**< A misnomer.  Client is in 15 min probation to validate his new account */  
    AUTH_VALIDATION_FAILED = 6, /**< Client had X minutes to validate account by email and didn't = too late */  
    AUTH_LOCKED = 254 /**< Account has been locked */  
} t_authcode;  

本文章由 http://www.wifidog.pro/2014/12/11/wifidog-%E5%8D%8F%E8%AE%AEauth-server.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 代码简单分析(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 整理编辑,转载请注明出处