WiFidog运行环境及及主要和认证服务器交互函数

0:WiFiDog运行环境

/wlan/portal/buildroot/etc # ps -w  
\  PID USER       VSZ STAT COMMAND  
    1 root       868 S    init         
    2 root         0 SW<  [kthreadd]  
    3 root         0 SW<  [ksoftirqd/0]  
    4 root         0 SW<  [events/0]  
    5 root         0 SW<  [khelper]  
    6 root         0 SW<  [async/mgr]  
    7 root         0 SW<  [kblockd/0]  
    8 root         0 SW   [pdflush]  
    9 root         0 SW   [pdflush]  
   10 root         0 SW<  [kswapd0]  
   11 root         0 SW<  [crypto/0]  
   32 root         0 SW<  [mtdblockd]  
   37 root         0 SWN  [jffs2_gcd_mtd3]  
  564 root       864 S    /usr/sbin/telnetd   
  566 root       864 S    /usr/sbin/httpd -h /usr/www/   
  568 root       888 R    -sh   
  881 nobody    1004 S    dnsmasq   
 2191 root       868 R    ps -w   
 2340 root       876 S    udhcpd -S /etc/udhcpd.conf   
 3877 root       884 S    udhcpc -i eth0 -p /var/run/udhcpc_wan.pid -s /etc/udhcpc.script   
 3892 root      1788 S    wifidog -c /etc/wifidog.conf   
 4059 root      1788 S    wifidog -c /etc/wifidog.conf   
 4060 root      1788 S    wifidog -c /etc/wifidog.conf   
 4061 root      1788 S    wifidog -c /etc/wifidog.conf   
 4062 root      1788 S    wifidog -c /etc/wifidog.conf   
 /etc # ifconfig   
ath0      Link encap:Ethernet  HWaddr 00:0B:6B:B4:01:63    
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:1036165 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:902768 errors:0 dropped:181 overruns:0 carrier:0  
          collisions:0 txqueuelen:0   
          RX bytes:173265983 (165.2 MiB)  TX bytes:472405245 (450.5 MiB)  

br0       Link encap:Ethernet  HWaddr 00:0B:6B:B4:01:63    
          inet addr:192.168.100.10  Bcast:192.168.100.255  Mask:255.255.255.0  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:1038127 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:895866 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0   
          RX bytes:136852412 (130.5 MiB)  TX bytes:451119780 (430.2 MiB)  

eth0      Link encap:Ethernet  HWaddr 00:03:7F:FF:FF:FF    
          inet addr:192.168.0.143  Bcast:192.168.0.255  Mask:255.255.255.0  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:100545 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:83617 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:1000   
          RX bytes:94237206 (89.8 MiB)  TX bytes:9617979 (9.1 MiB)  

lo        Link encap:Local Loopback    
          inet addr:127.0.0.1  Mask:255.0.0.0  
          UP LOOPBACK RUNNING  MTU:16436  Metric:1  
          RX packets:50 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:50 errors:0 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:0   
          RX bytes:5181 (5.0 KiB)  TX bytes:5181 (5.0 KiB)  

wifi1     Link encap:UNSPEC  HWaddr 00-0B-6B-B4-01-63-00-00-00-00-00-00-00-00-00-00    
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
          RX packets:2682769 errors:0 dropped:0 overruns:0 frame:0  
          TX packets:3642860 errors:8464 dropped:0 overruns:0 carrier:0  
          collisions:0 txqueuelen:511   
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)  
          Interrupt:64 Memory:b0000000-b0020000   

/etc # brctl show  
bridge name bridge id       STP enabled interfaces  
br0     8000.000b6bb40163   no      ath0  
/etc #   
/etc # route  
Kernel IP routing table  
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface  
192.168.100.0   *               255.255.255.0   U     0      0        0 br0  
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0  
default         192.168.0.1     0.0.0.0         UG    0      0        0 eth0  
/etc # iptables -t nat -L  
Chain PREROUTING (policy ACCEPT)  
target     prot opt source               destination           

Chain POSTROUTING (policy ACCEPT)  
target     prot opt source               destination           
MASQUERADE  all  --  anywhere             anywhere              

