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工作原理

然後考察一下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認證,我的回答是能,至於具體做法,以後再介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章