2015年4月

wifidog配置分析

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

wifidog流程参照http://dev.wifidog.org/wiki/doc/developer/FlowDiagram描述,这里介绍下配置内容。

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缺少问号访问错误的脚本。

本文章由 http://www.wifidog.pro/2015/04/03/wifidog%E9%85%8D%E7%BD%AE%E5%88%86%E6%9E%90-1.html 整理编辑,转载请注明出处

wifidog认证实现路由器插入广告

现在有很多免费的wifi 访问网页的时候底部会出现一些广告,以下为的实现过程:

1.在路由器上抓http的TCP/IP包,解压,对比,并重新算校验码,打包,并转发

如果没有很深入对的TCP/IP的了解,肯定做不了

2.使用现场的一些带过滤的代理软件(其实也是实现以上过程,但已封装好接口,不需要你在去了解TCP/IP的高深知识)

 在IPTABLE上转做好端口转发,比如把80转发到此代理的上,如8080

以下为第2种实现,基于openwrt(目前国内绝大部分广告路由的实现方式,没高大上的代码,但方式消耗更多的资源,不建议使用)

安装

http://www.privoxy.org/user-manual/actions-file.html#ADD-HEADER

修改配置文件

confdir /etc/privoxy
logdir /var/log
filterfile default.filter
filterfile user.filter
#logfile privoxy
actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on.
actionsfile default.action   # Main actions file
actionsfile user.action      # User customizations
listen-address  10.1.1.1:8118 #你的路由地址,代理服务器地址
toggle  1
enable-remote-toggle  1
enable-remote-http-toggle  0
enable-edit-actions 1
enforce-blocks 0
buffer-limit 4096
forwarded-connect-retries  0
accept-intercepted-requests 1
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 300
socket-timeout 300
permit-access  10.1.1.0/24
debug   1    # show each GET/POST/CONNECT request
debug   4096 # Startup banner and warnings
debug   8192 # Errors - *we highly recommended enabling this*
#admin-address privoxy-admin@example.com
#proxy-info-url http://www.example.com/proxy-service.html

在user.filter 中添加规则

FILTER: block-weeds  
s|</head>|<script type="text/javascript" src="http://www.yourdomainname.com/ystest/js/hupu.js"></script>$0|

把用户规则加入到服务 user.action

{+filter{block-weeds}}
.*

把访问80的转向到你的本地代理服务器,如果你弄有wifidog时候,将要一些判断

iptables -t nat -A PREROUTING -s 0.0.0.0/0.0.0.0 -p tcp --dport 80 -j REDIRECT --to-ports 8118

如果一些普通的商家路由,此方法没任何问题,自己写个C小程序管理下配置等.

增加百度推广 user.action (哎,有钱大家赚....) 其他首页推广类似实现.

{+redirect{?tn=baiduerr}}
www.baidu.com/$
{+redirect{s@tn=\w+@tn=baiduerr@}}
www.baidu.com/s\?

配置注释:

##config
#配置在线手册
user-manual ./doc/user-manual/
#不信任的网页
trust-info-url  http://www.example.com/why_we_block.html
#出错时候管理员的邮箱
admin-address privoxy-admin@example.com
#不可访问时候的地址
proxy-info-url http://www.example.com/proxy-service.html
#配置目录
confdir .
#日志目录
logdir .
#模板目录
templdir .
#所有动作
actionsfile match-all.action
#基于网址过滤(系统带,过滤广告地址)
actionsfile default.action
#基于网址过滤(自定义)
actionsfile user.action
#基于内容过滤(系统带,去除一些网站广告内容)
filterfile default.filter
#基于内容过滤(自定义) 
filterfile user.filter
#日志文件
logfile privoxy.log
#日志等级
debug 1
#监听的地址
listen-address 127.0.0.1:8118
#启用内容切换
toggle 1
#是否可以网页上开启内容切换
enable-remote-toggle 0
#内容切换后是否使用特殊的HTTP头
enable-remote-http-toggle 0
#是否可以在网页上编辑网络行为
enable-edit-actions 0
#被禁止的页面是否可以被用户解封
enforce-blocks 0
#缓存大小
buffer-limit 4096
#代理验证
enable-proxy-authentication-forwarding 0
forwarded-connect-retries 0
#
accept-intercepted-requests 1
allow-cgi-request-crunching 0
split-large-forms 0
#活动链接超时
keep-alive-timeout 5
#流水线送达,访问页面不正常禁用
tolerate-pipelining 1
#SOCKET 超时
socket-timeout 300

本文章由http://www.wifidog.pro/2015/04/03/wifidog%E8%AE%A4%E8%AF%81%E5%AE%9E%E7%8E%B0%E5%B9%BF%E5%91%8A%E6%8F%92%E5%85%A5.html 整理编辑,转载请注明出处

wifidog认证服务器家用环境下部署(java版)

本文所讲的是基于一个java版wifidog认证服务器的开源项目,在windows环境下搭建wifidog认证服务器配合固件实现用户名密码的认证。

大致步骤如下:

