PPTP是对端对端协议(PPP)的一种扩展,它采用了PPP所提供的身份验证、压缩与加密机制。PPTP能够随TCP/IP协议一道自动进行安装。PPTP与Microsoft端对端加密(MPPE)技术提供了用以对保密数据进行封装与加密的×××服务。 MPPE将通过由MS-CHAP、MS-CHAP v2身份验证过程所生成的加密密钥对PPP帧进行加密。为对PPP帧中所包含的有效数据进行加密,虚拟专用网络客户端必须使用MS-CHAP、MS-CHAP v2身份验证协议。

安装环境说明:

角色操作系统IP地址主机名
宿主机(Win7客户端)Windows 7 x64

172.28.88.182

192.168.49.1

cyjx-lp
PPTP ××× ServerCentOS 6.5 x86_64

eth0:192.168.49.133

eth1:192.168.140.128

vpnserver.contoso.com
内网服务器CentOS 6.5 x86_64eth0:192.168.140.129vpnclient.contoso.com

实验目的:假设192.168.49.0/24段是外网IP,192.168.140.0/24段是内网段,现在的需求是用户在办公室环境下172.16.28.0/24段要能访问内网段的服务器(192.168.140.129)。

因为192.168.49.0/24段属于外网IP,所以办公室网络能ping通××× Server的外网段,但是如何能让客户端访问内网段的其他服务器(服务器数量较多的情况下),就是要通过×××解决的问题了。

PPTP VPN的安装部署_虚拟

虚拟机网卡设置

PPTP VPN的安装部署_ppp_02

宿主机本地连接信息

PPTP VPN的安装部署_虚拟_03

宿主机ping外网和内网段的主机

PPTP VPN的安装部署_虚拟_04

这个是内网服务器的IP设置

步骤一:安装条件检测

安装之前首先要验证内核是否加载MPPE模块

modprobe ppp-compress-18 && echo ok

如果返回结果为ok,则表示已加载。

[root@vpnserver ~]# modprobe ppp-compress-18 && echo ok
ok


cat /dev/net/tun

如果上面的命令的执行结果为以下文本,则表示通过检测:

cat: /dev/net/tun: File descriptor in bad state

[root@vpnserver ~]# cat /dev/net/tun
cat: /dev/net/tun: File descriptor in bad state


检查PPP是否支持MPPE

用以下命令检查PPP是否支持MPPE:

strings '/usr/sbin/pppd' |grep -i mppe | wc --lines

如果以上命令输出为“0”则表示不支持;输出为“30”或更大的数字就表示支持,MPPE(Microsoft Point to Point Encryption,微软点对点加密)。

[root@vpnserver ~]# strings '/usr/sbin/pppd' |grep -i mppe | wc --lines
42


提示:Centos 6.4内核版本在2.6.15以上,都默认集成了MPPE和PPP,因此上面是否支持MPPE的检查可以忽略。

步骤二:安装ppp和iptables

yum -y install perl ppp iptables 

步骤三:安装pptpd

因为使用yum安装了ppp,所以再去要用rpm方式安装pptpd的时候,就要注意ppp的版本和pptpd的版本要对应,因为yum安装ppp基本上都是最新版本,所以如果安装的pptpd版本太旧,有可能会报错。

