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

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

----------------------------分隔线-------------------

今天发现登录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

 

posted @ 2014-09-07 01:00  海鸟  阅读(2149)  评论(0编辑  收藏  举报