Wifidog 认证
首先簡單介紹一下什么是Portal認證,Portal認證,通常也會叫Web認證,未認證用戶上網時,設備強制用戶登錄到特定站點,用戶可以免費訪問其 中的服務。當用戶需要使用互聯網中的其它信息時,必須在門戶網站進行認證,只有認證通過后才可以使用互聯網資源。現金很多中國移動CMCC、中國聯通、中 國電信ChinaNet的WIFI都使用這種認證接入方式。
在OpenWRT上實現Portal認證,實際上早已有解決方案:
1. chillispot,但原維護作者停止更新,被chillispot.info接管繼續開發;
2.coova-chilli,它是基于chillispot開發拓展的,功能最為強大;可以去官方看一下Coova-chilli;
3.wifidog
前兩個由于原維護作者停止更新,筆者也沒有深入研究,重點鉆研了wifidog,Wifidog也是OpenWRT和DD-WRT中實現Portal比較出名的。
但是,Wifidog只是實現AP認證網關,需要配合外部的Portal服務器才能使用,Portal主要是提供認證所需的WEB頁面且實現認證計費等的 功能。雖然這也有很多商用解決方案,例如wiwiz、wifiap等,但是這些商業解決方案的目標都是盈利,即使可以免費使用,免費賬號的功能和權限都受 到了很大的限制,例如不能自定義頁面,Web認證頁面有廣告等等。有條件的人可能打算自己搭建Portal服務器,但是看看Wifidog的官方 Wiki,對搭建過程實在是難以理解。后來,筆者發現網絡上還有一個authpuppy方案,官方網站www.authpuppy.org,是一個已實現好的Wifidog認證服務器,里面包含各種插件供你使用,官方的安裝過程也很簡單,如果你懂的HTML和面向對象編程的相關知識且擁有一個服務器,可以自行修改認證頁面,使用authpuppy也是一個不錯的方案。
但是,即便如此,這些方案還是不夠靈活,經過筆者認真鉆研,查閱大量資料并經過多次抓包分析,終于理解了Wifidog的工作原理。接下來筆者將會跟你介 紹如何自行編寫一個輕量級的Web Portal認證服務器。當然,這需要你具有程序設計基礎,HTML、CSS當然是少不得的,后端開發語言可以使用PHP或Python或Java等。
首先,需要簡單介紹一下Wifidog的工作原理:
1.客戶端發出初始化請求,比如訪問?www.baidu.com。
2.網關的防火墻規則將這個請求重定向到本地網關的端口上。這個端口是Wifidog監聽的端口。
3.Wfidog提供一個HTTP重定向回復,重定向到Web認證頁面,重定向的Url的Querystring中包含了Gateway的ID,Gateway的FQDN以及其他的信息。
4.用戶向認證服務器發出認證請求
http://portal_server:port/login_script?
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];
5.網關返回一個(可以是自定義的)splash(也稱作“登錄”)頁面。
6.用戶提供他的憑據信息,比如用戶名和密碼。
7.成功認證的話,客戶端將會被重定向到網關的自己的web頁面上,并且帶有一個認證憑據(一個一次性的token),內容比如:
http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token];
8.用戶就是用獲取到的憑據訪問網關。
9.網關去認證服務器詢問token的有效性。
10.認證服務器確認token的有效性。
11.網關發送重定向給客戶端,以從認證服務器上獲取 成功提示頁面,重定向到 http://portal_server:port/portal_script 這個位置。
12.認證服務器通知客戶請求成功,可以上網了。
圖解:
然后考察一下Wifidog的配置文件/etc/wifidog.conf,關鍵的配置項是:
AuthServer {
Hostname???????????? (Mandatory; Default: NONE)
SSLAvailable????????? ?(Optional; Default: no; Possible values: yes, no)
SSLPort?????????????? (Optional; Default: 443)
HTTPPort???????????? (Optional; Default: 80)
Path???????????????? ?(Optional; Default: /wifidog/ Note:? The path must be both prefixed and suffixed by /.? Use a single / for server root.)
LoginScriptPathFragment? (Optional; Default: login/? Note:? This is the script the user will be sent to for login.)
PortalScriptPathFragment (Optional; Default: portal/? Note:? This is the script the user will be sent to after a successfull login.)
MsgScriptPathFragment??? (Optional; Default: gw_message.php? Note:? This is the script the user will be sent to upon error to read a readable message.)
PingScriptPathFragment??? (Optional; Default: ping/? Note:? This is the script the user will be sent to upon error to read a readable message.)
AuthScriptPathFragment??? (Optional; Default: auth/? Note:? This is the script the user will be sent to upon error to read a readable message.)
}
# Listen on this port
GatewayPort 2060
# Parameter: CheckInterval
# Default: 60
# Optional
#
# How many seconds should we wait between timeout checks.? This is also
# how often the gateway will ping the auth server and how often it will
# update the traffic counters on the auth server.? Setting this too low
# wastes bandwidth, setting this too high will cause the gateway to take
# a long time to switch to it’s backup auth server(s).
CheckInterval 60
# Parameter: ClientTimeout
# Default: 5
# Optional
#
# Set this to the desired of number of CheckInterval of inactivity before a client is logged out
# The timeout will be INTERVAL * TIMEOUT
ClientTimeout 5
AuthServer是Portal服務器的配置項;GatewayPort是Wifidog監聽的地址,默認是2060,一般保持默認即 可;CheckInterval是心跳時長,單位是秒,什么是心跳呢,客戶端認證成功之后,如果有網絡訪問動作,Wifidog getway就會每隔一段時間訪問Portal服務器的一個腳本,用于認證計費,當然,如果客戶使用超時或超流量,也可以通過心跳強制客戶端下線。 ClientTimeout是用戶一次認證成功后的網絡訪問時長,超過這個時間需要重新認證,這個時長并非由ClientTimeout單獨決定,取決于 INTERVAL * TIMEOUT。詳細的配置信息可以訪問:http://dev.wifidog.org/browser/trunk/wifidog/wifidog.conf。
我們重點討論Portal服務器的配置項,Hostname是Portal服務器的ip或者是域名,SSLAvailable和SSLPort是SSL加 密配置,如果你的Portal服務器有配置HTTPS加密,則需要配置這兩項;Path是指你的腳本路徑(舉例,http://a.com/to/,則 a.com是域名,/to/是路徑),注意路徑必須以“/”開頭和結尾,如果是根路徑,則填一個“/”即可;接下來的5個配置指明你的腳本名,這說明了我 們需要寫五個腳本,我會詳細說明。(以下文中涉及的“第幾步”均是指Wifidog認證過程的步驟)
LoginScriptPathFragment配置項配置的是登陸腳本,它通過GET方式接受傳入參數gw_address、gw_port、 gw_id、mac和url,gw_address是AP Getway的ip地址;gw_port是Wifidog監聽的端口,即上面介紹的wifidog.conf中的GatewayPort配置;gw_id 是AP Getway的id,配置文件wifidog.conf中可以配置,默認值是default,這個值的作用是當存在多個AP是,服務器或管理員可以根據不 同的id確定用戶的接入點;mac是客戶計算機的網卡物理地址,注意不是AP網關的mac,這個mac是用來識別客戶計算機的;url是客戶初始訪問的 Url,這些Querystring都是AP Getway向客戶端發出重定向請求自動生成的。這個腳本同時需要提供登陸頁面,如果登陸成功,需要向客戶;端返回302重定向,重定向 到:http://gw_address:gw_port/wifidog/auth?token=[token];即實現第7步,其中[token]是 你自己自動生成的token字符串,隨機生成一個字符串即可,但是長度最好長些,安全性更高,另外,token需要根據不同用戶保存,最好保存于數據庫 中,之后的AP Getway詢問token有效性(第9步)還需要用到。這里最好使用cookie或session,使之后的登陸成功頁面可以判斷用戶已經成功,阻止未 登錄成功的人訪問認證成功頁面。
PortalScriptPathFragment配置項配置的是登陸成功后服務器展示的腳本(第11步),它通過GET方式接受1個傳入參 數,gw_id,這個腳本比較簡單,告知用戶登陸成功即可,當然,最好重定向到用戶之前想要方位的url,即第1步用戶輸入的URL。
MsgScriptPathFragment配置項配置的是錯誤信息展示腳本,它通過GET方式接受一個傳入參數message,這個腳本也很簡單,展示 message的內容即可,目的是當認證過程出現錯誤,AP Getway會重定向到這個腳本,URL中含有錯誤的信息。
PingScriptPathFragment配置項配置的是心跳腳本,這個腳本它通過GET方式接受5個傳入參 數,gw_id,sys.uptime,sys.memfree,sys.load,wifidog.uptime,其中,sys.uptime指的是 AP Getway的啟動時間,sys.memfree指的是AP Getway的空閑內存,sys.load指的是AP Getway的CPU負載,wifidog.uptime指的是wifidog的啟動時間,這個腳本每隔一段時間(Wifidog.conf里配置的 CheckInterval),Wifidog會自動訪問,但是其目的不是用戶驗證,而是幫助管理員管理AP節點,了解AP節點的負載情況,適時增加節點 等,Wifidog訪問這個腳本時,需要這個腳本返回Pong,如果你沒有統計AP節點負載數據的需求,可以丟棄這些數據,直接回應Pong,注意,這個 回應只包含“Pong”字符串,無需包含其他html標簽。
AuthScriptPathFragment是用戶認證腳本,實現的是第10步的功能,這個腳本它通過GET方式接受7個傳入參數:stage、ip、 mac、token、incoming、outcoming和gw_id。其中stage的值是login,ip是客戶端的ip,注意不是AP Getwap的ip;mac是客戶端的網卡物理地址,token就是你在認證腳本生成并返回給客戶端的;incoming和outcoming用于流量控 制,默認值為0;gw_id同上。如何識別用戶登錄成功,通過mac和token吧,LoginScriptPathFragment登陸腳本在用戶登陸 成功后需要記錄用戶的mac和token,然后在此處驗證,如果匹配,回復Auth: 1,否則,回復Auth: 0。另外,這個腳本也是心跳腳本,每隔一段時間Wifidog會自動訪問,如果用戶使用時間超過限制或流量超過額度,服務器可以及時回應Auth: 0結束用戶的訪問。另外需要注意的是,回應同樣無需包含html標簽,另外,在Auth后的冒號和0/1之間,有一個空格,缺少這個空格也會導致出錯。
在配置Wifidog的配置文件wifidog.conf是,配置腳本的配置項都必須以“?”結尾,否則以GET方式傳遞的QueryString會因Url缺少問號訪問錯誤的腳本。
看到了吧,僅僅5個簡單腳本,就可以實現利用Wifidog的Portal認證,當然,這過中還可以有很多應用尚未發掘,比如流量控制、帶寬控制、結合 Radius服務器實現認證等,你的開發也可以更上一層樓,實現更多功能。不過筆者還有一個建議,在登錄頁面除了用戶名和密碼意外,最好加個驗證碼,防止 不懷好意之人暴力破解。
這樣,你只需要一個免費的空間,甚至是簡單的百度云、新浪SAE等,就可以實現一個認證服務器;有的人可能還會問,能不能把這些腳本集成到路由器當中,我 的回答是能,只要你的腳本的功能不多,問題應該不大,但是這么做的風險比較大,路由的負載比較高,導致路由的運行會很不穩定,甚至經常死機,這也是筆者親 身實踐的結果,所以筆者不建議這么做。
最后啰嗦提醒的是,WiFidog是使用iptables基于三層協議工作的,所以使用Wifidog的結果是,不僅是Wifi接入需要Portal認 證,有線接入同樣需要認證。避免這種情況最簡單的做法是設立mac白名單。可能有的人又會問,能不能做到僅是Wifi接入需要認證,有線接入的無需認證, 有的人可能想更上一層樓,能不能開兩個Wifi,僅其中一個Wifi需要認證,另一個Wifi和有線網絡不需要Portal認證,我的回答是能,至于具體 做法,以后再介紹。
總結
以上是生活随笔為你收集整理的Wifidog 认证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 5.3 include 上层 f
- 下一篇: 后端技术:Web安全常见漏洞和修复建议,