分类 源码分析 下的文章

wifidog 报错iptables failed

报错如下:
(fw_iptables.c:116) iptables command failed(1): iptables -t mangle -F WiFiDog_br-lan_Trusted
(fw_iptables.c:116) iptables command failed(1): iptables -t mangle -F WiFiDog_br-lan_Outgoing
(fw_iptables.c:116) iptables command failed(1): iptables -t mangle -F WiFiDog_br-lan_Incoming

这是在wifidog 刚启动时,firewall 规则重置出现的log,在函数fw_destroy 里出现,因为这时WiFiDog_br-lan_Trusted,WiFiDog_br-lan_Outgoing,WiFiDog_br-lan_Incoming规则链还没有建立,所以iptables 清空(-F)失败,这段错误并不会影响wifidog正常执行,所以不用特别在意这段错误。

本文章由 http://www.wifidog.pro/2015/03/04/wifidog-iptables%E6%8A%A5%E9%94%99.html 整理编辑,转载请注明出处

wifidog在防火墙中的流程

1,iptables 的四链五表,这里就不多说了,自己可以参看相关资料。

2,wifidog在四链中的工作流程:

数据包---->mangle--->进入路由表前/
1)--->白名单MARK 01
2)--->认证的MAC,MARK 02
3)---->非认证不MARK ------>

-->nat--->进入路由表前-->
1)--目的IP是本地----放行
2)--目的IP非本地-----mark 02,mark 01--->放行
3)---无mark-->目的认证服务器--->放行
-->目的白名单--->放行
-->重定向80到2060

Filter----->非本地----
1)--->目的认证服务器--->放行
2)--->mark 254(黑名单)--->拦截
3)--->mark 01 02 ---->放行
4)--->非mark ---->只认过53 67 443端口

本文章由 http://www.wifidog.pro/2015/03/04/wifidog-%E9%98%B2%E7%81%AB%E5%A2%99%E6%B5%81%E7%A8%8B.html 整理编辑,转载请注明出处

wifidog安装及简单的配置

前言

最近在做关于路由器认证相关的工作,由于需求,认证的过程同往常的网页认证有稍许不同,因此,自己开始尝试编写wifidog的认证服务器,查阅了中外的一些资料,现将经验总结一下。

Wifidog的原理

下图是在Wifidog的wiki网站上截取的wifidog认证流程图,网址为点击打开链接。
wifidog-flow-2009.png

wifidog由两部分组成,一个是运行在路由器上的程序,另一部分是运行在认证服务器上的程序。
wifidog的认证流程大致是:
1.首先,用户的终端可以连接上wifi,然后发起访问网站的请求,如www.baidu.com;
2.网关根据防火墙规则,将用户的请求重定向到本地端口(wifidog的监听端口);
3.网关将用户的访问重定向到认证服务器上的认证页面;
4.认证服务器返回登录页面至用户;
5.用户再向认证服务器提供凭据,如用户名和密码;
6.认证服务器根据用户提供的凭据来确定用户是否符合要求,是否可以上网;
7.如果符合要求,认证服务器将用户的访问重定向至路由器的网关并携带标识token;
8.网关向认证服务器确认用户信息;
9.如果符合要求,服务器向用户返回登录成功页面;
10.用户就可以上网了。

WifiDog在openwrt上的安装和配置

Wifidog的配置如下所示:

GatewayID default  
GatewayInterface br-lan  
GatewayAddress 192.168.1.1  
ExternalInterface br-lan  
AuthServer{
    Hostname justyoung.com(也可以是域名)
    SSLAvailable no
    HTTPPort 8080(默认是80)
    Path /wifidog/(文件名的两边都要加‘/’号,除非是根目录,只要一个‘/’)
    LoginScriptPathFragment login.php/? (这里把第一次登陆时重定向的位置也修改了,加了一个后缀,默认是login/?,)<pre class="plain" name="code">
    PingScriptPathFragment ping.php/?
    PortalScriptPathFragment portal.html?
    AuthScriptPathFragment auth.php/?
}可以有多个AuthServer,Wifidog会从第一个往后找,直到找到可用的认证服务器为止。

这段代码首先根据mac地址来判断登录用户是否合法,如果合法则直接重定向至192.168.1.1:2060/wifidog/auth?token=XXX,如果是不合法,则重定向至欢迎页面,引导用户获得认证。

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

wifidog报错: Auth server did NOT say pong!

在wifidog启动过程中,我们可能会经常看到这种log:
Auth server did NOT say pong!

这个debug信息是再告诉我们,wifidog的ping协议没有收到来自auth server 的pong 回应。
首先解释下什么是ping协议。这种协议是路由器用来告诉auth server 路由器当前的状态,协议格式:
http://auth_server/ping/?gw_id=xxx&sys_uptime=xxx&sys_memfree&sys_load=xxx&wifidog_uptime=xxx
gw_id是路由器的标识符,sys_uptime是路由器启动时间,sys_memfree是路由器的内存剩余,sys_load是系统负载,wifidog_uptime是wifidog启动时间,路由器将这些信息发送给auth server,server 回"Pong" 来表示server知道这台路由器还在工作。

下面是出现上述log的代码:

do {   
        FD_ZERO(&readfds);   
        FD_SET(sockfd, &readfds);   
        timeout.tv_sec = 30; /* XXX magic... 30 second */   
        timeout.tv_usec = 0;   
        nfds = sockfd + 1;   

        nfds = select(nfds, &readfds, NULL, NULL, &timeout);   

        if (nfds > 0) {   
            /** We don't have to use FD_ISSET() because there  
             *  was only one fd. */   
            numbytes = read(sockfd, request + totalbytes, MAX_BUF - (totalbytes + 1));   
            if (numbytes < 0) {   
                debug(LOG_ERR, "An error occurred while reading from auth server: %s", strerror(errno));   
                /* FIXME */   
                close(sockfd);   
                return;   
            }   
            else if (numbytes == 0) {   
                done = 1;   
            }   
            else {   
                totalbytes += numbytes;   
                debug(LOG_DEBUG, "Read %d bytes, total now %d", numbytes, totalbytes);   
            }   
        }
else if (nfds == 0) {   
            debug(LOG_ERR, "Timed out reading data via select() from auth server");   
            /* FIXME */   
            close(sockfd);   
            return;   
        }   
        else if (nfds < 0) {   
            debug(LOG_ERR, "Error reading data via select() from auth server: %s", strerror(errno));   
            /* FIXME */   
            close(sockfd);   
            return;   
        }   
    } while (!done);   
    close(sockfd);   

    debug(LOG_DEBUG, "Done reading reply, total %d bytes", totalbytes);   

    request[totalbytes] = '\0';   

    debug(LOG_DEBUG, "HTTP Response from Server: [%s]", request);   

    if (strstr(request, "Pong") == 0) {   
        debug(LOG_WARNING, "Auth server did NOT say pong!");   
        /* FIXME */   
    }   
    else {   
        debug(LOG_DEBUG, "Auth Server Says: Pong");   
    }

这段log 出现在wifidog 在接收server 的响应包里没有出现Pong字符串。

本文章由 http://www.wifidog.pro/2015/02/25/wifidog%E7%9A%84ping%E5%8D%8F%E8%AE%AE.html 整理编辑,转载请注明出处