wifidog是一个用于配合认证服务器实现无线网页认证功能的程序,常见的情景就是使用于公共场合的无线wifi接入点,首先移动设备会连接公共wifi接入点,之后会弹出网页要求输入用户名密码,认证过后才能够连入外网。其主页是 http://dev.wifidog.org/
" X! |% h' Z' {0 ]. T7 Q实现原理
; J) S, A( w( V+ P" ] 其实wifidog原理很简单,主要是通过管控iptables,配合认证服务器进行客户端的放行操作。wifidog在启动后都会自动启动三个线程,分别为客户端检测线程、wdctrl交互线程、认证服务器心跳检测线程。每当新用户连接无线AP并浏览网页时,wifidog会获取新用户的此次操作,并返回一个重定向到认证服务器的http于用户,此后用户通过认证服务器认证后,再继续浏览网页时,wifidog会询问认证服务器此用户权限,若放行则修改iptables放行此用户IP。 1)主要流程如下- J* [9 c- u( U
添加关键路径对应的回调函数
, r; n# S( r; W$ Y删除所有iptables路由表# h3 S/ X& h! Q5 H- `
建立新的iptables路由表
& T d" G/ Z9 Q& i$ u6 E! V% R开启客户端检测线程(用于判断客户端是否在线,是否登出)4 s4 k$ a* y8 |1 w, n) J8 Y# s/ c. P
开启wdctrl交互线程
: ?" s M! V6 J) U- w. ^) z! |, b, s) T开启认证服务器心跳检测线程
- U8 {. u) E9 t5 j循环等待客户端连接(使用socket绑定2060端口并监听,实际上在建立新的iptables路由表规则时会将网关的80端口重定向到2060端口) 2)回调函数" w+ ]; m, ^# Y0 `
回调函数主要用于根据用户http报文执行不同的操作,其原理就是分析http报文请求中有没有关键路径,若有,则执行关键路径对应的回调函数,若没有,则返回一个重定向到认证服务器的包给用户。一次典型的流程为 用户连接无线AP,访问某网站(比如 http://www.baidu.com) 0 i6 H& y( U- k6 Z7 i6 G
wifidog获取到此http报文,检查是否包含关键路径,没有则返回重定向包给用户,将其重定向到认证服务器
' S3 B2 l! h! W0 j5 B- |4 P用户认证成功,认证服务器将用户重定向到无线AP网关,并包含关键路径"/wifidog/auth"和token
9 i; m( X4 z& r2 i5 Bwifidog接收到用户重定向后访问的报文,检测到关键路径"/wifidog/auth",然后访问认证服务器进行token认证
) I9 l$ _2 q5 F* p2 T! h& L+ J认证成功,wifidog修改iptables放行此用户(根据mac和ip进行放行) 3)wifidog的iptables规则
3 t3 W( X9 l y# d: B8 t# m8 `, I 这一部分我没有仔细认真看源码,但可以推论出wifidog是怎么修改iptables的规则的,了解iptables基本原理的同学都清楚iptables实际上有两条路进行数据包处理,一条路会通过应用程序,一条路不同过应用程序,直接到POSTOUTPUT,而我认为wifidog建立的规则是 只要是访问认证服务器的http请求都直接不通过wifidog发送出去
2 D! q0 P1 P/ L* R/ N+ e0 G+ R: U只要是通过认证的客户端wifidog都会修改iptables让其数据直接从FORWARD到POSTOUTPUT,而不经过wifidog
7 y$ n* `3 j) {. j其他行为都必须进过wifidog处理 4)客户端检测线程1 K8 }7 h% i2 }6 z
此线程每隔60s会遍历一次客户端列表,对每一个客户端列表统计流量,如果客户端在60s间隔内没有新产生的流量则不更新客户端的最新更新时间,当当前时间减去最新更新时间大于断线要求时间时,则会将此客户端从客户端列表删除,并修改iptables规则禁止其访问外部网络,然后发送此客户端登出包于认证服务器,认证服务器根据此登出包将此客户端做登出处理。如若没有超出断线要求时间,此线程还会发送客户端状态获取包于认证服务器,认证服务器返回此客户端在认证服务器上的信息,如若信息表示此客户端已在认证服务器上登出,wifidog则会执行此客户端下线操作。 5)wdctrl交互线程5 Y* r! s) f# v
其原理是使用unix socket进行进程间通信,具体实现在之后文章中体现 6)认证服务器心跳检测线程
, F: [' L$ c! S4 m. Y" o( L 原理也很简单,就是每隔60s将路由的一些系统信息发送给认证服务器,认证服务器接收到会返回一个回执 7)循环等待客户端连接) x) d$ n# Y0 w0 ^7 T+ g
这里主要会接收到两种类型的客户端连接 未认证的客户端打开网页操作,wifidog会接收到此http请求,并返回一个重定向到认证服务器的包于客户端经过认证服务器认证成功后,认证服务器自动将客户端重定向到无线AP的操作,wifidog接收到此类http请求后会检测关键路径"/tmp/wifidog",并把http请求中携带的token与认证服务器进行认证,认证成功后则修改iptables放行客户端。' x+ @- Q6 D" V) n6 g D6 W" o [" K
! L- j$ e) L3 D* B1 y
|