Chain OUTPUT (policy ACCEPT)  
target     prot opt source               destination      

1: 用户,WiFiDog,Authpuppy交互过程
1.png

具体细节部分可以参考:http://dev.wifidog.org/wiki/doc/developer/FlowDiagram

2:wifidog与authpuppy交互数据包
1) 当用户首次访问一个网址的时候:wifidog会将用户的请求重定义到登陆认证界面:
http://192.168.0.142:80/authpuppy/web/login/?gw_address=192.168.100.10&gw_port=2060&gw_id=123456789&mac=90:7a:28:01:20:26&url=www.baidu.com
2) authpuppy就回复一个包给运行wifidog的路由器的用户客户端浏览器,浏览器重定向到路由器:
http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token]
3) 路由器与authpuppy之间的登陆认证数据:
http://192.168.0.142:80/authpuppy/web/auth/?stage=login&ip=192.168.100.11&mac=90:7a:28:01:20:26&token=9941ed0bc138c12c6edc4b1ed8358bd4516b86f2&incoming=0&outgoing=0&gw_id=123456789
4) authpuppy 回复一个auth code给路由器,表明token 正确与否
5) 路由器收到auth code:1,重定向浏览器:
http://192.168.0.142/portal/?gw_id=123456789

wifidog的路由器更新traffic counters到authpuppy
http://192.168.0.142:80/authpuppy/web/auth/?stage=counters&ip=192.168.100.11&mac=90:7a:28:01:20:26&token=9941ed0bc138c12c6edc4b1ed8358bd4516b86f2&incoming=1161884&outgoing=81646&gw_id=123456789

用户超时下线:
http://192.168.0.142:80/authpuppy/web/auth/?stage=logout&ip=192.168.100.11&mac=90:7a:28:01:20:26&token=9941ed0bc138c12c6edc4b1ed8358bd4516b86f2&incoming=0&outgoing=0&gw_id=123456789

3:wifidog代码主要函数执行顺序
http_send_redirect_to_auth()函数是WiFidog路由器发送数据给用户的接口。
流程1:httpdGetConnection()-->thread_httpd()-->httpdReadRequest()-->httpdProcessRequest()-->http_callback_404()-->http_send_redirect_to_auth()

流程2:httpdGetConnection()-->thread_httpd()-->httpdReadRequest()-->httpdProcessRequest()-->http_callback_auth-->authenticate_client()-->
auth_server_request(&auth_response, REQUEST_TYPE_LOGIN, r->clientAddr, mac, token, 0, 0)-->fw_allow()-->iptables_fw_access()-->iptables_do_command()--->http_send_redirect_to_auth(r, urlFragment, "Redirect to portal");

本文章由 http://www.wifidog.pro/2014/12/16/WiFidog%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83.html 整理编辑,转载请注明出处

wifidog+authpuppy搭建WiFi 认证平台

0:前提
其实搭建认证环境都是基础,重要的是要对WiFidog的代码进行详细的研究,了解清楚wifidog与authpuppy之间进行了哪些数据交互,WiFidog的程序框架及iptables的建立及生效规则,这才是重点。WiFidog和之前nodogsplash的代码90%是一样的,只是之前没有研究nodogsplash的外部认证机制。
WiFidog可以通过外部认证来控制用户的上网行为,此处的外部认证接口就是:authpuppy。

1:authpuppy安装之前准备
在安装authpuppy的过程遇到很多问题,但是都能根据网上其他朋友的提示可以搞定,我将自己想要的配置文件copy上来。

[root@localhost /etc]$cat host.conf   
multi on  
order hosts,bind  
[root@localhost /etc]$cat hosts  
127.0.0.1       localhost.localdomain   localhost  
127.0.0.1       authpuppy.localhost  


::1         localhost6 localhost6.localdomain localhost6 localhost6.localdomain6

之后就是 httpd相关的配置文件:
/etc/httpd/conf]$cat httpd.conf
同时常用的命令如下:
service httpd restart,service mysqld restart等

其配置文件中主要就是配置一个虚拟目录.其配置内容如下:

