分类 wifidog认证 下的文章

wifidog源码wifidog分析 - wifidog原理

wifidog是一个用于配合认证服务器实现无线网页认证功能的程序,常见的情景就是使用于公共场合的无线wifi接入点,首先移动设备会连接公共wifi接入点,之后会弹出网页要求输入用户名密码,认证过后才能够连入外网。其主页是http://dev.wifidog.org/

实现原理

  其实wifidog原理很简单,主要是通过管控iptables,配合认证服务器进行客户端的放行操作。wifidog在启动后都会自动启动三个线程,分别为客户端检测线程、wdctrl交互线程、认证服务器心跳检测线程。每当新用户连接无线AP并浏览网页时,wifidog会获取新用户的此次操作,并返回一个重定向到认证服务器的http于用户,此后用户通过认证服务器认证后,再继续浏览网页时,wifidog会询问认证服务器此用户权限,若放行则修改iptables放行此用户IP。

  主要流程如下
添加关键路径对应的回调函数
删除所有iptables路由表
建立新的iptables路由表
开启客户端检测线程(用于判断客户端是否在线,是否登出)
开启wdctrl交互线程
开启认证服务器心跳检测线程
循环等待客户端连接(使用socket绑定2060端口并监听,实际上在建立新的iptables路由表规则时会将网关的80端口重定向到2060端口)

  回调函数
  回调函数主要用于根据用户http报文执行不同的操作,其原理就是分析http报文请求中有没有关键路径,若有,则执行关键路径对应的回调函数,若没有,则返回一个重定向到认证服务器的包给用户。一次典型的流程为

