WIFIDOG 源码解析

WIFIDOG 源码解析

openwrt wifidog是我linux c语言编程的启蒙项目,一年前折腾此项目大半年,从此爱上了linux 系统编程。现在看来,这是一个再简单不过的linux c语言项目了。在此以wifidog官方源码作为实例分析,不过实际推荐用apfree_wifidog,使用epoll、libevent等新技术,并且是国人在维护的项目。

概述

wifidog 认证主要通过iptables命令实现网络规则制定,端口跳转认证,为此一定要先熟悉iptables命令原理(扩展参考tc/netfilter/libpcap等知识)。了解iptables基础知识后再查看官方的流程图(实在太陈旧):

    wifidog_wiki_help.png Download (11.1 KB) - added by Frederic Sheedy <sheedf@…> 9 years ago. "I have questions or I need help icon"
    wifidog_wiki_contribute.png Download (11.3 KB) - added by Frederic Sheedy <sheedf@…> 9 years ago. "I want to contribute to Wifidog icon"

src/fw_iptables.c核心代码片段:

  • 实现80端口强制转发到gw_port,即默认值2060:
    iptables_do_command("-t nat -A " CHAIN_UNKNOWN " -p tcp --dport 80 -j REDIRECT --to-ports %d", gw_port);
  • 2060端口服务认证成功后,通过以下命令放行客户端(ip/mac)上网:
    case FW_ACCESS_ALLOW:
        iptables_do_command("-t mangle -A " CHAIN_OUTGOING " -s %s -m mac --mac-source %s -j MARK --set-mark %d", ip,
                            mac, tag);
        rc = iptables_do_command("-t mangle -A " CHAIN_INCOMING " -d %s -j ACCEPT", ip);
        break;

2060端口监听服务程序,为libhttpd文件夹下的文件,将编译成libhttpd.so库,提供API文件libhttpd/httpd.h。这是一个非常简单的http协议解析 server。
src/gateway.cmain函数初始化时,调用此server如下:

    httpdAddCContent(webserver, "/", "wifidog", 0, NULL, http_callback_wifidog);
    httpdAddCContent(webserver, "/wifidog", "", 0, NULL, http_callback_wifidog);
    httpdAddCContent(webserver, "/wifidog", "about", 0, NULL, http_callback_about);
    httpdAddCContent(webserver, "/wifidog", "status", 0, NULL, http_callback_status);
    httpdAddCContent(webserver, "/wifidog", "auth", 0, NULL, http_callback_auth);
    httpdAddCContent(webserver, "/wifidog", "disconnect", 0, NULL, http_callback_disconnect);

    httpdSetErrorFunction(webserver, 404, http_callback_404);

回调函数都定义在src/http.c中。

  • http_callback_404 函数。没有认证的客户端,一旦有80端口数据出去,2060转发后,都将被劫持到此处理,如果访问的是一些GLOBAL表中的服务器,则放行。
for (rule = get_ruleset("global"); rule != NULL; rule = rule->next) {
...
fw_allow_host(r->request.host);
...
}
  • http_callback_auth 函数,就是处理认证的函数,处理过程中将访问服务器是否放行,具体在文件src/auth.c中:
    auth_server_request(&auth_response, REQUEST_TYPE_LOGIN, client->ip, client->mac, token, 0, 0, 0, 0);

wifidog一旦接收到认证服务器回复AUTH_ALLOWED ,就是简单回复几个字符串Auth: 1,则立即执行上述的iptables命令放行。

  • src/centralserver.c文件:
    if ((tmp = strstr(res, "Auth: "))) {
        if (sscanf(tmp, "Auth: %d", (int *)&authresponse->authcode) == 1) {
            debug(LOG_INFO, "Auth server returned authentication code %d", authresponse->authcode);
            free(res);
            return (authresponse->authcode);
        } else {
            debug(LOG_WARNING, "Auth server did not return expected authentication code");
            free(res);
            return (AUTH_ERROR);
        }
    }

至此,wifidog基本功能实现过程已经完毕,后面再补充其他功能详解。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、因手头有一个7620N芯片的大功率无线路由器(万兴达WR5508商用路由),由于要使用无线广告营销功能,但在网上搜寻了很久,都没找到合适的固件。 2、可能有人会说支持7620方案的广告营销固件多的是,但这款路由器是大功率的,500mW,刷了海蜘蛛、RippleOS以及其他有wifidog功能的固件,无线超过3-5米就没有信号了。只有刷了openwrt和PandoraBox固件,无线信号超级强大,达到26db。 3、因此,只能使用openwrt和PandoraBox固件,查询了多种方法,都是需要对固件进行编译的,由于小弟不懂编程,只有通过网友们的安装配置经验进行参考,在刷好的固件基础上安装wifidog和Luci界面的配置,如果哪位高手能将Luci-wifidog源码打包成ipk安装包,小弟万分感谢!此方法仅供想玩wifidog的朋友参考,编程高手勿拍砖就行了! 方法: 1、安装wifidog(前提是路由器必须接入互联网) [root@PandoraBox:/root]#opkg update [root@PandoraBox:/root]#opkg install wifidog [root@PandoraBox:/root]#/etc/init.d/wifidog enable [root@PandoraBox:/root]#/etc/init.d/wifidog start 备注:安装wifidog可能需要依赖包 libc iptables-mod-extra iptables-mod-ipopt iptables-mod-nat-extra libpthread 2、安装配置luci-wifidog(luci-wifidog源码是在网上找的,别人已经设置好了的,如果不喜欢,自行到官网下) (1)使用winscp把源码controller文件夹下的内容复制到/usr/lib/lua/luci里目录的controller下,model放到model下 (2)源码root文件夹下的内容复制到root/etc下各自相应的目录下 (3)源码ipkg文件夹下的内容复制到/usr/lib/opkg目录下 (4)源码makefile文件复制到/etc下并给xxx权限 (5)最后重启路由器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值