佐须之男 发布的文章

为wifidog认证跳转url添加客户端ip地址和MAC地址

默认的的wifidog认证页面跳转url是这样的
login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s
Example: https://auth.ilesansfil.org/login/?gw_id=0016B6DA9AE0&gw_address=7.0.0.1&gw_port=2060
由于业务需要,需要在跳转到认证页面时加一个客户端内网IP地址,即ClienIPAddress

下载wifidog添代码,打开http.c,找到

/* Re-direct them to auth server */
char *urlFragment;
safe_asprintf(&urlFragment, "%sgw_address=%s&gw_port=%d&gw_id=%s&url=%s",
    auth_server->authserv_login_script_path_fragment,
    config->gw_address,
    config->gw_port,
    config->gw_id,
    url);
debug(LOG_INFO, "Captured %s requesting [%s] and re-directing them to login page", r->clientAddr, url);
http_send_redirect_to_auth(r, urlFragment, "Redirect to login page");
free(urlFragment);

修改为

/* Re-direct them to auth server */
char *urlFragment;
char *mac = arp_get(r->clientAddr);
if(!mac)
{
     printf("mac cannot get\n");
     return;
}
safe_asprintf(&urlFragment, "%sgw_address=%s&gw_port=%d&gw_id=%s&url=%s&clientip=%s&clientmac=%s",
    auth_server->authserv_login_script_path_fragment,
    config->gw_address,
    config->gw_port,
    config->gw_id,
    url,
    r->clientAddr,
    mac);
debug(LOG_INFO, "Captured %s requesting [%s] and re-directing them to login page", r->clientAddr, url);
http_send_redirect_to_auth(r, urlFragment, "Redirect to login page");
free(urlFragment);

重新编译以后就OK了

现在认证跳转url就带有客户端ip地址了
http://authServer/login/?gw_address=10.0.0.254&gw_port=2060&gw_id=79194CFB58&url=http%3A//www.baidu.com&clientAddr=10.0.0.100&clientmac=00:23:43:a3:b1:d5

本文章由 http://www.wifidog.pro/2014/12/10/wifidog-login%E5%8D%8F%E8%AE%AE%E6%B7%BB%E5%8A%A0%E5%AE%A2%E6%88%B7%E7%AB%AFIP-MAC.html 整理编辑,转载请注明出处

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 整理编辑,转载请注明出处