上一节提到httpdAddC404Content 及它的回调函数,还有相应的流程,只是讲解功能,并不是指注册了回调函数就可以执行回调函数了,而是要等客户端触发回调函数才执行。下面接着讲解其他部分。
fw_destroy(), 清掉和wifidog 有关的iptables 规则,这里不细说。
fw_init(), 添加wifidog 相关的iptables 链及规则,这里的规则主要是wifidog.conf 里设置的firewall rule set, global/validating-users/known-users/unknown-users/locked-users,这里unknown-users 默认的四条关于53/67 port 的allow 规则需要打开。除了.conf里的,还有认证服务器也会被加入白名单,以使得客户端能够正常和认证服务器交互。
接下来,wifidog 会创建几个线程,注意,wifidog 是多线程运行不是fork 子进程:
1,超时检查线程:函数thread_client_timeout_check;
2,ping协议线程:函数thread_ping;
3,和wdctl 交互的线程,wdctl 是控制wifidog 结束,重启的程序,这里不细说;
4,httpd处理线程,函数thread_httpd,这个线程是在一个while 死循环里接受http 连接然后处理连接的线程,可以读取http 请求的具体内容,主要调用了两个函数httpdReadRequest/httpdProcessRequest,读取和处理http 请求。
我们主要来讲解下超时检查和ping 协议线程.
1) 函数thread_client_timeout_check 调用了fw_sync_with_authserver,其他部分代码是线程锁,我们只需要关注fw_sync_with_authserver 函数。
fw_sync_with_authserver 函数功能:网关每隔config.checkinterval 时间检查,把所有客户端链表的信息发送给认证服务器进行流量更新,并且计算每一个客户端距离上次认证成功之后所经过的时间,如果距离上次认证成功经过的时间超过config.checkinterval * config.clienttimeout,即认为已经超时,网关会发送此客户端的logout 通知认证服务器,并将此客户端的iptables 白名单移除,客户端需要重新认证。
2) 函数thread_ping 调用ping 函数。
ping()函数功能:网关定时发送Ping 协议包通知认证服务器证明自己是活的,发包的时间间隔也是config.checkinterval, ping协议格式:http://auth_server/ping/?gw_id=xxx&sys_uptime=xxx&sys_memfree&sys_load=xxx&wifidog_uptime=xxx,这些都是网关的参数,和客户端没有的关系。
本文由http://www.wifidog.pro/2014/12/09/wifidog%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90-1.html整理编辑,转载请注明出处