基本而言,两者的对应关系如下(关于版本问题,参见:http://www.dabu.info/centos6-4-structures-pptp-vpn.html):

ppp 2.4.4——>pptpd 1.3.4

ppp 2.4.5——>pptpd 1.4.0

当然,网上也有pptpd的源码安装包,但是非常不建议使用源码安装,可能各种依赖关系处理时间下来都能做好几遍rpm安装了。

[root@vpnserver ~]# rpm -qa ppp
ppp-2.4.5-10.el6.x86_64


已经安装了ppp版本2.4.5,所以需要下载对应的pptpd 1.4.0.

[root@vpnserver ~]# mkdir -p /opt/tools

[root@vpnserver ~]# cd /opt/tools

[root@vpnserver tools]# wget http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.4.0-1.el6.x86_64.rpm

rpm -ivh pptpd-1.4.0-1.el6.x86_64.rpm 

步骤四:修改配置文件

cp /etc/ppp/options.pptpd /etc/ppp/options.pptpd.bak 

echo -e "ms-dns 8.8.8.8\nms-dns 8.8.4.4" >>/etc/ppp/options.pptpd 

# 添加dns配置

[root@vpnserver tools]# tail -2 /etc/ppp/options.pptpd
ms-dns 8.8.8.8
ms-dns 8.8.4.4


echo "test  pptpd  123456  *" >>/etc/ppp/chap-secrets

# 创建vpn用户名和密码

[root@vpnserver tools]# tail -1 /etc/ppp/chap-secrets 
test  pptpd  123456  *


cp /etc/pptpd.conf /etc/pptpd.conf.bak

echo -e "localip 192.168.140.128\nremoteip 192.168.9.100-150" >>/etc/pptpd.conf

# 设置vpn服务器端IP和客户端的IP地址范围

[root@vpnserver tools]# egrep -v "#|^$" /etc/pptpd.conf
option /etc/ppp/options.pptpd
logwtmp
localip 192.168.140.128
remoteip 192.168.9.100-150


sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf 

# 启用Linux内核ip转发功能

sysctl -p

步骤五:启动pptpd服务

chkconfig pptpd on

/etc/init.d/pptpd start


PPTP ×××部署完成后,我先用windows客户端连接一下,客户端的使用方法放在后面介绍,这里先把要求达到,下面是连接后获取的IP地址:

PPTP VPN的安装部署_虚拟_05

可以看到,客户端已经连接到×××且获取了之前设置的192.168.9.0/24端的IP地址。

PPTP VPN的安装部署_ppp_06

这时客户端可以ping通PPTP ×××的内网IP地址,但是还无法ping通内网app服务器地址。

PPTP VPN的安装部署_虚拟_07

其实到这一步,跟Open×××就一样了,需要实现内网服务器能返回数据包给客户端,这个在Open×××的部署中提过,方法有三种,第一是内网服务器以××× Server的内网IP为默认网关,第二是通过iptables的nat地址转换,第三就是在所有的内网服务器上都添加静态路由。当然,最简单的就是将所有内网服务器的默认网关设置为××× Server的内网IP地址,如果条件允许的话。这里,我们也采用最简单的方法,即在内网app服务器上,将服务器的默认网关设置为PPTP ××× Server的内网IP。

PPTP VPN的安装部署_虚拟_08

再回到客户端,试着ping内网app服务器的IP地址,已经可以ping通了,目的达到,over。


pptpd安装脚本:

#!/bin/bash
################################################
#This script is used to install pptpd vpn.
#Created by Jerry12356 on Sep 6th, 2016
################################################

pptp_install(){
     yum -y install perl ppp iptables 2>/dev/null 1>/dev/null 
     rpm -qa perl ppp iptables >/dev/null 
     [ $? -ne 0 ] && echo "You need install necessary packages first." && exit 1 || echo "Install necessary packages successful."

     modprobe ppp-compress-18
     RETVAL1=$?
     cat /dev/net/tun >/dev/null 2>/tmp/temp
     grep "File descriptor in bad state" /tmp/temp >/dev/null
     RETVAL2=$?
     MPPE_NUM=`strings '/usr/sbin/pppd' |grep -i mppe | wc --lines`
     if [ $RETVAL1 -eq 0 ] && [ $RETVAL2 -eq 0 ] && [ $MPPE_NUM -gt 30 ];then 
         echo "Your system support pptpd well."  
     else 
         echo "Sorry, your system didn't support pptpd."  
         exit 1
     fi


     [ ! -d /opt/tools ] && mkdir -p /opt/tools && cd /opt/tools || cd /opt/tools
     PPPVersion=`rpm -qa ppp |awk -F"-" '{print $2}'`
     case ${PPPVersion} in 
         2.4.4)
             wget ftp://rpmfind.net/linux/sourceforge/h/ho/hostable/centos6/pptpd-1.3.4-2.el6.x86_64.rpm 2>/dev/null 1>/dev/null
             rpm -ivh pptpd-1.3.4-2.el6.x86_64.rpm 2>/dev/null 
	         [ $? -eq 0 ] && echo "Install pptpd-${PPPVersion} successful." || echo "Install pptpd-${PPPVersion} failed."
         ;;
         2.4.5)
             wget http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.4.0-1.el6.x86_64.rpm 2>/dev/null 1>/dev/null 
             rpm -ivh pptpd-1.4.0-1.el6.x86_64.rpm 2>/dev/null 
	         [ $? -eq 0 ] && echo "Install pptpd-${PPPVersion} successful." || echo "Install pptpd-${PPPVersion} failed."
         ;;
         *)
             echo "You need check the ppp version on your system, then choose the right pptpd package to download."
             exit 1 
         ;;
     esac

     if [ -f /etc/ppp/options.pptpd ];then 
         cp /etc/ppp/options.pptpd /etc/ppp/options.pptpd.bak 
         echo -e "ms-dns 8.8.8.8\nms-dns 8.8.4.4" >>/etc/ppp/options.pptpd 
     else 
         echo "File /etc/ppp/options.pptpd lost."
         exit 1
     fi
  
     pass=`openssl rand 6 -base64`
     if [ "$1" != "" ]
         then pass=$1
     fi
     echo "vpn pptpd ${pass} *" >> /etc/ppp/chap-secrets
     [ $? -eq 0 ] && echo "Set pptpd vpn password successful." ||echo "Set pptpd vpn password failed."

     if [ -f /etc/pptpd.conf ];then 
         cp /etc/pptpd.conf /etc/pptpd.conf.bak
         echo -e "localip 192.168.140.128\nremoteip 192.168.9.100-150" >>/etc/pptpd.conf
     else 
         echo "File /etc/pptpd.conf lost."
         exit 1
     fi 

     sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf 
     sysctl -p >/dev/null
     chkconfig pptpd on 
     service pptpd start >/dev/null 
     if [ $? -eq 0 ];then
         echo "Install pptpd and start service successful." 
	     exit 0 
     else
	     echo "Install pptpd occured some error." 
	     exit 1
     fi
}





cat <<EOF
This shell can only run on CentOS 6.x x86_64, please check your system and \
choose whether you want continue.
1、Yes
2、No
EOF
while true; do 

         read -p "Please input your choice:" Choice
         case $Choice in 
		     1|yes|Yes|y|Y)
			     echo "Install is running, please wait a moment."
			     pptp_install
			 ;;
			 2|no|No|n|N)
			     echo "Bye"
                 exit 1
			 ;;
             *)
                 echo "Please input 1 or 2 to make your decision."
			 ;;
		 esac 
done