用户连接无线AP,访问某网站(比如http://www.baidu.com
wifidog获取到此http报文,检查是否包含关键路径,没有则返回重定向包给用户,将其重定向到认证服务器
用户认证成功,认证服务器将用户重定向到无线AP网关,并包含关键路径"/wifidog/auth"和token
wifidog接收到用户重定向后访问的报文,检测到关键路径"/wifidog/auth",然后访问认证服务器进行token认证
认证成功,wifidog修改iptables放行此用户(根据mac和ip进行放行)

  wifidog的iptables规则
  这一部分我没有仔细认真看源码,但可以推论出wifidog是怎么修改iptables的规则的,了解iptables基本原理的同学都清楚iptables实际上有两条路进行数据包处理,一条路会通过应用程序,一条路不同过应用程序,直接到POSTOUTPUT,而我认为wifidog建立的规则是

只要是访问认证服务器的http请求都直接不通过wifidog发送出去
只要是通过认证的客户端wifidog都会修改iptables让其数据直接从FORWARD到POSTOUTPUT,而不经过wifidog
其他行为都必须进过wifidog处理

  客户端检测线程
  此线程每隔60s会遍历一次客户端列表,对每一个客户端列表统计流量,如果客户端在60s间隔内没有新产生的流量则不更新客户端的最新更新时间,当当前时间减去最新更新时间大于断线要求时间时,则会将此客户端从客户端列表删除,并修改iptables规则禁止其访问外部网络,然后发送此客户端登出包于认证服务器,认证服务器根据此登出包将此客户端做登出处理。如若没有超出断线要求时间,此线程还会发送客户端状态获取包于认证服务器,认证服务器返回此客户端在认证服务器上的信息,如若信息表示此客户端已在认证服务器上登出,wifidog则会执行此客户端下线操作。

  wdctrl交互线程
  其原理是使用unix socket进行进程间通信,具体实现在之后文章中体现

  认证服务器心跳检测线程
  原理也很简单,就是每隔60s将路由的一些系统信息发送给认证服务器,认证服务器接收到会返回一个回执

  循环等待客户端连接
  这里主要会接收到两种类型的客户端连接

未认证的客户端打开网页操作,wifidog会接收到此http请求,并返回一个重定向到认证服务器的包于客户端
经过认证服务器认证成功后,认证服务器自动将客户端重定向到无线AP的操作,wifidog接收到此类http请求后会检测关键路径"/tmp/wifidog",并把http请求中携带的token与认证服务器进行认证,认证成功后则修改iptables放行客户端。

本文章由 http://www.wifidog.pro/2015/04/02/wifidog%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-7.html 整理编辑,转载请注明出处

Wifidog分析wifidog认证网关协议v1

网关心跳(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" 
"\r\n",

一个标准的HTTP需求应该是:

GET /ping/?gw_id=001217DA42D2&sys_uptime=742725&sys_memfree=2604&sys_load=0.03&wifidog_uptime=3861 HTTP/1.0
User-Agent: WiFiDog 1.1.3_beta6
Host: wifidog.pro

认证服务器认证协议
这个页面描述了当用户已经被认证并允许访问互联网时,为了认证用户和进程,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.
6 - AUTH_VALIDATION_FAILED - User email validation timeout has occured and user/firewall is deleted
1 - AUTH_ALLOWED - User was valid, add firewall rules if not present
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: wifidog.pro

网关重定向浏览器
客户端浏览器在不同情况下会被重定向到其它页面:
初始化请求:
基于捕捉,客户端会被网关重定向到以下URL:

login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s 
例如:https://wifidog.pro/login/?gw_id=0016B6DA9AE0&gw_address=7.0.0.1&gw_port=2060

初始化请求之后
当请求被处理并且客户端已经被重定向到网关时
如果服务器回复AUTH_DENIED:注意你通常在标准认证服务器上看不到这样的提示。客户端将不会被重定向回网关。

gw_message.php?message=denied 

如果服务器回复AUTH_VALIDATION:

gw_message.php?message=activate 

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

portal/?gw_id=%s 

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

gw_message.php?message=failed_validation

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

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

本文章由 http://www.wifidog.pro/2015/04/01/Wifidog%E5%88%86%E6%9E%90wifidog%E8%AE%A4%E8%AF%81.html 整理编辑,转载请注明出处

Wifidog认证服务器安装

需要
PHP5
PHP5服务器。推荐Apache httpd服务器,用虚拟主机也不错。
必要的扩展:pgsql,dom和bmstring
可选的扩展:xml,gettext,mcrypt,mhash,xmlrpc
PEAR(PHP扩展与应用库)扩展:radius,Auth_RADIUS,Crypt_CHAP
PHP类库:Smarty,MagpieRSS,Phlickr
强烈建议安装选用项,以便激活认证服务器的所有特性。如果你不知道哪些已经安装,install.php将会进行检测它们并显示出对你有用的信息。最后一项将会通过install.php自动下载安装。
重要提示:认证服务器所需内存要大于PHP默认的8Mb。你需要在php.ini将其提高到32Mb或64Mb。如果你没进行此操作,也会安装成功,但不久就会用光内存。

PostgreSQL
正确配置PostgreSQL服务器。install.php脚本不会向PostgreSQL数据库服务器提供特殊的安全方式。系统管理员要做的是授予正确的数据库存取许可。

快速安装
1) 将Wifidog认证服务器软件源从CVS中撤出
2) 在人喜欢的浏览器中打开http://server.com/wifidog/install.php并按说明操作
3) 在config.php设置语言
4) 用管理员身份登录,填入网络信息,创建热点和目录

install.php
即使是install.php也无法尽其所能的来简化安装。但它能很快的给你一个门户,你可以做为管理员进行登录,自定义你的网络,热点,目录,用户等。
首先,你需要在浏览器中打开install.php。如果你尝试另一个门户网页,并且认证服务器没有预先设置好,那么你的浏览器将自动重新导向install.php。
1.jpg

按照网页上的说明创建wifidog用户和数据库。
第一次打开install.php,脚本会在/tmp/dog_cookie.txt文件中随机产生密码。这只是一种安全控制,用来防止选程用户用新安装的认证服务器做坏事。这个文件只是随机密码,不需要用户名。

版本
TODO文本
2.jpg

