wifidog 源码初分析(1)

因为最近公司内部有个关于路由器的项目使用了该开源项目做Demo,安装配置很简单,但是对运行机制不是太了解,所以抽了点时间初步对 wifidog 的源码进行了分析。
(对于 wifidog 是什么开源项目,以及如何安装配置,就不做解释了,直接 Google 吧)。
另外,wifidog 的核心还是依赖于 iptables 防火墙过滤规则来实现的,所以建议对 iptables 有了了解后再去阅读 wifidog 的源码。
在路由器上启动 wifidog 之后,wifidog 在启动时会初始化一堆的防火墙规则,如下:

/** Initialize the firewall rules
*/
int iptables_fw_init(void)
{
    … …
/*
     *
     * Everything in the NAT table
     *
     */
    /* Create new chains */
    iptables_do_command("-t nat -N " TABLE_WIFIDOG_OUTGOING);
    iptables_do_command("-t nat -N " TABLE_WIFIDOG_WIFI_TO_ROUTER);
    iptables_do_command("-t nat -N " TABLE_WIFIDOG_WIFI_TO_INTERNET);
    iptables_do_command("-t nat -N " TABLE_WIFIDOG_GLOBAL);
    iptables_do_command("-t nat -N " TABLE_WIFIDOG_UNKNOWN);
    iptables_do_command("-t nat -N " TABLE_WIFIDOG_AUTHSERVERS);
    /* Assign links and rules to these new chains */
    iptables_do_command("-t nat -A PREROUTING -i %s -j " TABLE_WIFIDOG_OUTGOING, config->gw_interface);
    iptables_do_command("-t nat -A " TABLE_WIFIDOG_OUTGOING " -d %s -j " TABLE_WIFIDOG_WIFI_TO_ROUTER, config->gw_address);
    iptables_do_command("-t nat -A " TABLE_WIFIDOG_WIFI_TO_ROUTER " -j ACCEPT");
    iptables_do_command("-t nat -A " TABLE_WIFIDOG_OUTGOING " -j " TABLE_WIFIDOG_WIFI_TO_INTERNET);
    iptables_do_command("-t nat -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -m mark --mark 0x%u -j ACCEPT", FW_MARK_KNOWN);
    iptables_do_command("-t nat -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -m mark --mark 0x%u -j ACCEPT", FW_MARK_PROBATION);
    iptables_do_command("-t nat -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -j " TABLE_WIFIDOG_UNKNOWN);
    iptables_do_command("-t nat -A " TABLE_WIFIDOG_UNKNOWN " -j " TABLE_WIFIDOG_AUTHSERVERS);
    iptables_do_command("-t nat -A " TABLE_WIFIDOG_UNKNOWN " -j " TABLE_WIFIDOG_GLOBAL);
    // 将 80 端口的访问重定向(REDIRECT)到 (本路由)网关web服务器的监听端口
    iptables_do_command("-t nat -A " TABLE_WIFIDOG_UNKNOWN " -p tcp --dport 80 -j REDIRECT --to-ports %d", gw_port);
    /*
     *
     * Everything in the FILTER table
     *
     */
    /* Create new chains */
    iptables_do_command("-t filter -N " TABLE_WIFIDOG_WIFI_TO_INTERNET);
    iptables_do_command("-t filter -N " TABLE_WIFIDOG_AUTHSERVERS);
    iptables_do_command("-t filter -N " TABLE_WIFIDOG_LOCKED);
    iptables_do_command("-t filter -N " TABLE_WIFIDOG_GLOBAL);
    iptables_do_command("-t filter -N " TABLE_WIFIDOG_VALIDATE);
    iptables_do_command("-t filter -N " TABLE_WIFIDOG_KNOWN);
    iptables_do_command("-t filter -N " TABLE_WIFIDOG_UNKNOWN);
    /* Assign links and rules to these new chains */
    /* Insert at the beginning */
    iptables_do_command("-t filter -I FORWARD -i %s -j " TABLE_WIFIDOG_WIFI_TO_INTERNET, config->gw_interface);
    iptables_do_command("-t filter -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -m state --state INVALID -j DROP");

    /* TCPMSS rule for PPPoE */
    iptables_do_command("-t filter -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -o %s -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu", ext_interface);
    iptables_do_command("-t filter -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -j " TABLE_WIFIDOG_AUTHSERVERS);
    iptables_fw_set_authservers();
    iptables_do_command("-t filter -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -m mark --mark 0x%u -j " TABLE_WIFIDOG_LOCKED, FW_MARK_LOCKED);
    iptables_load_ruleset("filter", "locked-users", TABLE_WIFIDOG_LOCKED);
    iptables_do_command("-t filter -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -j " TABLE_WIFIDOG_GLOBAL);
    iptables_load_ruleset("filter", "global", TABLE_WIFIDOG_GLOBAL);
    iptables_load_ruleset("nat", "global", TABLE_WIFIDOG_GLOBAL);
    iptables_do_command("-t filter -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -m mark --mark 0x%u -j " TABLE_WIFIDOG_VALIDATE, FW_MARK_PROBATION);
    iptables_load_ruleset("filter", "validating-users", TABLE_WIFIDOG_VALIDATE);
    iptables_do_command("-t filter -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -m mark --mark 0x%u -j " TABLE_WIFIDOG_KNOWN, FW_MARK_KNOWN);
    iptables_load_ruleset("filter", "known-users", TABLE_WIFIDOG_KNOWN);
    iptables_do_command("-t filter -A " TABLE_WIFIDOG_WIFI_TO_INTERNET " -j " TABLE_WIFIDOG_UNKNOWN);
    iptables_load_ruleset("filter", "unknown-users", TABLE_WIFIDOG_UNKNOWN);
    iptables_do_command("-t filter -A " TABLE_WIFIDOG_UNKNOWN " -j REJECT --reject-with icmp-port-unreachable");
    UNLOCK_CONFIG();
    return 1;
}

