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

最新文章

  1. Intellij IDEA 13.1.3 打开多个窗口项目
  2. XML序列化
  3. swift block
  4. c# foreach循环二维数组
  5. 自制Unity小游戏TankHero-2D(5)声音+爆炸+场景切换+武器弹药
  6. 我的c++学习(6)默认参数和内联函数
  7. 拒绝IE8-,CSS3 transform rotate旋转动画效果(支持IE9+/chrome/firefox)
  8. C基础--结构体
  9. 3243: [Noi2013]向量内积 - BZOJ
  10. XMLHttpRequest2的进步之处
  11. github 的分支操作
  12. python常用模块(1):collections模块和re模块(正则表达式详解)
  13. 用MXNet实现mnist的生成对抗网络(GAN)
  14. centos7 搭建ntp时钟服务器
  15. eclipse二、保证svn导入的项目正常运行
  16. “幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】
  17. 从App业务逻辑中提炼API接口
  18. python基础(7)-函数&命名空间&作用域&闭包
  19. ChinaCock界面控件介绍-CCNewsSilder
  20. day11有参装饰器,无参装饰器

热门文章

  1. Codeforces Round #242 (Div. 2) A. Squats
  2. JSP 基础概念归纳 5分钟看完
  3. HDU 2825 Wireless Password(AC自动机+DP)
  4. 从一个QQ群友那儿偷来的js图形 ^_^
  5. error while loading shared libraries: libXXX.so.x: cannot open shared object file: No such file or directory .
  6. gitlab的使用方法
  7. Hibernate调用存储过程和函数
  8. linux下mysql的忘记root密码的解决办法
  9. iOS 编程思想
  10. oracle空间管理