<VirtualHost *:80>  
    ServerAdmin webmaster@test  
    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 /var/log/httpd/error.log  
    # Possible values include: debug, info, notice, warn, error,crit,  
    # alert, emerg.  
    LogLevel warn  

    CustomLog /var/log/httpd/access.log combined  

</VirtualHost>  
[root@localhost /etc/httpd/conf]$cat httpd.conf 

其中可以看出:

ServerName authpuppy.localhost
DocumentRoot "/var/www/"   #web的根目录
DirectoryIndex index.php   #访问的主页http://192.168.0.142/authpuppy/web/index.php
<Directory /var/www/authpuppy/web/> #authpuppy的目录位置
          Options Indexes FollowSymLinks MultiViews
          AllowOverride All
          Order allow,deny
          allow from all
</Directory>

authpuppy的目录位置及结构如下:
QQ截图20141216162755.png

建立好上面的环境之后,下面就要建立MySQL数据库。建立好的数据如下:

[root@localhost ~]$mysql  
Welcome to the MySQL monitor.  Commands end with ; or \g.  
Your MySQL connection id is 813  
Server version: 5.1.47 Source distribution  

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.  
This software comes with ABSOLUTELY NO WARRANTY. This is free software,  
and you are welcome to modify and redistribute it under the GPL v2 license  

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  

mysql> show databases;  
+--------------------+  
| Database           |  
+--------------------+  
| information_schema |  
| authpuppy          |  
| mysql              |  
+--------------------+  
3 rows in set (0.01 sec)  

mysql> use authpuppy;  
Reading table information for completion of table and column names  
You can turn off this feature to get a quicker startup with -A  

Database changed  
mysql> show tables;  
+---------------------------+  
| Tables_in_authpuppy       |  
+---------------------------+  
| ap_applicable_policies    |  
| ap_connection_policies    |  
| ap_node_authenticators    |  
| ap_node_policies          |  
| ap_node_user_bypass       |  
| ap_plugin_config          |  
| ap_plugins_migrations     |  
| ap_user                   |  
| ap_user_remember_me       |  
| connections               |  
| migration_version         |  
| nodes                     |  
| sf_guard_forgot_password  |  
| sf_guard_group            |  
| sf_guard_group_permission |  
| sf_guard_permission       |  
| sf_guard_remember_key     |  
| sf_guard_user             |  
| sf_guard_user_group       |  
| sf_guard_user_permission  |  
+---------------------------+  
20 rows in set (0.00 sec)  

mysql> slect * from ap_user;  
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'slect * from ap_user' at line 1  
mysql> select * from ap_user;  
+----+----------+--------------------------+--------------------+---------------------+------------------------------------------+--------+----------------+  
| id | username | password                 | email              | registered_on       | validation_token                         | status | username_lower |  
+----+----------+--------------------------+--------------------+---------------------+------------------------------------------+--------+----------------+  
|  1 | suiyuan  | H9hK9mgDAXdJnkYghQczkQ== | suiyuan626@163.com | 2014-06-10 16:05:25 | eda2838b1543e16fcfd7da6064886be67c544042 |      5 | suiyuan        |  
|  4 | xue      | H9hK9mgDAXdJnkYghQczkQ== | xue626@163.com     | 2014-06-10 17:04:07 | 117b0cd467900c59b9e60bb52719ce3551d321ce |      5 | xue            |  
+----+----------+--------------------------+--------------------+---------------------+------------------------------------------+--------+----------------+  
2 rows in set (0.00 sec)  

mysql>   

其中上面是创建的俩个用户,是通过authpuppy的管理界面来创建的,用户在认证的时候只有输入正确的用户名及密码才能才算认证通过。同时如果不创建数据库,在启动authpuppy的时候会告诉缺少相应的文件目录。

3:安装过程
由于我们已经安装成功了,安装的过程中没有怎么抓图。

2.png

其中过一定要记住上面的用户名及密码,后面登陆的时候要用到,最好也写一个邮箱地址,如果忘记密码也可以找回来。
当安装成功之后访问:http://192.168.0.142/authpuppy/web/index.php
如下界面:
4.png

输入之前的用户名及密码(第二张图片上面的用户名及密码)。登陆之后的界面如下:
3.png

之后就可以安装插件,现在随便看看几个菜单。
6.png

