分类 源码分析 下的文章

为wifidog认证跳转url添加客户端ip地址

默认的的wifidog认证页面跳转url是这样的
login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s
Example: https://auth.ilesansfil.org/login/?gw_id=0016B6DA9AE0&gw_address=7.0.0.1&gw_port=2060
由于业务需要,需要在跳转到认证页面时加一个客户端内网IP地址,即ClienIPAddress

下载wifidog添代码,打开http.c,找到

/* Re-direct them to auth server */
char *urlFragment;
safe_asprintf(&urlFragment, "%sgw_address=%s&gw_port=%d&gw_id=%s&url=%s",
auth_server->authserv_login_script_path_fragment,
config->gw_address,
config->gw_port,
config->gw_id,
url);
debug(LOG_INFO, "Captured %s requesting [%s] and re-directing them to login page", r->clientAddr, url);
http_send_redirect_to_auth(r, urlFragment, "Redirect to login page");
free(urlFragment);

修改为

/* Re-direct them to auth server */
char *urlFragment;
safe_asprintf(&urlFragment, "%sgw_address=%s&gw_port=%d&gw_id=%s&url=%s&clientip=%s",
auth_server->authserv_login_script_path_fragment,
config->gw_address,
config->gw_port,
config->gw_id,
url,
r->clientAddr);
debug(LOG_INFO, "Captured %s requesting [%s] and re-directing them to login page", r->clientAddr, url);
http_send_redirect_to_auth(r, urlFragment, "Redirect to login page");
free(urlFragment);

重新编译以后就OK了

现在认证跳转url就带有客户端ip地址了。

本文章由 http://www.wifidog.pro/2015/02/15/wifidog%E6%B7%BB%E5%8A%A0%E5%AE%A2%E6%88%B7%E7%AB%AFIP.html 整理编辑,转载请注明出处

wifidog 整体代码分析

Wifidog将ping协议作为心跳机制向认证服务器发送当前状态信息,过程如下:

Ping线程的创建

/* Start heartbeat thread */

result =pthread_create(&tid_ping, NULL, (void *)thread_ping, NULL);

if (result != 0) {

    debug(LOG_ERR, "FATAL: Failed tocreate a new thread (ping) - exiting");

    termination_handler(0);

}

pthread_detach(tid_ping);

上面的过程创建子线程后,将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源。并且是非阻塞的。

Thread_ping实现:

void    
thread_ping(void *arg)  
{
       pthread_cond_t             cond = PTHREAD_COND_INITIALIZER;    
       pthread_mutex_t           cond_mutex =PTHREAD_MUTEX_INITIALIZER;    
       struct      timespec  timeout;    

       while (1) {    
              /* Make sure wecheck the servers at the very begining */    
              debug(LOG_DEBUG,"Running ping()");    
              ping();                 

              /* Sleep for config.checkinterval seconds... */

              timeout.tv_sec= time(NULL) + config_get_config()->checkinterval;

              timeout.tv_nsec= 0;    

              /*Mutex must be locked for pthread_cond_timedwait... */

              pthread_mutex_lock(&cond_mutex);

              /*Thread safe "sleep" */

              pthread_cond_timedwait(&cond,&cond_mutex, &timeout);

              /*No longer needs to be locked */

              pthread_mutex_unlock(&cond_mutex);

       }    
}

红色部分为非常优雅的线程休眠,想下为什么不用sleep?用sleep会导致整个进程陷入休眠,不建议使用。

ping的过程:

a. 连接auth服务器
获取auth服务器的个数,wifidog支持备用auth服务器
进行auth服务器尝试计数
进行dns解析、会尝试按顺序对每个auth服务器进行解析,直到解析成功。
dns解析失败,则尝试对www.google.com、"www.yahoo.com"、进行解析,如果解析成功代表网络时通的,如果失败则代表网络不通,直接退出。网络是通的则会进行下一个auth服务器解析
dns解析成功,将auth服务器ip地址记录到auth_server->last_ip中,并进行socket连接
b. 获取本机设备的uptime(系统总运行时间与系统空闲时间)、meminfo、loadavg()信息
/*
loadavg
监控CPU的平均负载、这里的平均负载也就是可运行的进程的平均数
cat /proc/loadavg
前三个值分别对应系统在5分钟、10分钟、15分钟内的平均负载
第四个值的分子是正在运行的进程数,分母是进程总数,最后一个是最近运行的进程ID号
*/
c. 进行请求数据填充,格式如下:

snprintf(request,sizeof(request) - 1,                         "GET%s%sgw_id=%s&sys_uptime=%lu&sys_memfree=%u&sys_load=%.2f&wifidog_uptime=%luHTTP/1.0\r\n"    
                     "User-Agent:WiFiDog %s\r\n"    
                     "Host:%s\r\n"    
                     "\r\n",    
                     auth_server->authserv_path,    
                     auth_server->authserv_ping_script_path_fragment,    
                     config_get_config()->gw_id,   
                     sys_uptime,    
                     sys_memfree,    
                     sys_load,
                         (longunsigned int)((long unsigned int)time(NULL) - (long unsigned int)started_time),    
                     VERSION,    
                     auth_server->authserv_hostname);

Auth服务器在收到‘ping’包后只需要回复PONG字符串即可,这有点像supplicant的回复。
但即使这个过程有问题,也不妨碍wifidog重定向的使用,貌似这个模块的功能仅仅是把设备的状态发送给auth服务器。

流量控制

线程的创建:

/*Start clean up thread */

result= pthread_create(&tid_fw_counter, NULL, (void *)thread_client_timeout_check,NULL);

if(result != 0) {

   debug(LOG_ERR, "FATAL: Failed tocreate a new thread (fw_counter) - exiting");

   termination_handler(0);

}

pthread_detach(tid_fw_counter);

这地方和上面讲解的一样,不在重复。

主要函数:fw_sync_with_authserver,改函数的流程如下:

a. 调用iptables_fw_counters_update更新所有client的流程出入统计(利用iptable规则)

b. 遍历clinet list,该list是之前所有登入过的客户端

c. 如果有auth server,将每个client的ip、mac、token、incoming、outgoing发给auth server

d. 进行客户端流量更新超时检测,检测的规则如下:

p1->counters.last_updated+(config->checkinterval * config->clienttimeout)<= current_time

如果满足上面规则,则认为该client是不活动用户,会在iptable规则中删除该用户,清除在client list的记录,并通知auth server 该client REQUEST_TYPE_LOGOUT。

e. 如果上面一些条件不满足,则依据authresponse.authcode返回值进行处理
case AUTH_DENIED:
在iptable规则中删除该用户,清除在client list的记录
case AUTH_VALIDATION_FAILED:
验证超时,在iptable规则中删除该用户,清除在client list的记录
case AUTH_ALLOWED:
将改client fw_connection_state 置为FW_MARK_KNOWN,并将改client添加到允许上网的规则当中
case AUTH_VALIDATION:
不做任何事
case AUTH_ERROR:
不做任何事

认证流程

wifidog-flow-2009.png

用户连接WIFI会跳转到以下地址:

http://auth_server/login?gw_id=[GatewayID, default: "default"]gw_address=[GatewayAddress, internal IP of router]gw_port=[GatewayPort, port that wifidog Gateway is listening on]

url=[user requested url]

auth_server #即认证的域名

gw_id #配置的网关名称

gw_address #回调的内网地址

gw_port #回调的端口

在这个阶段需要返回登录的页面,即授权的首页,并且需要将所有涉及跳转的第三方地址加入白名单
当验证用户身份之后,即用户登录成功之后重定向到网关地址
http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token]
auth token #系统为用户生成的token

网关地址接受到消息后,会周期的发送用户信息,并确认是不是允许继续网络访问请求地址

http://auth_server/auth/index.php?   
stage=counters   
ip=    
mac=    
token=    
incoming=    
outgoing=

ip,mac,token为用户的基本信息,incoming/outgoing为用户的连接计数信息,用来限定用户是否可以继续连接
此时auth_server需要返回该请求:
0——拒绝,删除防火墙内用户以及用户的信息
6——用户验证失败,超时,会删除防火墙内信息(即会重新要求登录)
1——用户验证通过,并跳转到http://auth_server/portal/?gw_id=%s
5——用户需要验证,允许规则内的访问进行验证
-1——用户验证出错,用户可以继续访问网络

