OpenWRT下實現Portal認證(WEB認證)

首先簡單介紹一下什麼是Portal認證,Portal認證,一般也會叫Web認證,未認證用戶上網時,設備強制用戶登陸到特定站點,用戶能夠免費訪問其中的服務。當用戶須要使用互聯網中的其它信息時,必須在門戶網站進行認證,只有認證經過後纔可使用互聯網資源。現金不少中國移動CMCC、中國聯通、中國電信ChinaNet的WIFI都使用這種認證接入方式。php

 

在OpenWRT上實現Portal認證,實際上早已有解決方案:html

1. chillispot,但原維護做者中止更新,被chillispot.info接管繼續開發;java

2.coova-chilli,它是基於chillispot開發拓展的,功能最爲強大;能夠去官方看一下Coova-chilli;web

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等。api

首先,須要簡單介紹一下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,關鍵的配置項是:

Source code    
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認證,個人回答是能,至於具體作法,之後再介紹。

This entry was posted in OpenWRT and tagged Openwrt by zhyaof. Bookmark the permalink.

相關文章
相關標籤/搜索