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基本功能实现过程已经完毕,后面再补充其他功能详解。

WIFIDOG 源码解析相关推荐

  1. linux WiFi源码解析,WIFIDOG 源码解析

    WIFIDOG 源码解析 openwrt wifidog是我linux c语言编程的启蒙项目,一年前折腾此项目大半年,从此爱上了linux 系统编程.现在看来,这是一个再简单不过的linux c语言项 ...

  2. wifidog 源码初分析

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

  3. 谷歌BERT预训练源码解析(二):模型构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...

  4. 谷歌BERT预训练源码解析(三):训练过程

    目录 前言 源码解析 主函数 自定义模型 遮蔽词预测 下一句预测 规范化数据集 前言 本部分介绍BERT训练过程,BERT模型训练过程是在自己的TPU上进行的,这部分我没做过研究所以不做深入探讨.BE ...

  5. 谷歌BERT预训练源码解析(一):训练数据生成

    目录 预训练源码结构简介 输入输出 源码解析 参数 主函数 创建训练实例 下一句预测&实例生成 随机遮蔽 输出 结果一览 预训练源码结构简介 关于BERT,简单来说,它是一个基于Transfo ...

  6. Gin源码解析和例子——中间件(middleware)

    在<Gin源码解析和例子--路由>一文中,我们已经初识中间件.本文将继续探讨这个技术.(转载请指明出于breaksoftware的csdn博客) Gin的中间件,本质是一个匿名回调函数.这 ...

  7. Colly源码解析——结合例子分析底层实现

    通过<Colly源码解析--框架>分析,我们可以知道Colly执行的主要流程.本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现.(转载请指明出于break ...

  8. libev源码解析——定时器监视器和组织形式

    我们先看下定时器监视器的数据结构.(转载请指明出于breaksoftware的csdn博客) /* invoked after a specific time, repeatable (based o ...

  9. libev源码解析——定时器原理

    本文将回答<libev源码解析--I/O模型>中抛出的两个问题.(转载请指明出于breaksoftware的csdn博客) 对于问题1:为什么backend_poll函数需要指定超时?我们 ...

最新文章

  1. 机器学习近年来之怪现象
  2. git push error. ! [rejected] master - master (non-fast-forward)
  3. 没有连接上aspnetdb.mdf数据库
  4. Python之字典类型数据常见操作及排序
  5. 一个小型数据库的核心组件
  6. 基于FPGA的ADC和DAC设计
  7. java: 错误: 不支持发行版本 5
  8. WebClient 上传文件
  9. 命令行重启Oracle数据库
  10. 1078. 字符串压缩与解压 (20)-PAT乙级真题
  11. 综述|重邮高新波等最新《少样本目标检测算法》
  12. phpstorm 常用快捷键及自定义快捷键
  13. 专利申请模板,包含实用新型专利和发明专利模板
  14. CAD查找属性快文字
  15. 理论上讲,股市暴跌是不是要清仓?为什么?
  16. win8dnf计算机内存不足,Win8电脑内存不足解决方法介绍
  17. ip route常用语法
  18. 目标检测—RCNN系列
  19. oracle智能纠错,《Oracle DBA手记》一书勘误表
  20. 揭秘!最快大数乘法运算

热门文章

  1. B2B电商交易系统:如何帮助智能照明企业实现精细化运营管理
  2. pytorch环境配置 一键官网配置+离线配置(anaconda+duda+cudnn+pytorch)
  3. 腾讯领投,小鱼易连完成C轮融资
  4. 为了流量,何同学做了个“假B站”?
  5. 对角矩阵np.diag()
  6. 【linux 绑核】CPU 绑核
  7. 数据结构java稀疏矩阵_数据结构之十字链表——稀疏矩阵的链式存储及加法运算...
  8. 不卸载升级cmake
  9. Dumping all threads without appropriate locks held: thread list lock mutator lock报错原因?
  10. gbq可以算出土建量吗_广联达土建算量软件问题合集100条(上)