返回数据格式:
Auth:
如Auth: 1 #中间有个空格

系统会周期性发送心跳包,用来确认网关验证和认证服务器的正常工作请求地址

http://auth_sever/ping/?
gw_id=%s
sys_uptime=%lu
sys_memfree=%u
sys_load=%.2f
wifidog_uptime=%lu

auth_server此时需要返回“Pong”

可以通过该心跳包来监控整个认证的工作

本文章由 http://www.wifidog.pro/2015/02/13/wifidog%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90-2.html 整理编辑,转载请注明出处

wifidog认证流程及相关重要函数调用

1、The client does his initial request, as if he was already connected, (e.g.: http://www.google.ca)
2、The Gateway’s firewall rules mangle the request to redirect it to a local port on the Gateway. When that’s the done, the Gateway provides an HTTP Redirect reply that contains the Gateway ID, Gateway FQDN and other informations
3、The Client does his request to the Auth Server as specified by the Gateway, see Login Protocol
4、The Gateway replies with a (potentially custom) splash (login) page
5、The Client provides his identification informations (username and password)
6、Upon succesful authentication, the client gets an HTTP Redirect to the Gateway’s own web server with his authentication proof (a one-time token), http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token]
7、The Client then connects to the Gateway and thus gives it his token
8、The Gateway requests validation of the token from the Auth Server, see Client Protocol
9、The Auth Server confirms the token
10、The Gateway then sends a redirect to the Client to obtain the Success Page from the Auth Server, redirects to http://auth_server/portal/
12、The Auth Server notifies the Client that his request was successful

代码:

http_callback_404:
将未认证的请求重定向到Auth Server的登录界面:login页面

http_callback_auth:
客户端登陆成功后,Auth Server将客户端重定向到Gateway,形式如下:http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token]

authenticate_client:
Gateway将拿到的token传给Auth Server,验证客户端,如果客户端被允许,将客户端重定向到Auth Server的portal界面Firewall.c中包含了对iptables相关的操作

本文章由 http://www.wifidog.pro/2015/02/13/wifidog%E8%AE%A4%E8%AF%81%E6%B5%81%E7%A8%8B.html 整理编辑,转载请注明出处

使用dd-wrt开通云热点WiFi认证功能-免费构建自己的WiFi热点认证页面

如果您有一个支持dd-wrt的路由器,那一定要试试云热点为您提供的专业WiFi热点认证页面服务,可媲美星巴克基麦当劳!顾客只要进入您的门店,打开WiFi就能享受到超一流的WiFi认证体验,您也可以借此提升店面的品牌形象。
如果您的小店是做餐饮、美发、娱乐等需要顾客等待的行业,那您一定要告诉我,我们将为您提供全方位、优体验、超专业的热点认证服务,并且您还能优先体验我们后续的服务。
最最重要的是,所有这些服务,我们都是免费的!!!!!!!
下面我将为大家展示我们的所能够提供的优质服务和使用方法。
第一,你要拥有一个可以刷dd-wrt的路由器,并且已经刷好了dd-wrt系统,这第一个条件对于聪明的你来说,简直是小菜一碟了,哈哈
具体的过程我就不说了,网上找一下,比比皆是。
第二,我要重点说一下,就是使用云热点的商家后台网站http://e.yunwifi.cn/ 注册开通云热点服务
1、点击首页的注册新用户,这个过程想必大家都会了
2、注册完新用户之后,您就正式成为我们的服务商家了,请在页面中开通自己的热点,并记录下所申请的热点编号,它是一串8位数字。
3、官网上面有我们的在线客服,不懂的可以随时咨询。
下面进入关键的路由器设置阶段了!!
第三,路由器的设置,进入services-> Hotspot,如下图
1.png

找到Hotspot Portal中的wifidog项,然后点击enable,页面就自动跳转到下图所示的页面了
2.png

好了,经过以上的设置,你就可以使用我们为您提供的媲美星巴克、麦当劳的免费热点接入服务了,赶快自己动手享受一下吧!

本文章由 http://www.wifidog.pro/2015/02/09/wifidog-ddwrt.html 整理编辑,转载请注明出处