一,准备

  1.搭建硬件及网络环境

    a.需要普通路由器1个,刷了带wifidog固件的路由器一个,Windows电脑一台,网线若干,宽带网络。

    b.按照一定的拓扑结构进行搭建:普通路由器连接Internet,wifidog路由器连接到普通路由器LAN,PC接到wifidog路由器LAN

 2.获取软件及工具并安装

    a.获取并安装jdk6

    b.获取并安装MySQL

    c.安装MyEclipse

    d.获取java版wifidog认证服务器源码(https://github.com/C-hill/java4wifidog_server)

二,部署与调试

  3.部署

  因为MyEclipse自带了Tomcat插件,所以直接用MyEclipse的Tomcat插件进行部署。

    a.打开MyEclipse,导入源码,部署到Tomcat

    b.配置Tomcat中server.xml文件(该步骤主要是为了实现wifidog的接口标准)

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> 
    <Context path="" docBase="部署路径(绝对路径或appBase的相对路径)" debug="0" reloadable="true"/> 
</Host>

    c.创建数据库并执行wifidog.sql脚本,配置db.properties文件。

4.调试

    a.在浏览器中输入“localhost:8080”,出现页面,则服务器部署成功

   b.路由器设置

      通过cmd查看电脑的ip地址。

      输入192.168.0.1进入路由器管理界面进行配置。

      配置认证服务器url为:电脑ip。

      配置服务器端口为:8080。

      开启wifidog。

    c.验证wifidog是否有效

      在浏览器打开任意网址,正常情况下都会跳转到认证登录页面

这里已经实现了用户名密码认证,接下来可以通过测试接口添加用户名密码,然后输入用户名密码即可上网。具体步骤如下:

     打开localhost:8080进入测试接口首页,进入user接口后,如下图可以看到增加用户的接口,需要参数“device_token”,该参数对应的是表“ap”中的字段“dev_md5”,所以可以到数据库中获取对应的“dev_md5”然后填入,参数“username”,“password”自行定义即可。

      添加完用户名密码后,即可通过在认证页面输入该用户名密码实现认证上网。

本文章由 http://www.wifidog.pro/2015/04/03/wifidog%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2.html 整理编辑,转载请注明出处

wifidog源码wifidog分析用户连接

用户连接启动线程(void thread_httpd(void * args))

此段代码是当有新用户(未认证的用户)连接时创建的线程,其主要功能为

获取用户浏览器发送过来的http报头
分析http报头,分析是否包含关键路径
不包含关键路径则调用404回调函数
包含关键路径则执行关键路径回调函数(这里主要讲解"/wifidog/auth"路径)

void
thread_httpd(void *args)
{
    void **params;
    httpd *webserver;
    request *r;

    params = (void **)args;
    webserver = *params;
    r = *(params + 1);
    free(params);

    /* 获取http报文 */
    if (httpdReadRequest(webserver, r) == 0) {
        debug(LOG_DEBUG, "Processing request from %s", r->clientAddr);
        debug(LOG_DEBUG, "Calling httpdProcessRequest() for %s", r->clientAddr);
        /* 分析http报文 */
        httpdProcessRequest(webserver, r);
        debug(LOG_DEBUG, "Returned from httpdProcessRequest() for %s", r->clientAddr);
    }
    else {
        debug(LOG_DEBUG, "No valid request received from %s", r->clientAddr);
    }
    debug(LOG_DEBUG, "Closing connection with %s", r->clientAddr);
    httpdEndRequest(r);
}



/* 被thread_httpd调用 */
void httpdProcessRequest(httpd *server, request *r)
{
    char dirName[HTTP_MAX_URL],
        entryName[HTTP_MAX_URL],
        *cp;
    httpDir *dir;
    httpContent *entry;

    r->response.responseLength = 0;
    strncpy(dirName, httpdRequestPath(r), HTTP_MAX_URL);
    dirName[HTTP_MAX_URL-1]=0;
    cp = rindex(dirName, '/');
    if (cp == NULL)
    {
        printf("Invalid request path '%s'\n",dirName);
        return;
    }
    strncpy(entryName, cp + 1, HTTP_MAX_URL);
    entryName[HTTP_MAX_URL-1]=0;
    if (cp != dirName)
        *cp = 0;
    else
        *(cp+1) = 0;

     /* 获取http报文中的关键路径,在main_loop中已经设置 */
    dir = _httpd_findContentDir(server, dirName, HTTP_FALSE);
    if (dir == NULL)
    {
        /* http报文中未包含关键路径,执行404回调函数(在404回调函数中新用户被重定向到认证服务器) */
        _httpd_send404(server, r);
        _httpd_writeAccessLog(server, r);
        return;
    }
    /* 获取关键路径内容描述符 */
    entry = _httpd_findContentEntry(r, dir, entryName);
    if (entry == NULL)
    {
        _httpd_send404(server, r);
        _httpd_writeAccessLog(server, r);
        return;
    }
    if (entry->preload)
    {
        if ((entry->preload)(server) < 0)
        {
            _httpd_writeAccessLog(server, r);
            return;
        }
    }
    switch(entry->type)
    {
        case HTTP_C_FUNCT:
        case HTTP_C_WILDCARD:
            /* 如果是被认证服务器重定向到网关的用户,此处的关键路径为"/wifidog/auth",并执行回调函数 */
            (entry->function)(server, r);
            break;

        case HTTP_STATIC:
            _httpd_sendStatic(server, r, entry->data);
            break;

        case HTTP_FILE:
            _httpd_sendFile(server, r, entry->path);
            break;

        case HTTP_WILDCARD:
            if (_httpd_sendDirectoryEntry(server, r, entry,
                        entryName)<0)
            {
                _httpd_send404(server, r);
            }
            break;
    }
    _httpd_writeAccessLog(server, r);
}

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