上面就是数据库里面创建的用户suiyaun(用户已此用户名进行登陆认证的)的上网的一些信息。

wifidog运行时的配置文件,其实配置文件只需要几个关键的参数就可以运行。

# WiFiDog Configuration file  

GatewayID 123456789  

ExternalInterface eth0  

GatewayInterface br0  

HtmlMessageFile /opt/wifidog/etc/wifidog-.html  


AuthServer {  
    Hostname 192.168.0.142  
    SSLAvailable no  
    Path /authpuppy/web/  
}  

CheckInterval 60  

# The timeout will be INTERVAL * TIMEOUT  
ClientTimeout 5  

# Parameter: TrustedMACList  
# Comma separated list of MAC addresses who are allowed to pass  
# through without authentication  
#TrustedMACList 00:00:DE:AD:BE:AF,00:00:C0:1D:F0:0D  


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  
}  

FirewallRuleSet locked-users {  
    FirewallRule block to 0.0.0.0/0  
}  

本文章由 http://www.wifidog.pro/2014/12/16/wifidog-authpuppy%E6%90%AD%E5%BB%BA.html 整理编辑,转载请注明出处

wifidog标准流程描述

一 认证流程描述:
i. Wifidog 运行之后建立一系列的防火墙规则,主要规则起到如下作用:
    1.阻断所有内网到外网的访问。
    2.开通内网到外网的 dns 访问。
    3.开通内网到认证服务器以及域名白名单的访问。
    4.对内网到外网 80 端口的访问转向到 wifidog 自己的 http 服务(2060 端口)。

ii. 手机、pc 连接上来后,app 或者系统(安卓、ios 会自己连接到各自的服务器上来验证网络的连通性)会发起对外网的访问请求,dns 请求会被放过,然后对应的 80 端口的访问会被指向 2060 的 http 服务,其他的请求都会被拦截。

iii. Wifidog 的 http 接到 web 请求后,基本上都会被指向 404 页面,404 页面会给客户端一个重定向返回(302),要求客户端重定向访问认证服务器的 login 页面,附加参数 gw_id、gw_address、gw_port、url。

iv. 手机、pc 客户端加载、显示认证服务器的 login 页面,用户根据页面内容做相关的认证操作(qq 登录、微博登录、用户名密码登录、手机短信登录等多种登录方式) ,原则只有一个认证不成功就仍然让用户停留在认证服务器继续认证操作,认证成功给客户端一个 302 重定向返回,根据 login 接口提交上来的参数 gw_address、gw_port 跳转套 wifidog web 服务的/wifidog/auth 页面上,附带 token 和 url 参数。

v. Wifidog 的 web 服务收到手机、pc 客户端的/wifidog/auth 请求后,会主动对认证服务器的 auth 接口发起一个验证请求, 附带参数 ip、 mac、 token、 stage=loginvi. 认证服务器的 auth 接口收到 wifidog 的请求, 要根据内部逻辑返回是否允许通过的应答 :
    Auth: 0 拒绝
    Auth: 1 允许

vii. Wifidog 接收到验证结果后,如果拒绝访问,就会返回 302 给客户端,重定向到认证服务器的 gw_message 接口,附带 message=denied 参数,客户端的上网访问仍然会回到第二步骤;如果允许访问,则改动防火墙规则,开通改客户端的上网(至此客户端已经能够正常上网) ,然后返回 302 重点向给客户端,重定向到认证服务器的 portal 接口,附带参数 gw_id。

viii. 认证服务器的的 portal 接口根据业务流成显示广告业或者做其他的跳转ix. 整个认证流程完成。

二 ping 心跳流程描述
i. ping 接口 wifidog 检测认证服务器访问是否正常、并向认证服务器提交 wifidog的运行状态。

ii. 定时 ping 认证服务器。

iii. 提交的参数 gw_id、sys_uptime、sys_memfree、wifidog_uptime。

三 auth 心跳流程描述
i. 和 ping 一样的频率定期请求认证服务器,并且有多少已认证客户端就发多少请求。
ii. 用来向认证服务器提交客户端的状态以及执行认证服务的验证结果。
iii. 提交的参数有:ip、mac、token、incoming、outgoing 、stage=counters。
iv. 如果服务器返回拒绝,则 wifidog 改动防火墙规则,关闭该客户端的上网。