许可
这个页面是用来检测丢失的文件或许可。它能通过命令行给你一些解决这些问题的提示。但这些命令只是给你一些帮助,并不是用来解决这些问题。
如果许可正确将会出现“back/next”键。当你做出修改后点击“Refresh”键进行更新。
3.jpg

Smarty
认证服务器需要Smarty,你不能跳过此步进行安装….点击“NEXT”
4.jpg

MagpieRSS
可根据需求决定是否安装。但建议您安装它来激活认证服务器的特性。
5.jpg

Phlickr
可根据需求决定是否安装。但建议您安装它来激活认证服务器的特性。

Database access
TODO: screenshot+text
l 填写信息
l 测试连接

数据库安装
TODO: screenshot+text
l 创建DB模式
l 输入DB原始数据
l 如果需要,更新模式

选项
TODO: screenshot+text

管理帐户
TODO: screenshot+text
点击NEXT,你将被重新导向Wifidog门户网页

清除
将CONF_USE_CRON_FOR_DB_CLEANUP设置成false,或者将这行脚本写在/in/etc.cron.hourly

cd  && su apache -c 'php -f cron/cleanup.php'

或者在crontab,或者取决于你的cron
你也许需要在cron/cleanup.php中将

require_once('../include/common.php');

改成:

require_once(dirname(__FILE__).'/../include/common.php');

节点故障报告
此项可选。如果你需要此功能,你需要在crontab执行它,方法是:

*/1 * * * * (cd /var/www/wifidog-auth-prod/wifidog/cron/; /usr/local/bin/php -Cq ./page.php 2>/dev/null)

它将每分钟执行一次。我确信我们可以将路径设置在页面顶端的解释器(/usr/local/bin/php –Cq,这样更便于执行。

本文章由 http://www.wifidog.pro/2015/04/01/wifidog-auth-server-install.html 整理编辑,转载请注明出处

Wifidog安装网关协议

需求:
1) 熟悉GNU/Linux环境
2) 内核中编译了netfilter的GNU/Linux OS
3) Iptables
4) GNU C 编辑器。其它编辑器可能也适用,但我们没有测试,也不支持。
5) 可以从SourceForge得到最新的Wifidog TAR包

预安装
很多人会在这里遇到问题,所以我们大致陈述一下:
将Wifidog引入到环境之前先要确保一切都是正常运行

l 路由器须boot正确
l 路由器能正确调出界面
l 路由器须联网
l 正确设置DNS,并能正常运行
l 正确设置DHCP
l 装载ipt_mac.o内核模块
l 如果用NAT,路由器必须用iptables设置NAT/masquerading规则
l 获取WIFI的客户端必面能够绑定和联接到互联网
l 当路由器开始运行时,以上所有须自动运行

安装
Wifidog跟其它开源项目一样,使用标准的自动化工具,使得安装更加便捷。打开TAR包获取来自SVN的最新资源,然后按以下步骤:

./autogen.sh
make
make install

如果你没有用make install来安装,二进制文件会保存在src/wifidgo。

OpenWrt ipkg
mkdir ~/wifidog.openwrt
cd ~/wifidog.openwrt
wget http://downloads.openwrt.org/whiterussian/newest/OpenWrt-SDK-Linux-i686-1.tar.bz2
tar -jxvf OpenWrt-SDK-Linux-i686-1.tar.bz2
svn checkout https://dev.wifidog.org/svn/trunk/wifidog
cd wifidog
./autogen.sh
make ipk OPENWRTSDK=~/wifidog.openwrt/OpenWrt-SDK-Linux-i686-1

如果没有错误,你的包应该保存在~/wifidog.openwrt/OpenWrt-SDK-Linux-i686-1/bin/packages

配置
编辑/etc/wifidog.conf并依照说明操作,一切OK。

首次运行Wifidog
按照以下命令启动Wifidog:
Wifidog –f –d 7

测试:
当客户端获取WIFI后,用浏览器打开你喜欢的网页。
监测运行当中的Wifidog的output。

本文章由 http://www.wifidog.pro/2015/04/01/wifidog%E5%AE%89%E8%A3%85-3.html 整理编辑,转载请注明出处