在该 防火墙规则的初始化过程中,会首先清除掉已有的防火墙规则,重新创建新的过滤链,另外,除了通过 iptables_do_command("-t nat -A "TABLE_WIFIDOG_UNKNOWN " -p tcp --dport 80 -j REDIRECT --to-ports %d",gw_port); 这个命令将 接入设备的 80 端口(HTTP)的访问重定向至网关自身的 HTTP 的端口之外,还通过 iptables_fw_set_authservers(); 函数设置了 鉴权服务器(auth-server) 的防火墙规则:

void iptables_fw_set_authservers(void)
{
    const s_config *config;
    t_auth_serv *auth_server;
    config = config_get_config();
    for (auth_server = config->auth_servers; auth_server != NULL; auth_server = auth_server->next) {
        if (auth_server->last_ip && strcmp(auth_server->last_ip, "0.0.0.0") != 0) {
            iptables_do_command("-t filter -A " TABLE_WIFIDOG_AUTHSERVERS " -d %s -j ACCEPT", auth_server->last_ip);
            iptables_do_command("-t nat -A " TABLE_WIFIDOG_AUTHSERVERS " -d %s -j ACCEPT", auth_server->last_ip);
        }
    }
}

首先从上面的代码可以看出 wifidog 支持多个 鉴权服务器,并且针对每一个鉴权服务器 设置了如下两条规则:

1)在filter表中追加一条[任何访问鉴权服务器都被接受]的WiFiDog_$ID$_AuthServers过滤链:

iptables -t filter -A  WiFiDog_$ID$_AuthServers -d auth-server地址 -j ACCEPT

2)在nat表中追加一条[任何访问鉴权服务器都被接受]的WiFiDog_$ID$_AuthServers过滤链:

iptables -t nat -A WiFiDog_$ID$_AuthServers  -d auth-server地址 -j ACCEPT

这样确保可以访问鉴权服务器,而不是拒绝所有的出口访问。

转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://quietmadman.blog.51cto.com/3269500/1384175

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

WiFidog简介

WIFIdog是一种新的认证方式,这种认证方式的优势在于安全性高,不容易被破解验证。
客户端发出初始化请求,比如访问www.baidu.com
网关的防火墙规则将这个请求重定向到本地网关的端口上。这个端口是Wifidog监听的端口。
Wfidog提供一个HTTP重定向回复,重定向到Web认证页面,重定向的Url的Querystring中包含了Gateway的ID,Gateway的FQDN以及其他的信息。
用户向认证服务器发出认证请求。
网关返回一个(可以是自定义的)splash(也称作“登录”)页面。
用户提供他的凭据信息,比如用户名和密码。
成功认证的话,客户端将会被重定向到网关的自己的web页面上,并且带有一个认证凭据(一个一次性的token)
用户就是用获取到的凭据访问网关。
网关去认证服务器询问token的有效性。
认证服务器确认token的有效性。
网关发送重定向给客户端,以从认证服务器上获取 成功提示页面,重定向到 http://portal_server:port/portal_script 这个位置。
认证服务器通知客户请求成功,可以上网了。
整个过程如下图所示
1.png

