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 ××× Server | CentOS 6.5 x86_64 | eth0:192.168.49.133 eth1:192.168.140.128 |
***server.contoso.com | |
内网服务器 | CentOS 6.5 x86_64 | eth0:192.168.140.129 | ***client.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的外网段,但是如何能让客户端访问内网段的其他服务器(服务器数量较多的情况下),就是要通过×××解决的问题了。
虚拟机网卡设置
宿主机本地连接信息
宿主机ping外网和内网段的主机
这个是内网服务器的IP设置
步骤一:安装条件检测
安装之前首先要验证内核是否加载MPPE模块
modprobe ppp-compress-18 && echo ok
如果返回结果为ok,则表示已加载。
[root@***server ~]# modprobe ppp-compress-18 && echo ok ok
cat /dev/net/tun
如果上面的命令的执行结果为以下文本,则表示通过检测:
cat: /dev/net/tun: File descriptor in bad state
[root@***server ~]# 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@***server ~]# 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-***.html):
ppp 2.4.4——>pptpd 1.3.4
ppp 2.4.5——>pptpd 1.4.0
当然,网上也有pptpd的源码安装包,但是非常不建议使用源码安装,可能各种依赖关系处理时间下来都能做好几遍rpm安装了。
[root@***server ~]# rpm -qa ppp ppp-2.4.5-10.el6.x86_64
已经安装了ppp版本2.4.5,所以需要下载对应的pptpd 1.4.0.
[root@***server ~]# mkdir -p /opt/tools
[root@***server ~]# cd /opt/tools
[root@***server 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@***server 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
# 创建***用户名和密码
[root@***server 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
# 设置***服务器端IP和客户端的IP地址范围
[root@***server 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地址:
可以看到,客户端已经连接到×××且获取了之前设置的192.168.9.0/24端的IP地址。
这时客户端可以ping通PPTP ×××的内网IP地址,但是还无法ping通内网app服务器地址。
其实到这一步,跟Open×××就一样了,需要实现内网服务器能返回数据包给客户端,这个在Open×××的部署中提过,方法有三种,第一是内网服务器以××× Server的内网IP为默认网关,第二是通过iptables的nat地址转换,第三就是在所有的内网服务器上都添加静态路由。当然,最简单的就是将所有内网服务器的默认网关设置为××× Server的内网IP地址,如果条件允许的话。这里,我们也采用最简单的方法,即在内网app服务器上,将服务器的默认网关设置为PPTP ××× Server的内网IP。
再回到客户端,试着ping内网app服务器的IP地址,已经可以ping通了,目的达到,over。
pptpd安装脚本:
#!/bin/bash ################################################ #This script is used to install pptpd ***. #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 "*** pptpd ${pass} *" >> /etc/ppp/chap-secrets [ $? -eq 0 ] && echo "Set pptpd *** password successful." ||echo "Set pptpd *** 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 <