本文章由 http://www.wifidog.pro/2014/12/15/wifidog%E6%B5%81%E7%A8%8B-1.html整理编辑,转载请注明出处

wifidog 认证

首先简单介绍一下什么是Portal认证,Portal认证,通常也会叫Web认证,未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其中的服务。当用户需要使用互联网中的其它信息时,必须在门户网站进行认证,只有认证通过后才可以使用互联网资源。现金很多中国移动CMCC、中国联通、中国电信ChinaNet的WIFI都使用这种认证接入方式。

在OpenWRT上实现Portal认证,实际上早已有解决方案:

  1. chillispot,但原维护作者停止更新,被chillispot.info接管继续开发;
  2. coova-chilli,它是基于chillispot开发拓展的,功能最为强大;可以去官方看一下Coova-chilli;
  3. wifidog
    前两个由于原维护作者停止更新,笔者也没有深入研究,重点钻研了wifidog,Wifidog也是OpenWRT和DD-WRT中实现Portal比较出名的。
    但是,Wifidog只是实现AP认证网关,需要配合外部的Portal服务器才能使用,Portal主要是提供认证所需的WEB页面且实现认证计费等的功能。虽然这也有很多商用解决方案,例如wiwiz、wifiap等,但是这些商业解决方案的目标都是盈利,即使可以免费使用,免费账号的功能和权限都受到了很大的限制,例如不能自定义页面,Web认证页面有广告等等。有条件的人可能打算自己搭建Portal服务器,但是看看Wifidog的官方Wiki,对搭建过程实在是难以理解。后来,笔者发现网络上还有一个authpuppy方案,官方网站www.authpuppy.org,是一个已实现好的Wifidog认证服务器,里面包含各种插件供你使用,官方的安装过程也很简单,如果你懂的HTML和面向对象编程的相关知识且拥有一个服务器,可以自行修改认证页面,使用authpuppy也是一个不错的方案。
    但是,即便如此,这些方案还是不够灵活,经过笔者认真钻研,查阅大量资料并经过多次抓包分析,终于理解了Wifidog的工作原理。接下来笔者将会跟你介绍如何自行编写一个轻量级的Web Portal认证服务器。当然,这需要你具有程序设计基础,HTML、CSS当然是少不得的,后端开发语言可以使用PHP或Python或Java等。
    首先,需要简单介绍一下Wifidog的工作原理:
  4. 客户端发出初始化请求,比如访问 www.baidu.com。
  5. 网关的防火墙规则将这个请求重定向到本地网关的端口上。这个端口是Wifidog监听的端口。
  6. Wfidog提供一个HTTP重定向回复,重定向到Web认证页面,重定向的Url的Querystring中包含了Gateway的ID,Gateway的FQDN以及其他的信息。
  7. 用户向认证服务器发出认证请求
    http://portal_server:port/login_script?
    gw_id=[GatewayID, default: "default"]
    gw_address=[GatewayAddress, internal IP of router]
    gw_port=[GatewayPort, port that wifidog Gateway is listening on]
    url=[user requested url];
  8. 网关返回一个(可以是自定义的)splash(也称作“登录”)页面。
  9. 用户提供他的凭据信息,比如用户名和密码。
  10. 成功认证的话,客户端将会被重定向到网关的自己的web页面上,并且带有一个认证凭据(一个一次性的token),内容比如:
    http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token];
  11. 用户就是用获取到的凭据访问网关。
  12. 网关去认证服务器询问token的有效性。
  13. 认证服务器确认token的有效性。
  14. 网关发送重定向给客户端,以从认证服务器上获取 成功提示页面,重定向到 http://portal_server:port/portal_script 这个位置。
  15. 认证服务器通知客户请求成功,可以上网了。

    图解:
    11.bmp

    图解Wifidog工作原理
    

然后考察一下Wifidog的配置文件/etc/wifidog.conf,关键的配置项是:

AuthServer {
    Hostname             (Mandatory; Default: NONE)
    SSLAvailable           (Optional; Default: no; Possible values: yes, no)
    SSLPort               (Optional; Default: 443)
    HTTPPort             (Optional; Default: 80)
    Path                  (Optional; Default: /wifidog/ Note:  The path must be both prefixed and suffixed by /.  Use a single / for server root.)
    LoginScriptPathFragment  (Optional; Default: login/? Note:  This is the script the user will be sent to for login.)
    PortalScriptPathFragment (Optional; Default: portal/? Note:  This is the script the user will be sent to after a successfull login.)
    MsgScriptPathFragment    (Optional; Default: gw_message.php? Note:  This is the script the user will be sent to upon error to read a readable message.)
    PingScriptPathFragment    (Optional; Default: ping/? Note:  This is the script the user will be sent to upon error to read a readable message.)
    AuthScriptPathFragment    (Optional; Default: auth/? Note:  This is the script the user will be sent to upon error to read a readable message.)
}

# Listen on this port
GatewayPort 2060

# Parameter: CheckInterval
# Default: 60
# Optional
#
# How many seconds should we wait between timeout checks.  This is also
# how often the gateway will ping the auth server and how often it will
# update the traffic counters on the auth server.  Setting this too low
# wastes bandwidth, setting this too high will cause the gateway to take
# a long time to switch to it’s backup auth server(s).
CheckInterval 60

# Parameter: ClientTimeout
# Default: 5
# Optional
#
# Set this to the desired of number of CheckInterval of inactivity before a client is logged out
# The timeout will be INTERVAL * TIMEOUT
ClientTimeout 5

AuthServer是Portal服务器的配置项;

GatewayPort是Wifidog监听的地址,默认是2060,一般保持默认即可;

CheckInterval是心跳时长,单位是秒,什么是心跳呢,客户端认证成功之后,如果有网络访问动作,Wifidog getway就会每隔一段时间访问Portal服务器的一个脚本,用于认证计费,当然,如果客户使用超时或超流量,也可以通过心跳强制客户端下线。

ClientTimeout是用户一次认证成功后的网络访问时长,超过这个时间需要重新认证,这个时长并非由ClientTimeout单独决定,取决于INTERVAL * TIMEOUT。

详细的配置信息可以访问:http://dev.wifidog.org/browser/trunk/wifidog/wifidog.conf