本文章由 http://www.wifidog.pro/2015/01/23/wifidog%E7%AE%80%E4%BB%8B-1.html 整理编辑,转载请注明出处

CentOS6.6下的authpuppy源码安装与配置

安装与配置authpuppy:
源码包:

#wget https://launchpad.net/authpuppy/trunk/1.0.0-stable/+download/authpuppy-1.0.0-stable.tgz

#cd /home
tar -xvf authpuppy-1.0.0-stable.tgz

#// apache配置一个虚拟域名(比如http://authpuppy.localhost/)指向目录 /home/authpuppy

打开http://authpuppy.localhost/
按提示完成对依赖包的安装(Requirements下的最好都安装), 如下:
依赖库: // 主要是PHP扩展包

APCu:
http://blog.163.com/liyi8798@126/blog/static/674546582012012115111847/
#wget http://pecl.php.net/get/apcu-4.0.6.tgz
#phpize
#./configure --with-php-config=/usr/local/php/bin/php-config --enable-apcu --enable-apc-bc
#make -s
#make install
#vi /usr/local/php/etc/php.ini
extension=apcu.so
// 其他类似

Permissions下出现红色部分,则需要做下面操作:

#chmod a+w authpuppy/ -R
#//自动创建authpuppy.yml

// 必须需要启用pdo_mysql,因为symfony的用的是PDO, 灵感来自http://bbs.csdn.net/topics/390036982
#cd php-5.6.2/ext/pdo_mysql
#phpize
#./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql/
#make -s
#make install

#mysqladmin -uroot -p create authpuppy
#mysql -uroot -p

#create user 'authpuppy'@'localhost' identified by 'authpuppydev';
#grant all privileges on authpuppy.* to 'authpuppy'@'localhost' with grant option;

// 按界面来走就好了。

问题卡在连接不上mysql服务器上了两天,解决办法:
步骤1, 在http://authpuppy.localhost/install/3中点击next会有提示,如下:
Impossible to connect to the database with those credentials. Please make sure the database exists and try again.
此时,从/home/authpuppy目录中找到php的源码,如下:

#grep "Impossible to connect to the database" * -R
apps/frontend/modules/install/actions/actions.class.php: $this->getUser()->setFlash('error', "Impossible to connect to the database with those credentials. Please make sure the database exists and try again.", false);

打开上面文件,找到相应的行,将Exception $e打印出来

#vi apps/frontend/modules/install/actions/actions.class.php
// $this->getUser()->setFlash('error', "Impossible to connect to the database with those credentials. Please make sure the database exists and try again.", false);
$this->getUser()->setFlash('error', $e, false);

再在http://authpuppy.localhost/install/3中点击next, 出现提示:

exception 'Doctrine_Connection_Exception' with message 'Couldn't locate driver named mysql' in /home/www/authpuppy/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php:486 Stack trace: #0 
/home/www/authpuppy/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/Mysql.php(101): Doctrine_Connection->connect() #1 
/home/www/authpuppy/lib/form/apDatabaseInstallForm.php(133): Doctrine_Connection_Mysql->connect() #2
/home/www/authpuppy/apps/frontend/modules/install/actions/actions.class.php(173): apDatabaseInstallForm->save() #3
/home/www/authpuppy/apps/frontend/modules/install/actions/actions.class.php(71): installActions->executePage3(Object(sfWebRequest)) #4
/home/www/authpuppy/cache/frontend/prod/config/config_core_compile.yml.php(459): installActions->executeIndex(Object(sfWebRequest)) #5
/home/www/authpuppy/lib/model/authpuppycore/util/apActions.class.php(56): sfActions->execute(Object(sfWebRequest)) #6 
/home/www/authpuppy/cache/frontend/prod/config/config_core_compile.yml.php(945): apActions->execute(Object(sfWebRequest)) #7 
/home/www/authpuppy/cache/frontend/prod/config/config_core_compile.yml.php(940): sfExecutionFilter->executeAction(Object(installActions)) #8 
/home/www/authpuppy/cache/frontend/prod/config/config_core_compile.yml.php(926): sfExecutionFilter->handleAction(Object(sfFilterChain), Object(installActions)) #9 
/home/www/authpuppy/cache/frontend/prod/config/config_core_compile.yml.php(1021): sfExecutionFilter->execute(Object(sfFilterChain)) #10 
/home/www/authpuppy/apps/frontend/lib/CheckDBAvailabilityFilter.class.php(95): sfFilterChain->execute() #11 
/home/www/authpuppy/cache/frontend/prod/config/config_core_compile.yml.php(1021): CheckDBAvailabilityFilter->execute(Object(sfFilterChain)) #12 
/home/www/authpuppy/cache/frontend/prod/config/config_core_compile.yml.php(988): sfFilterChain->execute() #13 /home/www/authpuppy/cache/frontend/prod/config/config_core_compile.yml.php(1021): sfRenderingFilter->execute(Object(sfFilterChain)) #14 
/home/www/authpuppy/cache/frontend/prod/config/config_core_compile.yml.php(658): sfFilterChain->execute() #15 
/home/www/authpuppy/cache/frontend/prod/config/config_core_compile.yml.php(2340): sfController->forward('install', 'index') #16 
/home/www/authpuppy/lib/vendor/symfony/lib/util/sfContext.class.php(170): sfFrontWebController->dispatch() #17 
/home/www/authpuppy/web/index.php(15): sfContext->dispatch() #18 {main}

