linux pptpd賬號同時登入的問題

海鳥發表於2014-09-07

最近搞了個雲主機搭建個VPN伺服器給自己用, 特別是在公共場所的wifi上網時, 很多APP, 或者網站是沒有https的, 所以為了保證資訊(主要是賬號密碼)的安全, 搭個私有vpn還是很有必要的. 在google上搜尋 "linux pptpd配置" 可以找到很多相關的文章, 這裡不說怎麼搭建了. 這篇文章裡主要是講下同一個賬號怎麼防止多個使用者同時登入使用(因為pptpd預設是可以同時登入的). 至於這個場景, 就是我有時候分配給別人一個vpn賬號時不希望在多臺電腦上同時使用.

找到"/etc/pptpd.conf"這個檔案, 讓下面這行生效:

# TAG: logwtmp
#       Use wtmp(5) to record client connections and disconnections.
#
logwtmp

這樣的話所有vpn客戶端連線到服務的時候, 都會在 /var/log/wtmp 這個檔案下記錄下使用者的登入資訊, 這是個二進位制檔案, 但是我們可以用 last 登令檢視:

gg       ppp1         188.118.183.7      Sun Sep  7 00:19 - 00:19  (00:00)    
sk       ppp0         193.112.13.7       Sun Sep  7 00:18 - 00:20  (00:01) 

從上面我們知道有兩個賬號, gg 和 sk分別通過 188.118.183.7 和 188.118.183.7 這兩個ip登入過. 所以我們這裡可以通過使用者的登入資訊來阻止一個賬號同一時刻都處於 still logged in 狀態.

接下來, 我們要編輯 /etc/ppp/ip-up 這個檔案, 在檔案的末尾加上這麼一段指令碼: 

sleep 2
PID=$(cat /var/run/$PPP_IFACE.pid)
if [ $PID ]
 then
    PROCCESS="$(last | grep ppp | grep still | grep $PPP_IFACE)"
    NAME=$(echo $PROCCESS |cut -d' ' -f1)
    NUMLOGINS="$(last | grep ppp | grep still | grep -c $NAME' ')"
    if [ $NUMLOGINS -gt 1 ]
        then
        kill $PID
    fi
fi

這裡解釋下這段指令碼的意思. 變數 PPP_IFACE 就是當前登入的程式名稱, 所以我們可以通過 /var/run/$PPP_IFACE.pid 找到當前登入使用者的程式id號(伺服器在每個客戶端建立連線後都會用一個單獨的程式來處理當前會話), PPP_IFACE一般像是 ppp0, ppp1...pppn這樣的形式. 然後我們通過在上面說的 last 命令找出當前連線的使用者名稱, cut -d ' ' -f1 就是從 last 輸出中找到當前的登入使用者名稱, 然後檢查當前是否有相同的使用者名稱登入了, 如果存在, 則結束當前的登入程式, 讓剛建立起來的連線馬上斷開.

如果大家有更好的辦法不妨留言告訴我下, 謝謝了.

----------------------------分隔線-------------------

今天發現登入vpn有的網站不能上, 感覺很奇怪, 通過在vpn服務上直接curl或者wget都可以正常下載網頁. 然後通過wireshark攔截, 所有的ppp包也是正常compressed的. google了發現可能是vpn連線的MTU設定有問題, 可以在/etc/ppp/ip-up裡新增一句指令碼在初始化ppp連線時修改mtu值:

 

ifconfig $1 mtu 1500  # 其中$1即新建的連線介面

 

 

參考: http://stackoverflow.com/questions/4396827/how-to-enable-disable-pptp-multi-login-of-a-same-account-on-linux

 

相關文章