最近搞了个云主机搭建个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

linux pptpd账号同时登录的问题的更多相关文章

  1. Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)

    一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全.为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器),以便在账号和密码之间再增加一个验证码, ...

  2. mongodb副本集加分片集群安全认证使用账号密码登录

    mongodb副本集加分片集群搭建网上资料有很多.粘贴一个写的比较好的.副本集加分片搭建 对于搭建好的mongodb副本集加分片集群,为了安全,启动安全认证,使用账号密码登录. 默认的mongodb是 ...

  3. Linux的账号口令机制及其爆破

    账号保存 谈到linux的账号认证,其实就是如何保存于通过口令(password)鉴别,这里首先要将两个文件,一个是/etc/passwd,另外一个是/etc/shadow. /etc/passwd文 ...

  4. linux备忘录-账号管理与ACL权限设定

    知识 账号管理中的一些文件结构 /etc/passwd 每一行的内容都为下面结构 账号名称:密码:UID:GID:用户信息说明:家目录:shell ---- UID ---- -- 0 -> 代 ...

  5. Linux学习-什么是登录档

    CentOS 7 登录档简易说明 登录档的重要性 为什么说登录文件很重要, 解决系统方面的错误: 用 Linux 这么久了,你应该偶而会发现系统可能会出现一些错误,包括硬件捉不到或者是某些系 统服务无 ...

  6. 在linux上使用ssh登录服务器,Linux权限

    本文是作者原创,版权归作者所有.若要转载,请注明出处 ssh为Secure Shell(安全外壳协议)的缩写. 很多ftp.pop和telnet在本质上都是不安全的. 我们使用的Xshell6就是基于 ...

  7. Linux—禁止用户SSH登录方法总结

    Linux-禁止用户SSH登录方法总结 一.禁止用户登录 1.修改用户配置文件/etc/shadow       将第二栏设置为"*",如下.那么该用户就无法登录.但是使用这种方式 ...

  8. linux查看ssh用户登录日志与操作日志

    linux查看ssh用户登录日志与操作日志 2013-11-01转载   ssh用户登录日志 linux下登录日志在下面的目录里:  代码如下 复制代码 cd /var/log 查看ssh用户的登录日 ...

  9. Windows 服务器开通防火墙后,IISFTP和Serv U开通的FTP账号不能登录

    应广大服务器客户要求一至反应Windows 服务器开通防火墙后,IISFTP和Serv U开通的FTP账号不能登录,出现列表超时的情况,特提供以下解决方案: 1. IIS FTP用户解决方法: 在防火 ...

随机推荐

  1. ROW_NUMBER() OVER函数的基本用法

    转自:http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html 语法:ROW_NUMBER() OVER(PARTITIO ...

  2. 定时器的fireDate指的是触发时间

    1.定时器开启后,会在经过设定的时间间隔后才会执行第一次定时操作.而不是立马开启. NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: ...

  3. SDL2.0学习

    http://www.ffmpeg.org/download.html http://doc.okbase.net/leixiaohua1020/archive/110977.html  //视频 h ...

  4. Selenium_模拟淘宝登录Demo

    package com.lkb.start; import com.alibaba.fastjson.JSONObject; import com.lkb.bean.Entity; import co ...

  5. Spring中@Async用法总结

    引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3. ...

  6. Oracle中"行转列"的实现方式

    在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用"行转列": scott的emp的原始数据为: ...

  7. 【Go语言】I/O专题

    本文目录 1.bytes包:字节切片.Buffer和Reader 1_1.字节切片处理函数 1_1_1.基本处理函数 1_1_2.字节切片比较函数 1_1_3.字节切片前后缀检查函数 1_1_4.字节 ...

  8. js判断图片加载完成后获取图片实际宽高

    通常,我们会用jq的.width()/.height()方法获取图片的宽度/高度或者用js的.offsetwidth/.offsetheight方法来获取图片的宽度/高度,但这些方法在我们通过样式设置 ...

  9. 利用Jquery给当前页或者跳转后页面的导航栏添加选中后样式

    具体的样式有两种情况,一种是直接给当前页面添加特殊样式,当网页刷新或者跳转到下一页后,样式消失:另一种情况是即使刷新页面后样式仍然有效. 直接上代码: 第一种情况: 在CODE上查看代码片派生到我的代 ...

  10. webkit内核浏览器的CSS写法

    -webkit-tap-highlight-color: transparent; Mobile上点击链接高亮的时候设置颜色为透明 -webkit-user-select: none; 设置为无法选择 ...