pptp ××× 原理与安装配置
   
在介绍 pptp ×××之前我们先来了解一下隧道技术。
隧道技术的基本过程是在源局域网与公网的接口处将数据 (可以是ISO 七层模型中的数据链路层或网络层数据)作为负载封装在一种可以在公网上传输的数据格式中,在目的局域网与公网的接口处将数据解封装,取出负载。被封装的数据包在互联网上传递时所经过的逻辑路径被称为“隧道”。
目前 ×××隧道协议有4种:点到点隧道协议PPTP、第二层隧道协议L2TP、网络层隧道协议IPSec以及SOCKS v5,我们这里只介绍点到点隧道协议PPTP。
 
一、PPTP协议原理
PPTP使用一个 TCP连接对隧道进行维护,使用通用路由封装(GRE)技术把数据封装成PPP数据桢通过隧道传送。可以对封装PPP桢中的负载数据进行加密或压缩。
下边简单描述 PPTP 过程中涉及的封装和解封步骤。
1.数据封装于 IP(或IPX和NetBEUI)封包中。
2.该 IP(或IPX和NetBEUI)封包封装在PPP帧中。
3.该 PPP 帧封装在GRE 帧中(并加密)。
4.该 GRE 帧封装在IP 封包中。
解封
1.移除 IP 包头。
2.移除 GRE 包头(解密过程)。GRE负载中是一个PPP帧。
3.移除 PPP 包头。
4.将该 IP(或IPX和NetBEUI)封包路由到其最终的目的地。
MPPE将通过由 MS-CHAP、MS-CHAP v2或EAP-TLS身份验证过程所生成的加密密钥对PPP帧进行加密。为对PPP帧中所包含的有效数据进行加密,虚拟专用网络客户端必须使用MS-CHAP、MS-CHAP v2或EAP-TLS身份验证协议。PPTP将利用底层PPP加密功能并直接对原先经过加密的PPP帧进行封装。
PPTP协议将控制包与数据包分开,控制包采用 TCP控制,客户端连接到×××服务器TCP1723端口,用于控制和管理×××隧道的功能。;数据包部分先封装在PPP协议中,然后封装到GRE V2协议中,最后封装到IP协议中传送。
 
  因业务需要,公司员工需要通过 ×××访问国外网站,便有了以下安装实例。
二、PPTP ×××安装前的准备
    环境: CentOS release 5.4 (Final) x86_64
  协议: GRE PPTP
    端口: PPTP /TCP/1723(服务端), GRE/TCP/47
    加密: MPPE(微软)
认证:MS-CHAP v2
服务: pptpd
软件包:
(1)        ppp-2.4.4-14.1.rhel5.x86_64.rpm
 PPTP需要 PPP的支持,一般情况下linux系统都已安装有PPP软件包,最好安装较新的ppp软件包,用Uvh这个参数来更新系统的PPP组件。也可以用yum –y instll ppp命令安装。
(2)        pptpd-1.3.4-2.rhel5.x86_64.rpm (pptpd服务软件 )
(3)        dkms-2.0.17.5-1.noarch.rpm  CentOS5x/RHEL5x(内核支持 mppe)不用安装
   DKMS全称是 Dynamic Kernel Module Support,它可以帮我们维护内核外的这些驱动程序,在内核版本变动之后可以自动重新生成新的模块。
(4)        kernel_ppp_mppe-1.0.2-3dkms.noarch(MPPE的内核补丁 ),CentOS5x/RHEL5x(内核支持mppe)不用安装
(5)        pptp-release-4-6.rhel5.noarch.rpm  pptpd yum仓库包,安装后可用yum –y install pptpd命令来安装pptpd.
下载地址:
http://poptop.sourceforge.net/yum/beta/rhel5/i386/dkms-2.0.17.5-1.noarch.rpm
http://poptop.sourceforge.net/yum/beta/rhel5/x86_64/ppp-2.4.4-14.1.rhel5.x86_64.rpm
http://poptop.sourceforge.net/yum/beta/rhel5/x86_64/pptpd-1.3.4-2.rhel5.x86_64.rpm
http://poptop.sourceforge.net/yum/beta/rhel5/i386/pptp-release-4-6.rhel5.noarch.rpm
  我们这里是 64位系统,如果是32位系统请下载相应的软件包。
  三、pptp ××× 安装
      1.下载把所需的软件包,我们这里把软件下载到 /***soft目录
      2.安装软件包
              rpm -Uvh ppp-2.4.4-14.1.rhel5.x86_64.rpm
     rpm -ivh pptpd-1.3.4-2.rhel5.x86_64.rpm
     rpm -ivh dkms-2.0.17.5-1.noarch.rpm (可以不安装)
  3 .查看内核是否加载 mppe模块 .
        (1)lsmod |grep ppp 默认情况下不会自动加载,所以命令执行后没有返回结果。
        (2)modprobe ppp-compress-18 手动加载 mppe模块
   (3)再次查看mppe模块是否加载
          lsmod |grep ppp
               ppp_mppe           39881 0
  ppp_generic         62689 1 ppp_mppe
 slhc                39745 1 ppp_generic
       出现上面情况说明已ppp模块和 mppe加载成功
       
  四、PPTP服务配置
    1. 修改主配置文件 /etc/pptpd.conf
               vim /etc/pptpd.conf
               ppp /usr/sbin/pppd
option /etc/ppp/options.pptpd
   第一句指 pppd服务在哪里,第二句是指pptpd的参数配置文件的位置。
     
   在文件最后行添加以下两行:
             localip 100.100.100.1
  remoteip 192.168.100.100-254
      Localip指本地的地址,就是客户端要连接的×××服务器的地址,可以是虚拟地址,可以与remoteip地址同段或异段。
remoteip要给客户端分配地址的范围 (如果地址不连续,可以用逗号隔开)。
2.修改/etc/ppp/options.pptpd参数配置文件
vim /etc/ppp/options.pptpd
             name ***server
   开启 Authentication,默认是注释掉的,是指是否开启身份认证,必须的。
name 后面是 ×××服务器的名称,默认是pptpd,
     
            ms-dns 8.8.8.8
  ms-dns 8.8.4.4
添加 DNS地址,我们用的是google的DNS.
 
     refuse-pap     拒绝pap身份验证
refuse-chap   拒绝 chap身份验证
refuse-mschap    拒绝 mschap身份验证
require-mschap-v2 使用 mschap-v2身份验证
require-mppe-128  使用 128-bit MPPE 加密
 
 
  3.修改/etc/ppp/chap-secrets用户账号文件 
          vim /etc/ppp/chap-secrets
              # client        server secret                  IP addresses
"test001"        ***server "test"   *
     Client 栏位指的是用户名,server指×××服务器名称,要与/etc/ppp/options.pptpd文件里name 后面的×××服务器名称一样。Secret是指密码,IP addresses 是指客户端用哪个IP访问,*号表示随机分配。 
      4.网络和 iptable设置
                  因为要通过 ×××服务器上网,所以要开启ip_forward转发功能和伪装IP以及开启相关协议端口. 如果要访问×××服务器的内部局域网的话,要用route add命令添加路由。
(1)    开启转发功能
echo " net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
(2)    让转发功能立即生效
sysctl –p
(3)    伪装 IP
iptables -t nat -A POSTROUTING –p tcp –s 192.168.100.0/24 -j SNAT –to-source XX.XX.XX.XX
     XX.XX.XX.XX为 ×××服务器外网IP.
(4)    开启相关协议端口
iptables -A INPUT -p udp --dport 53 -j ACCEPT
    iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 1723 -j ACCEP
iptables -A INPUT -p tcp --dport 80 -j ACCEP
iptables -A INPUT -p gre -j ACCEPT 
     service iptables save
                 service iptables restart
       
        5. 启动 pptpd服务
    service pptpd start 启动
    service pptpd stop 停止,所有的会话连接都会丢失。
    service pptpd restart 重启服务,现在会话连接不会丢失。
       6. 查看 pptpd服务是否启动
           netstat –an |grep 1723
 
   五.测试
 1.在 window 客户端建立一个×××连接.
      IP地址为 ×××服务器地址,输入用户和密码后连接。(具体操作略过)
 2.查看连接
  在命令行运行 ipconfig/all命令后,会多出一个PPP连接来,这样就连接到××× 服务器了
3. 在 ×××服务器端,运行ifconfig后,也会多出一个PPP连接。
4. 为了方便排除连接故障,可以在 /etc/pptpd.conf 主配置文件里开启debug和logwtmp选项,这两个选项会把客户端连接情况记录在/var/log/message里面。
 
  六、其它命令和技巧
1. 连接 (linux下有效)
      pppd call  tunnelname   
     tunnelname为用 ifconfig查看到的PPP连接名称。
2.断开所有 PPP连接
  killall pppd
 3.断开指定ppp连接
ps –ef |grep pptpd
这样会查出很多进程来,根据客户端外网 IP地址找到对应的进程号,然后kill掉 就行了。
4.添加 ×××用户账号
   ***user add  ***user  ***passwd
5.删除 ×××用户账号
***user  del  ***user
 
  七、安装 linux ××× 客户端
              环境:CentOS release 5.4 (Final) i686 i686 i386
 软件包: ppp-2.4.4-2.el5(默认已安装), libpcap-0.9.4-14.el5(默认已安装) pptp-1.7.2-3.rhel5.i386.rpm(下载地址http://pptpclient.sourceforge.net/)
1.安装软件包
   rpm –ivh pptp-1.7.2-3.rhel5.i386.rpm
2.建立×××连接通道
 #pptpsetup --create ***tunnel --server 100.100.100.1 --username test001 --password test --encrypt –start
   ***tunnel 通道名称
 --server 100.100.100.1 指定×××服务器地址
 --username test001     指定用户名
 --password test        指定密码
 --encrypt             启用加密
 刚才建立的连接用户和密码信息会自动添加到/etc/ppp/chap-secrets文件中,并且在/etc/ppp/peers目录下产生一个***tunnel文件,文件内容如下:
  cat /etc/ppp/peers/***tunnel
 # written by pptpsetup
pty "pptp 100.100.100.1 --nolaunchpppd"
lock
noauth
nobsdcomp
nodeflate
name ***1
remotename ***tunnel
ipparam ***tunnel
require-mppe-128
         执行命令pppd call ***tunnel,就可以连接到 ××× Server了。