我们重点讨论Portal服务器的配置项,Hostname是Portal服务器的ip或者是域名,SSLAvailable和SSLPort是SSL加密配置,如果你的Portal服务器有配置HTTPS加密,则需要配置这两项;Path是指你的脚本路径(举例,http://a.com/to/,则a.com是域名,/to/是路径),注意路径必须以“/”开头和结尾,如果是根路径,则填一个“/”即可;接下来的5个配置指明你的脚本名,这说明了我们需要写五个脚本,我会详细说明。(以下文中涉及的“第几步”均是指Wifidog认证过程的步骤)

LoginScriptPathFragment配置项配置的是登陆脚本,它通过GET方式接受传入参数gw_address、gw_port、gw_id、mac和url,gw_address是AP Getway的ip地址;gw_port是Wifidog监听的端口,即上面介绍的wifidog.conf中的GatewayPort配置;gw_id是AP Getway的id,配置文件wifidog.conf中可以配置,默认值是default,这个值的作用是当存在多个AP是,服务器或管理员可以根据不同的id确定用户的接入点;mac是客户计算机的网卡物理地址,注意不是AP网关的mac,这个mac是用来识别客户计算机的;url是客户初始访问的Url,这些Querystring都是AP Getway向客户端发出重定向请求自动生成的。这个脚本同时需要提供登陆页面,如果登陆成功,需要向客户;端返回302重定向,重定向到:http://gw_address:gw_port/wifidog/auth?token=[token];即实现第7步,其中[token]是你自己自动生成的token字符串,随机生成一个字符串即可,但是长度最好长些,安全性更高,另外,token需要根据不同用户保存,最好保存于数据库中,之后的AP Getway询问token有效性(第9步)还需要用到。这里最好使用cookie或session,使之后的登陆成功页面可以判断用户已经成功,阻止未登录成功的人访问认证成功页面。

PortalScriptPathFragment配置项配置的是登陆成功后服务器展示的脚本(第11步),它通过GET方式接受1个传入参数,gw_id,这个脚本比较简单,告知用户登陆成功即可,当然,最好重定向到用户之前想要方位的url,即第1步用户输入的URL。

MsgScriptPathFragment配置项配置的是错误信息展示脚本,它通过GET方式接受一个传入参数message,这个脚本也很简单,展示message的内容即可,目的是当认证过程出现错误,AP Getway会重定向到这个脚本,URL中含有错误的信息。

PingScriptPathFragment配置项配置的是心跳脚本,这个脚本它通过GET方式接受5个传入参数,gw_id,sys.uptime,sys.memfree,sys.load,wifidog.uptime,其中,sys.uptime指的是AP Getway的启动时间,sys.memfree指的是AP Getway的空闲内存,sys.load指的是AP Getway的CPU负载,wifidog.uptime指的是wifidog的启动时间,这个脚本每隔一段时间(Wifidog.conf里配置的CheckInterval),Wifidog会自动访问,但是其目的不是用户验证,而是帮助管理员管理AP节点,了解AP节点的负载情况,适时增加节点等,Wifidog访问这个脚本时,需要这个脚本返回Pong,如果你没有统计AP节点负载数据的需求,可以丢弃这些数据,直接回应Pong,注意,这个回应只包含“Pong”字符串,无需包含其他html标签。

AuthScriptPathFragment是用户认证脚本,实现的是第10步的功能,这个脚本它通过GET方式接受7个传入参数:stage、ip、mac、token、incoming、outcoming和gw_id。其中stage的值是login,ip是客户端的ip,注意不是AP Getwap的ip;mac是客户端的网卡物理地址,token就是你在认证脚本生成并返回给客户端的;incoming和outcoming用于流量控制,默认值为0;gw_id同上。如何识别用户登录成功,通过mac和token吧,LoginScriptPathFragment登陆脚本在用户登陆成功后需要记录用户的mac和token,然后在此处验证,如果匹配,回复Auth: 1,否则,回复Auth: 0。另外,这个脚本也是心跳脚本,每隔一段时间Wifidog会自动访问,如果用户使用时间超过限制或流量超过额度,服务器可以及时回应Auth: 0结束用户的访问。另外需要注意的是,回应同样无需包含html标签,另外,在Auth后的冒号和0/1之间,有一个空格,缺少这个空格也会导致出错。
在配置Wifidog的配置文件wifidog.conf是,配置脚本的配置项都必须以“?”结尾,否则以GET方式传递的QueryString会因Url缺少问号访问错误的脚本。

看到了吧,仅仅5个简单脚本,就可以实现利用Wifidog的Portal认证,当然,这过中还可以有很多应用尚未发掘,比如流量控制、带宽控制、结合Radius服务器实现认证等,你的开发也可以更上一层楼,实现更多功能。不过笔者还有一个建议,在登录页面除了用户名和密码意外,最好加个验证码,防止不怀好意之人暴力破解。
这样,你只需要一个免费的空间,甚至是简单的百度云、新浪SAE等,就可以实现一个认证服务器;有的人可能还会问,能不能把这些脚本集成到路由器当中,我的回答是能,只要你的脚本的功能不多,问题应该不大,但是这么做的风险比较大,路由的负载比较高,导致路由的运行会很不稳定,甚至经常死机,这也是笔者亲身实践的结果,所以笔者不建议这么做。

最后啰嗦提醒的是,WiFidog是使用iptables基于三层协议工作的,所以使用Wifidog的结果是,不仅是Wifi接入需要Portal认证,有线接入同样需要认证。避免这种情况最简单的做法是设立mac白名单。可能有的人又会问,能不能做到仅是Wifi接入需要认证,有线接入的无需认证,有的人可能想更上一层楼,能不能开两个Wifi,仅其中一个Wifi需要认证,另一个Wifi和有线网络不需要Portal认证,我的回答是能,至于具体做法,以后再介绍。

本文章由 http://www.wifidog.pro/2014/12/15/wifidog%E8%AE%A4%E8%AF%81.html 整理编辑,转载请注明出处