【IT168 专稿】前面笔者介绍了PPP协议以及PPTP协议简介( 点击),下面笔者将在一个真实的环境中介绍基于PPTP技术的Linux ××× 服务器和客户端连接。首先建立配置Linux 下的PPTP 服务器。图1是一个理想的PPTP 网络拓扑结构。
278533.JPG
图1一个理想的PPTP网络拓扑结构

    PPTPD(Point-to-Point Tunneling Protocol Daemon)是×××(Virtual Private Network)服务器,PPTP(Point-to-Point Tunneling Protocol)是×××客户端。PPTPD和PPTP都是通过PPP(Point to Point Protocol)来实现×××功能的。MPPE模块是用来支持Linux与Windows之间连接的。如果不需要Windows电脑参与连接,则不需要可以这安装MPPE模块。   PPTPD、PPTP和MPPE Module一起统称Poptop,相关网站为: [url]http://www.poptop.org[/url]。 Poptop官方网站上的定义是The PPTP Server for Linux,就是利用PPTP(Point to Point Tunneling Protocol,点到点隧道协议)通过Internet访问×××(Virtual Private Network,虚拟局域网),网站提供 软件下载( [url]http://sourceforge.net/projects/poptop/[/url] ) 和文档( [url]http://poptop.sourceforge.net/dox/[/url] )等链接。Poptop软件的难度主要在它的配置文件。只要对配置文件有足够了解,再参考Poptop的日志文件,就要在安装过程种解决各种问题。
一、 在Linux2.4内核下安装配置 PPTP服务器
    以Red Hat Linux 9.0为例,官方网站: [url]http://www.poptop.org/[/url]  ,下载地址: [url]http://sourceforge.net/projects/poptop/[/url]

     1. 下载升级系统ppp软件包

#rpm -e rp-ppoe  #删除冲突软件包#
#rpm -e wvdial   #删除冲突软件包#
#rpm -e ppp    #删除冲突软件包#
#wget [url]http://puzzle.dl.sourceforge.net/sourceforge/poptop/ppp-2.4.3-5.rhl9.i386.rpm[/url]
#rpm -Uvh ppp-2.4.3-5.rhl9.i386  #升级冲突软件包#

     2. 下载安装Poptop软件包

#wget [url]http://www.city-fan.org/ftp/contrib/drivers/pptp/pptpd-1.3.0-0.i386.rpm[/url]
#rpm -ivh pptpd-1.3.0-0.i386.rpm
3. 下载安装加密软件
#wget [url]http://jaist.dl.sourceforge.net/sourceforge/poptop/kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm[/url] 
#rpm -ivh  kernel_ppp_mppe-1.0.2-3dkms.noarch
#wget [url]http://jaist.dl.sourceforge.net/sourceforge/poptop/dkms-2.0.10-1.noarch.rpm[/url]
#rpm -ivh dkms-2.0.2-1.noarch.rpm

    说明:Microsoft 点对点加密 (MPPE) 对基于点对点协议 (PPP) 的拨号连接或点对点隧道协议 (PPTP) 虚拟专用网 (×××) 连接中的数据进行加密。支持 128 位密钥(强)、56 位密钥以及 40 位密钥(标准)MPPE 加密方案。MPPE 为 ××× 客户端和 ××× 服务器之间 PPTP 连接提供数据 安全性。注意:MPPE 需要 Microsoft 质询握手身份验证协议 (MS-CHAP)、Microsoft 质询握手身份验证协议版本 2 (MS-CHAP v2) 或可扩展的身份验证协议-传输层安全性 (EAP-TLS) 身份验证过程生成的加密密钥。
