2013年7月4日 星期四

建構OpenVPN使用帳號密碼~Part II~

趁著最近工作上有點小空檔。
又來重新測試一下OpenVPN與帳號密碼的配合。
結果發現之前設定仍然有些問題。
首先是密碼不符卻還是能通過認證的嚴重問題,
起因當然是密碼打錯卻還是能通過連線。
第二個問題是電腦的OpenVPN Client斷線後,
要等好一陣子才能連上去,一整個莫名其妙。

不過這在一陣時間的努力下,還是解決了。
以下是二個問題的解答。


第一個問題在經多次修改程式碼的測試之後
終於抓到Bug在哪裡了
重點在紐菲斯的部落格>>OpenVPN 建置筆記 (第8集)裡,
範例auth_sh.sh這個檔案裡面的判斷式錯了。
原判斷式為
if [ "$stat" = "1"] ; then
echo "fail"
exit 1
else
echo "ok"
exit 0 
fi
這樣如果密碼錯誤,auth_sql.php會回傳2,
或開放時間錯誤會回傳3,判斷式都會跳到else之後(因為不等於1),
自然全部都可以登入。
scirpt正確應該改成
if [ "$stat" = "0"] ; then
echo "OK"
exit 0
else
echo "Fail"
exit 1
fi
這樣就沒有問題,輸入錯誤的密碼也會擋下不給連線了。

第二個問題在於Clinet端的設定檔裡,
如果連線設定為UDP的話,需要explicit-exit-notify這參數。
這樣斷線時,會直接傳訊息回Server端去執行client-disconnect的腳本,
讓currentLogId的值重新變回NULL
而不用等到逾時斷線再去執行,多等了4~5分鐘。
之前沒遇到的狀況是因為沒那麼無聊,斷線後又馬上想連線。

使用UDP連線時,除了開啟Client端的explicit-exit-notify之外
關閉Server端的username-as-common-name也是個辦法
但是關閉這個之後,client_connect.php與client_disconnect.php就近乎失效。
查看MySQL的logs資料會發現只有登入時間,與logId
其它的userId與登出時間等都是空(NULL)值。
簡單地說,沒有開啟username-as-common-name這參數的話,
client_connnet.php與client_disconnnet.php裡面讀取的common_name變數,
就會是Client端的從設定檔名稱。
而開啟之後,自然就會替換成使用者的ID,這樣連線與離線程式才會正常記錄。
所以還是加explicit-exit-notify這參數在Client端就好。
要不然就換成TCP連線,不過這在傳資料時會比較慢,
就看個人取捨。




沒有留言: