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 9 years ago. "I have questions or I need help icon"

wifidog_wiki_contribute.png Download (11.3 KB) - added by Frederic Sheedy 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基本功能实现过程已经完毕,后面再补充其他功能详解。

linux WiFi源码解析,WIFIDOG 源码解析相关推荐

  1. cups源码下载 linux_正点原子Linux第七十章Linux WIFI驱动实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第七十章Linux WIFI驱动实验 WIFI的使用已经 ...

  2. WIFIDOG 源码解析

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

  3. linux epoll 开发指南-【ffrpc源码解析】

    linux epoll 开发指南-[ffrpc源码解析] 摘要 关于epoll的问题很早就像写文章讲讲自己的看法,但是由于ffrpc一直没有完工,所以也就拖下来了.Epoll主要在服务器编程中使用,本 ...

  4. linux源码文件名,Linux中文件名解析处理源码分析

    Linux中文件名解析处理源码分析 前言 Linux中对一个文件进行操作的时候,一件很重要的事情是对文件名进行解析处理,并且找到对应文件的inode对象,然后创建表示文件的file对象.在此,对文件名 ...

  5. 图文深度解析Linux内存碎片整理实现机制以及源码

    图文深度解析Linux内存碎片整理实现机制以及源码. 物理内存是以页为单位进行管理的,每个内存页大小默认是4K(大页除外).申请物理内存时,一般都是按顺序分配的,但释放内存的行为是随机的.随着系统运行 ...

  6. Linux源码中的mktime算法解析

    Linux源码中的mktime算法解析 我们知道,从CMOS中读出来的系统时间并不是time_t类型,而是类似于struct tm那样,年月日时分秒是分开存储的. 那么,要把它转化为系统便于处理的ti ...

  7. wifidog 源码初分析

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

  8. ARM树莓派高级开发——linux内核源码、树莓派源码编译、SD卡挂载

    文章目录 linux内核开发基础(linux内核源码.树莓派源码编译.SD卡挂载) 树莓派等芯片带操作系统的启动过程 linux内核源码树 Linux内核源代码目录树结构: 树莓派Linux源码配置 ...

  9. 【Linux后台开发系列】Nginx源码从模块开发开始,不再对nginx源码陌生丨源码分析

    Nginx源码从模块开发开始,不再对nginx源码发怵,值得学习,认真听完. 1.  nginx的conf配置,cmd解析 2.  nginx模块的八股文 3.  nginx开发的细枝末节 [Linu ...

最新文章

  1. 高并发存储番外篇:Redis套路,一网打尽
  2. 管理者和领导者有哪些区别?
  3. 吴恩达、李飞飞、沈向洋:2021年的人工智能将会如何发展?
  4. breakout room at teams
  5. AtCoder AGC030E Less Than 3
  6. wordpress 主机伪静态404.php seo,wordpress开启伪静态之后,出现404是什么原因?
  7. ModuleNotFoundError: No module named 'django.core.urlresolvers'
  8. 曲线的生成算法实现_PCGPlanet1-地形生成算法简介
  9. (C语言版)栈和队列(一)——实现链式栈和链式队列的基本操作以及遇到的问题
  10. Applying Multicycle Exceptions in the TimeQuest Timing Analyzer--Altera Note
  11. 图片抓取_小小爬虫批量抓取微信推文里的图片
  12. 特征提取与检测(三) --- ORB算法
  13. python 物联网服务器_python+树莓派实现IoT(物联网)数据上传到服务器
  14. Nginx源码分析 - 主流程篇 - 解析配置文件(13)
  15. IntelliJ IDEA使用技巧(七)——常用快捷键Mac篇
  16. 使用AJAX如何得到数据库当中的值!
  17. IE7和IE8的CSS样式不兼容
  18. 2022-09-21 虚机安装威联通 QuTScloud
  19. 一个量化交易员的日常:屌丝版VS土豪版
  20. 画图工具的认识及应用计算机,认知画图软件教学设计

热门文章

  1. VR校园欺凌安全教育系统进入校园|广州华锐互动
  2. 年历显示。功能要求:1.输入一个年份,输出时在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。2.输入年月,输出该月的日历。
  3. Soot(一)——安装与基本使用
  4. python螺旋输出矩阵_飘逸的python - 打印螺旋矩阵
  5. python hack js_飘逸的python - hack输出流便于调试
  6. 2010年最骚最有深度的100句话!
  7. 操作系统——中断处理程序及设备驱动程序
  8. Java实现火车票售票系统
  9. 面试题--hashCode与equals
  10. etl spring_系统设计与架构笔记:ETL工具开发和设计的建议