4. 用以下命令检查内核MPPE补丁是否安装成功
[root@host root]# lsmod|more
Module                  Size  Used by    Tainted: P
ppp_mppe               13592   2  (autoclean)
ppp_async               9440   1  (autoclean)
ppp_generic            24572   3  (autoclean) [ppp_mppe ppp_async]
slhc                    6740   0  (autoclean) [ppp_generic]
es1371                 30792   0  (autoclean)
ac97_codec             13640   0  (autoclean) [es1371]
gameport                3364   0  (autoclean) [es1371]
soundcore               6404   4  (autoclean) [es1371]
parport_pc             19076   1  (autoclean)
lp                      8996   0  (autoclean)
parport                37056   1  (autoclean) [parport_pc lp]
autofs                 13268   0  (autoclean) (unused)
8139too                18088   1
mii                     3976   0  [8139too]
ide-scsi               12208   0
scsi_mod              107160   1  [ide-scsi]
ide-cd                 35708   0
cdrom                  33728   0  [ide-cd]
nls_cp936             124956   1  (autoclean)
nls_cp437               5116   1  (autoclean)
vfat                   13004   1  (autoclean)

    如果出现黑体字部分表示MPPE加密成功。lsmod 即list  modules,对每行而言,第一列是模块名称;第二列是模块大小;第三列是用量计数。lsmod命令用来列出当前系统加载的模块,同时也可以当作察看模块硬件浏览器。从以上列表我们可以看到那些设备的 驱动程序已经加载。如果后面为unused,则表示该模块当前没在使用。
5. 检查PPP是否支持MPPE

    用以下命令检查PPP是否支持MPPE:
#strings '/usr/sbin/pppd' |grep -i mppe | wc --lines

    如果以上命令输出为“0”则表示不支持;输出为“30”或更大的数字就表示支持。
 
6. 修改配置文件

    这里需要修改如下3个配置文件/etc/pptpd.conf、/etc/ppp/options.pptpd 、/etc/ppp/chap-secrets 。 如果你对这3个配置文件中的各个参数不太了解的话,可以到/usr/share/doc/pptpd-1.3.0/samples里面,这个目录存放了相关的sample文件可以阅读。
 
 /etc/pptpd.conf 主配置文件

添加如下内容,确定本地××× 服务器的IP地址和客户端登录后分配的IP地址范围。
debug  #把所有的debug信息写入系统日志/var/log/messages
option /etc/ppp/options.pptpd
localip 192.168.0.254 #本地××× 服务器的IP
Logwtmp #使用/var/log/wtmp记录客户连接和断开
remoteip 192.168.1.1-254  #客户端被分配的IP范围
注意:为了 安全性起见,localip和remoteip尽量不要同一个网段。
 options.pptpd文件
编辑/etc/ppp/options.pptpd配置文件,替换成如下内容:
 
auth #需要使用/etc/ppp/chap-secrets文件来验证#
lock #锁定PTY设备文件#
debug
Proxyarp  #启动ARP代理,如果分配给客户端的IP地址与内网 网卡在一个子网就需要启用ARP代理。#
name pptpd   #×××服务器的名字#
multilink
refuse-pap     #拒绝pap身份验证#
refuse-chap   #拒绝chap身份验证#
refuse-mschap   #拒绝mschap身份验证#
require-mschap-v2 #注意在采用mschap-v2身份验证方式时可以同时使用MPPE进行加密 #
#require-mppe-128 #使用 128-bit MPPE 加密#
ms-wins 192.168.1.2 #在 网络邻居中看到的机器的IP填写到这里#
ms-dns 192.168.1.2 #DNS服务器地址 #
dump 
logfile /var/log/pptpd.log  #日志存放的路径#

    相关说明:PAP(口令验证协议)是一种简单的明文验证方式。NAS要求用户提供用户名和口令,PAP以明文方式返回用户信息。很明显,这种验证方式的安全性较差,第三方可以很容易的获取被传送的用户名和口令,并利用这些信息与NAS建立连接获取NAS提供的所有资源。所以,一旦用户密码被第三方窃取,PAP无法提供避免受到第三方***的保障措施。

    CHAP(挑战-握手验证协议)是一种加密的验证方式,能够避免建立连接时传送用户的真实密码。NAS向远程用户发送一个挑战口令(challenge),其中包括会话ID和一个任意生成的挑战字符串(arbitrary challengestring)。远程客户必须使用MD5单向哈希算法(one-wayhashingalgorithm)返回用户名和加密的挑战口令,会话ID以及用户口令,其中用户名以非哈希方式发送。CHAP对PAP进行了改进,不再直接通过链路发送明文口令,而是使用挑战口令以哈希算法对口令进行加密。因为服务器端存有客户的明文口令,所以服务器可以重复客户端进行的操作,并将结果与用户返回的口令进行对照。CHAP为每一次验证任意生成一个挑战字符串来防止受到再现***(replay attack).在整个连接过程中,CHAP将不定时的向客户端重复发送挑战口令,从而避免第3方冒充远程客户(remoteclient impersonation)进行***。如果已经使用 CHAP 验证连接,则不能使用 Microsoft 点对点加密 (MPPE)。

    mschap 即Microsoft 创建 的MS-CHAP(微软挑战-握手验证协议),是为了对远程 Windows 工作站进行身份验证,同时集成LAN 用户所熟悉的功能,以及用于 Windows 网络的散列算法。与 CHAP 相似,MS-CHAP 使用质询响应机制来对不发送任何密码的连接进行身份验证。远程客户必须返回用户名以及经过MD4哈希算法加密的挑战字符串,会话ID和用户口令的MD4哈希值。采用这种方式服务器端将只 存储经过哈希算法加密的用户口令而不是明文口令,这样就能够提供进一步的安全保障。此外,MS-CHAP同样支持附加的错误编码,包括口令过期编码以及允许用户自己修改口令的加密的客户-服务器(client-server)附加信息。使用MS-CHAP,客户端和NAS双方各自生成一个用于随后数据加密的起始密钥。MS-CHAP使用基于MPPE的数据加密,这一点非常重要,可以解释为什么启用基于MPPE的数据加密时必须进行MS-CHAP验证。在第2阶段PPP链路配置阶段,NAS收集验证数据然后对照自己的数据库或中央验证数据库服务器(位于NT主域控制器或远程验证用户拨入服务器)验证数据的有效性。

    MS-CHAP v2(Microsoft 质询握手身份验证协议版本 2)MS-CHAP v2 可以提供交互身份验证、生成 Microsoft 点对点加密 (MPPE) 的更强初始数据加密密钥,以及在发送和接收数据时使用不同的加密密钥。为降低更改密码时密码泄漏的风险,将不再支持较旧的 MS-CHAP 密码更改方法。因为 MS-CHAP v2 比 MS-CHAP 更加安全,所以对于所有连接,它将优先 MS-CHAP (如果已启用) 使用。运行 Windows XP、Windows 2000、Windows 98、Windows Millennium Edition 和 Windows NT 4.0 的计算机支持 MS-CHAP v2。运行 Windows 95 的计算机仅支持 MS-CHAP v2 进行 ××× 连接,而不支持其进行拨号连接。 注意:
    MS-CHAP v2 是一种交互身份验证协议,即客户端和服务器都需证明它们知道用户的密码。首先, 远程访问服务器通过向客户端发送质询,请求远程访问客户端提供证据。然后,远程访问客户端通过向远程访问服务器发回质询的方式,请求其提供证据。如果服务器无法正确回答客户端的质询,证实它知道用户的密码,则客户端中断连接。如果没有交互身份验证,远程访问客户端将无法建立与未经授权的远程访问服务器的连接。
 chap-secrets文件
编辑/etc/chap-secrets配置文件,添加如下内容:
# client server secret IP addresses
"test " *  "test"       *

    上面第二行代码的四项内容分别对应第一行中的四项。“test”是Client端的×××用户名;“server”对应的是×××服务器的名字,该名字必须和/etc/ppp/options.pptpd文件中指明的一样,或者设置成“*”号来表示自动识别服务器;“secret”对应的是登录密码;“IP addresses”对应的是可以拨入的客户端IP地址,如果不需要做特别限制,可以将其设置为“*”号。
7. 启动pptpd服务器

使用命令启动pptpd服务器:
#service pptpd start
8. 使用命令查看pptpd服务进程、端口和接口

使用ps命令检查pptpd进程:
#ps -ef | grep pptpd
root      1744     1  0 20:52 ?        00:00:00 /usr/sbin/pptpd
root      1940  1868  0 21:01 pts/0    00:00:00 grep pptpd
使用netstat命令检查pptpd运行的端口:
# netstat -nutap | grep pptpd
tcp        0      0 0.0.0.0:1723     0.0.0.0:*         LISTEN      1744/pptpd
使用ifconfig命令查看ppp0接口
# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:50:FC:56:75:F5
          inet addr:192.168.1.18  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:393 errors:0 dropped:0 overruns:0 frame:0
          TX packets:142 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:35846 (35.0 Kb)  TX bytes:13545 (13.2 Kb)
          Interrupt:12 Base address:0xc000
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:700 (700.0 b)  TX bytes:700 (700.0 b)
ppp0      Link encap:Point-to-Point Protocol
          inet addr:192.168.0.3  P-t-P:192.168.1.128  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1396  Metric:1
          RX packets:68 errors:0 dropped:0 overruns:0 frame:0
          TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:5768 (5.6 Kb)  TX bytes:354 (354.0 b)

    如果出现黑体字部分表示一切正常,那么Linux一个基本PPTP ×××服务器的设置就初步了,下面对其进行MPPE加密。
9. 打开防火墙设置IP伪装转发

    设置了IP伪装转发,通过×××连接上来的远程计算机才能互相ping通,实现像局域网那样的共享。用下面的命令进行设置:
#echo 1 > /proc/sys/net/ipv4/ip_forward
#/sbin/iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
#/sbin/iptables -A INPUT -p tcp --dport 47 -j ACCEPT
#/sbin/iptables -A INPUT -p gre -j ACCEPT
10. 如果希望PPTPD服务器每次启动都能自动运行,可以用ntsysv设置。以root权限运行命令:
#ntsysv
 
278568.jpg
图2 启动PPTPD服务器自动加载

    打开如图所示的窗口,在pptpd服务选项加上*(用空格键),然后重新启动系统,这样系统会启动PPTPD服务。
 
二、 在Linux2.6 内核下安装配置 PPTP服务器
    以RHEL 4.0为例。这里内核是kernel2.6.9-5.EL,所用安装 软件组如下:
  dkms-2.0.6-1.noarch.rpm
  kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
  ppp-2.4.3-5.rhel4.i386.rpm
  pptpd-1.3.0-0.i386.rpm
 
   1.PPTP需要PPP支持,虽然2.6内核系统本身有PPP功能,但它并不支持MPPE,所以需要更新系统的PPP组件,下载ppp-2.4.3-5.rhel4.i386.rpm安装命令如下:
  # rpm -Uvh ppp-2.4.3-5.rhel4.i386.rpm

    2.安装内核MPPE(Microsoft Point to Point Encryption,微软点对点加密)补丁,安装命令如下:
  #rpm –ivh dkms-2.0.6-1.noarch.rpm
  #rpm –ivh kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
  用以下命令检查内核MPPE补丁是否安装成功,MPPE module可否载如:
  #modprobe ppp-compress-18 && echo success

    3.安装pptpd,命令如下:
  #rpm –ivh pptpd-1.3.0-0.i386.rpm

   4.用以下命令检查PPP是否支持MPPE:
  #strings '/usr/sbin/pppd'|grep -i mppe|wc --lines
  46 <如果以上命令输出为“0”则表示不支持;输出为“30”或更大的数字就表示支持,我这里为46>。
    其它部分同上。这里就不赘述了。另外如果您的内核版本高于2.6.15(含)。可以直接编译内核。cd /usr/src/linux
make menuconfig
Device Drivers -> Network device support -> PPP MPPE compression (M)。如图3。
 
278581.JPG
图3 选择MPPE加密

    make modules;make modules_install

    下载并安装下列软件:

   • ppp-2.4.3-5.i386.rpm
    • pptpd-1.3.3-1.i386.rpm

    即可。其它部分同上。这里就不赘述了。
   到此为止Linux PPTP 服务器配置完成,下篇笔者将介绍Windows客户端配置  和Linux客户端如何连接到Linux PPTP服务器。