linux pptpd账号同时登录的问题

最近搞了个云主机搭建个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 输出中找到当前的登录用户名, 然后检查当前是否有相同的用户名登录了, 如果存在, 则结束当前的登录进程, 让刚建立起来的连接马上断开.

如果大家有更好的办法不妨留言告诉我下, 谢谢了.

 

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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。