[toc]

主机配置

类型:阿里云ECS

地域:美国西部 1 (硅谷)(美国西部1 可用区B)

付费类型:按量付费

实例规格:1 vCPU 0.5 GiB (突发性能实例 t5, ecs.t5-lc2m1.nano)

I/O 优化:I/O 优化实例

网络类型:专有网络

交换机:美国硅谷交换机

安全组:xxxxxx

内网 IP:10.0.xxx.xxx

公网带宽:按使用流量

当前使用带宽 峰值:100Mbps

系统盘:40GB 高效云盘

操作系统:Ubuntu 16.04 64位

数据盘:无

PPTP及iptables安装配置

  • 安装PPTP

    sudo apt-get update
    sudo apt-get install pptpd
    
  • 配置

    sudo vi /etc/pptpd.conf
    

    取消掉以下2行的注释:

    localip 192.168.0.1
    remoteip 192.168.0.234-238,192.168.0.245
    

    其中localip为主机ip(单网卡主机一般为eth0[内部网络]的地址,双网卡主机为eth1[外部网络]的地址),remoteip为分配给客户端的ip。

  • 分配帐号

    sudo vi /etc/ppp/chap-secrets
    

    添加帐号按照以下格式(字段之间以tab做分割):

    username    pptpd   password    *
    
  • 转发配置

    sudo vi /etc/ppp/pptpd-options
    

    取消掉以下注释

    ms-dns 10.0.0.x
    ms-dns 10.0.0.x
    

    修改dns为8.8.8.8,8.8.4.4
    DNS最好是修改为8.8.8.8,8.8.4.4,经测试如果使用114.114.114.114,223.5.5.5等国际dns的国内提供商可能会导致客户端连接pptp以后无法上网

    sudo vi /etc/sysctl.conf
    

    取消掉 net.ipv4.ip_forward=1 这一行的注释。开启内核IP转发,如果没有这一行,请自行添加。最后执行以下命令

    sudo sysctl -p #使修改后的文件配置立即生效
    
  • 配置iptables

    安装iptables,用来实现请求的NAT转发

    sudo apt-get install iptables
    

    清除以前iptables规则(新装iptables用户可以自行跳过此步)

    sudo iptables -F
    sudo iptables -X
    sudo iptables -t nat -F
    sudo iptables -t nat -X
    

    开放gre协议以及1723、47端口,同时需在服务器供应商配置安装组的开放规则,否则依然会导致无法访问的问题。

    sudo iptables -A INPUT -p gre -j ACCEPT 
    sudo iptables -A INPUT -p tcp --dport 1723 -j ACCEPT 
    sudo iptables -A INPUT -p tcp --dport 47 -j ACCEPT
    

    开启NAT转发,-s参数转发地址一定要对应pptpd.conf中分配给客户机地址的网段,-o参数为需要用于转发请求的网卡名称,通过ifconfig可以看到。

    sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE  
    
  • 启动pptpd服务

    启动服务,让配置生效

    sudo service pptpd start  
    
  • 部分网站无法访问的问题(比如百度等)

    执行以下命令(二选一)

    iptables -I FORWARD -p tcp --syn -i ppp0 -j TCPMSS --set-mss 1356
    iptables -I FORWARD -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1356
    
  • 配置随开机启动

    对于按量付费用户,不能24小时都把服务器开着,所以需要配置服务随开机启动
    编辑/etc/rc.local文件,在exit 0之前加上以下命令。以下命令需要根据上述操作自行修改配置。

    sudo iptables -A INPUT -p gre -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 47 -j ACCEPT
    sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
    sudo iptables -I FORWARD -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1356
    sudo service pptpd start
    
  • 配置一个账号只能一处登录

    创建auth-up文件

    vi /etc/ppp/auth-up
    chmod a+x /etc/ppp/auth-up
    

    在auth-up脚本中写入以下内容

    #!/bin/sh
    # get the username/ppp line number from the parameters
    REALDEVICE=$1
    USER=$2
    # create the directory to keep pid files per user
    mkdir -p /var/run/pptpd-users
    # if there is a session already for this user, terminate the old one
    if [ -f /var/run/pptpd-users/$USER ]; then
      kill -HUP `cat /var/run/pptpd-users/$USER`
      rm /var/run/pptpd-users/$USER
    fi
    # copy the pid file of current user to /var/run/pptpd-users
    cp "/var/run/$REALDEVICE.pid" /var/run/pptpd-users/$USER
    

    重启PPTP

    service pptpd restart
    
  • 配置登录记录

    1.建立日志目录

    mkdir /var/log/pptpdlog
    

    2.记录登录信息

    在ip-up中写入以下代码

    #!/bin/sh
    LOG_DIR="/var/log/pptpdlog"
    curDay=`date +"%Y%m%d"`
    logFile="${LOG_DIR}/pptpd${curDay}.log"
    echo "##################################" >> $logFile
    echo "Now User $PEERNAME is connected!!!" >> $logFile
    echo "##################################" >> $logFile
    echo "time: `date -d today +%F_%T`" >> $logFile
    echo "clientIP: $6" >> $logFile
    echo "username: $PEERNAME" >> $logFile
    echo "device: $1" >> $logFile
    echo "vpnIP: $4" >> $logFile
    echo "assignIP: $5" >> $logFile
    

    3.记录登出信息

    在ip-down里写入以下代码

    #!/bin/sh
    LOG_DIR="/var/log/pptpdlog"
    curDay=`date +"%Y%m%d"`
    logFile="${LOG_DIR}/pptpd${curDay}.log"
    echo "#####################################" >> $logFile
    echo "Now User $PEERNAME is disconnected!!!" >> $logFile
    echo "#####################################" >> $logFile
    echo "time: `date -d today +%F_%T`" >> $logFile
    echo "clientIP: $6" >> $logFile
    echo "username: $PEERNAME" >> $logFile
    echo "device: $1" >> $logFile
    echo "vpnIP: $4" >> $logFile
    echo "assignIP: $5" >> $logFile
    echo "connect time: $CONNECT_TIME s" >> $logFile
    echo "bytes sent: $BYTES_SENT B" >> $logFile
    echo "bytes rcvd: $BYTES_RCVD B" >> $logFile
    sum_bytes=$(($BYTES_SENT+$BYTES_RCVD))
    sum=`echo "scale=2;$sum_bytes/1024/1024"| bc`
    echo "bytes sum: $sum MB" >> $logFile
    ave=`echo "scale=2;$sum_bytes/1024/$CONNECT_TIME"| bc`
    echo "average speed: $ave KB/s" >> $logFile
    

    4.添加执行权限

    写好之后务必确保ip-up和ip-down具有可执行权限,尤其是这两个文件本来不存在,自己后来再创建时,这两个文件会被视为纯文本,不会被执行,这正是原来那篇文章中所忽略的,所以记得加上

    chmod 755 /etc/ppp/ip-*
    

参考