步骤2, 从第一句“'Doctrine_Connection_Exception' with message 'Couldn't locate driver named mysql'”中可以看出,肯定是没有相关连接mysql的驱动,于是网上查找
www.baidu.com 查找“'Doctrine_Connection_Exception' with message 'Couldn't locate driver named mysql'”
有一个类似的问题,点击链接http://bbs.csdn.net/topics/390036982
其中一行是:
dream1206回复于: 2012-05-06 00:50:17
你需要启用pdo_mysql
windows下去掉 pdo_mysql.dll前面的注释,重启服务器。linux下编译时加上 with-pdo-mysql。
如果你已经这么做了,那么看看phpinfo()中的配置是否有生效
步骤3, 果断安装pdo_mysql
// 必须需要启用pdo_mysql,因为symfony的用的是PDO, 灵感来自http://bbs.csdn.net/topics/390036982

cd php-5.6.2/ext/pdo_mysql
phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql/
make -s
make install

本文章由 http://www.wifidog.pro/2015/01/22/centos-authpuppy.html 整理编辑,转载请注明出处

搭建无线钓鱼 2/2:authpuppy搭建web认证系统

这里2个文件都需要替换 我也不知道为啥
然后修改 /etc/hosts 文件 添加 127.0.0.1 authpuppy.localhost
1.png

然后给 权限:这个目录权限 /var/www/authpuppy
命令:
sudo chmod 777 /var/www/authpuppy
还要给
这个2个文件权限
2.png

然后 配置 msql

命令:
mysqladmin -uroot -p create authpuppy
Enter password: #你的密码
mysql -uroot -p
Enter password:你设置的root密码
create user 'authpuppy'@'localhost' identified by 'authpuppydev';
创建数据库
grant all privileges on authpuppy.* to 'authpuppy'@'localhost' with grant option;
就这样 环境配置完成
3.png

这里需要全部ok 如果你是架站高手的话这些应该都难不到你吧
然后进入你ip
安装

下一步即可
然后配置插件

以管理员帐号登录。
登录后可见菜单如图:
4.png

就可以做一些基本的Authpuppy配置了,虽然配置顺序没有要求,建议先配置Manage plugins
配置了4个插件,
apAuthLocalUserPlugin的配置

配置后 save。主要和密码认证user相关,配置此插件后才能增加、删除、修改用户。

apAuthSplashOnlyPlugin 插件的主要应用场景是,当你想不认证又保留protalpage时,配置这个插件,并且配置插件apNodeCustomPlugin
勾选上面两项即可。
apExternalCMSPlugin的配置如图:

次此插件的主要配置是,认证后的跳转。

配置manage nodes news创建一个nodes

主要配置要点为 gwid 此处的gwid 必须和路由器端的gwid一致。

User 主要功能是管理管理员帐号。

Server Configure 配置如图:
配置关键是 main url就是认证服务器的地址 如:http://192.168.100.121/authpuppy/web
其他几个看需要选择。

Manage local users 主要管理WiFi的认证账号。 增加、删除、修改等操作。

至此完成Authpuppy的安装及基本配置。

Authpuppy登录方式

authpuppy根据基本配置可以有两种登录方式可选,一种无密码认证,一种有密码认证。这两种登录方式均可以通过配置插件的方式来开关。

无密码认证登录:
登录过程:用户选择无密码登陆方式后、点击登陆,页面跳转到配置的页面,登录成功。
有密码认证登录:
登录过程:用户选择密码登陆方式、输入用户名及密码点击登陆,页面跳转到配置的页面,登录成功。有密码认证登录方式,一个账号只限一个用户在线。

本文章由http://www.wifidog.pro/2015/01/22/authpuppy.html 整理编辑,转载请注明出处