作者:Nanu ( Comsenz )
首发:http://www.discuz.net
如需转载请注明作者,谢谢!
晚上闲来无事,突然想如果能在公司安全的连接到家里的内网环境那很多工作就会很方便,而且很多资料的 共享以及实验的调试也会很方便。于是想到了在 Linux 上用 PPTP 假设一个 VPN Server。下面就是我的手记。按照我的习惯,还是先对 PPTP 进行一些基础了解再开始安装 PPTP,这样会让自己明白一些,各位不要嫌麻烦,呵呵。当然,也可以直接跳过 PPTP 协议介绍直接进入安装阶段:)
一、PPTP 协议介绍
1、PPTP 简介
PPTP: Point to Point Tunneling Protocol
点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术。通过该协议,远程用户能够通过 Microsoft Windows NT 工作站、Windows 95 和 Windows 98 操作系统以及其它装有点对点协议的系统安全访问公司网络,并能拨号连入本地 ISP,通过 Internet 安全链接到公司网络。
PPTP 可以用于在 IP 网络上建立 PPP 会话隧道。在这种配置下,PPTP 隧道和 PPP 会话运行在两个相同的机器上,呼叫方充当 PNS。PPTP 使用客户机-服务器结构来分离当前网络访问服务器具备的一些功能并支持虚拟专用网络。PPTP 作为一个呼叫控制和管理协议,它允许服务器控制来自 PSTN 或 ISDN 的拨入电路交换呼叫访问并初始化外部电路交换连接。
PPTP 只能通过 PAC 和 PNS 来实施,其它系统没有必要知道 PPTP。拨号网络可与 PAC 相连接而无需知道 PPTP。标准的 PPP 客户机软件可继续在隧道 PPP 链接上操作。
PPTP 使用 GRE 的扩展版本来传输用户 PPP 包。这些增强允许为在 PAC 和 PNS 之间传输用户数据的隧道提供低层拥塞控制和流控制。这种机制允许高效使用隧道可用带宽并且避免了不必要的重发和缓冲区溢出。PPTP 没有规定特定的算法用于低层控制,但它确实定义了一些通信参数来支持这样的算法工作。
2、协议(报文)结构
16bit
32 bit
Length
PPTP Message Type
Magic Cookie
Control Message Type
Reserved 0
Protocol Version
Reserved 1
Framing Capability
Bearing Capability
Maximum Channels
Firmware Revision
Host Name (64 Octets)
Vendor String (64 Octets)
●Length: 该 PPTP 信息的八位总长,包括整个 PPTP 头。
●PPTP Message Type: 信息类型。可能值有:1、控制信息;2、管理信息。
●Magic Cookie: Magic Cookie 以连续的 0x1A2B3C4D 进行发送,其基本目的是确保接收端与 TCP数据流间的正确同步运行。
●Control Message Type: 可能值有:"1" 开始-控制-链接-请求(Start-Control-Connection-Request);"2" 开始-控制-链接-答复(Start-Control-Connection-Reply);"3" 停止-控制-链接-请求(Stop-Control-Connection-Request);"4" 停止-控制-链接-答复(Stop-Control-Connection-Reply);"5" 回应-请求(Echo-Request);"6" 回应-答复(Echo-Reply);
●Call Management: 可能值有:"1" 传出-呼叫-请求(Outgoing-Call-Request);"2" 传出-呼叫-答复(Outgoing-Call-Reply);"3" 传入-呼叫-请求(Incoming-Call-Request);"4" 传入-呼叫-答复(Incoming-Call-Reply);"5" 传入-呼叫-连接(Incoming-Call-Connected);"6" 呼叫-清除-请求(Call-Clear-Request);"7" 呼叫-断开连接-通告(Call-Disconnect-Notify);"8" 广域网-错误-通告(WAN-Error-Notify)。
●PPP Session Control: 设置-链路-信息(Set-Link-Info)。
●Reserved 0 & 1: 必须设置为0。
●Protocol Version: PPTP版本号。
●Framing Capabilities: 指出帧类型,该信息发送方可以提供:"1" 异步帧支持(Asynchronous Framing Supported);"2" 同步帧支持(Synchronous Framing Supported)。
Bearer Capabilities: 指出承载性能,该信息发送方可以提供:"1" 模拟访问支持(Analog Access Supported);"2" 数字访问支持(Digital access supported)。
●Maximum Channels: 该 PAC 可以支持的个人 PPP 会话总数。
●Firmware Revision: 若由 PAC 出发,则包括发出 PAC 时的固件修订本编号;若由 PNS 出发,则包括 PNS PPTP 驱动版本。
●Host Name: 包括发行的 PAC 或 PNS 的 DNS 名称。
●Vendor Name: 包括特定供应商字串,指当请求是由 PNS 提出时,使用的 PAC 类型或 PNS软件类型。
二、安装 PPTP Server
操作系统:CentOS 5.0/Red Hat Enterprise Linux AS 5 ( RHEL 5 )
安装 PPTP 需要 MPPE 和较高版本的 ppp ( > 2.4.3 ) 支持,不过 CentOS 5.0/RHEL 5 的 2.6.18 内核已经集成了 MPPE 和高版本的 ppp 。因此可以跳过安装配置 MPPE 和 ppp 的过程直接安装 PPTP。
如果需要检查 MPPE 是否存在可以使用以下命令:
shell> modprobe ppp-compress-18 && echo 'ok! MPPE was found !'
1、安装 pptpd
下载最新的 pptpd 源代码 ( 1.3.4 @ 2007-05-23 ):
http://sourceforge.net/project/showfiles.php?group_id=44827
将下载到的 pptpd 移动到 /usr/local/src 目录下。
加压缩源代码包:
shell> tar xzvf pptpd-1.3.4.tar.gz
shell> cd pptpd-1.3.4
编译安装:
注意:可能需要 libcap、libcap-devel RPM 包支持,如果没有请安装 libcap、libcap-devel RPM 包!
shell> ./configure --prefix=/usr/local/pptpd --enable-bcrelay --with-libwrap
shell> make
shell> make install
2、配置 PPTP
编译安装完成后,首先需要手工建立一些目录以及复制原始的 pptpd 配置文件:
shell> mkdir /usr/local/pptpd/etc
shell> cp /usr/local/src/pptpd-1.3.4/samples/options.pptpd /usr/local/pptpd/etc/
shell> cp /usr/local/src/pptpd-1.3.4/samples/pptpd.conf /usr/local/pptpd/etc/
上面 cp (复制)的两个文件是 pptpd 的两个配置文件。
pptpd.conf 是 pptpd 的基本配置文件;
options.pptpd 是 pptpd 的扩展功能属性配置文件。
对 pptpd.conf 进行设置:
shell> vi /usr/local/pptpd/etc/pptpd.conf
以下是我的配置文件:
# pptpd.conf
option /usr/local/pptpd/etc/options.pptpd
debug
stimeout 30
localip 10.0.0.254
remoteip 10.0.0.200-210
说明:
option /usr/local/pptpd/etc/options.pptpd
指定 pptpd 扩展属性配置文件 options.pptpd 的位置。
debug
开启调试模式,有关 pptpd 的信息和错误都会记录在 /var/logs/message 中,方便排错和调试。
stimeout 30
设置客户端连接 pptpd server 时的最长连接等待时间(连接超时时间),30 秒。
localip 10.0.0.254
pptpd server 所在服务器的 IP 地址,可以设置为服务器上绑定的任意一个 IP 地址。
remoteip 10.0.0.200-210
设置客户端连接到 pptpd server 后可供分配的 IP 地址范围( 10.0.0.200 - 10.0.0.210 ),可以这样设置:
10.0.0.200-208,10.0.0.209,10.0.0.210
效果是一样的。
接下来对 options.pptpd 进行配置:
shell> vi /usr/local/pptpd/etc/options.pptpd
以下是我的配置文件:
# options.pptpd
name Nanu-VPN
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 202.106.46.151
ms-dns 202.106.0.20
proxyarp
debug
lock
nobsdcomp
novj
novjccomp
nologfd
说明:
name Nanu-VPN
pptpd server 的名称。
refuse-pap
拒绝 pap 身份验证模式。
refuse-chap
拒绝 chap 身份验证模式。
refuse-mschap
拒绝 mschap 身份验证模式。
require-mschap-v2
在端点进行连接握手时需要使用微软的 mschap-v2 进行自身验证。
require-mppe-128
MPPE 模块使用 128 位加密。
ms-dns 202.106.46.151
ms-dns 202.106.0.20
ppp 为 Windows 客户端提供 DNS 服务器 IP 地址,第一个 ms-dns 为 DNS Master,第二个为 DNS Slave。
proxyarp
建立 ARP 代理键值。
debug
开启调试模式,相关信息同样记录在 /var/logs/message 中。
lock
锁定客户端 PTY 设备文件。
nobsdcomp
禁用 BSD 压缩模式。
novj
novjccomp
禁用 Van Jacobson 压缩模式。
nologfd
禁止将错误信息记录到标准错误输出设备(stderr)。
OK,配置好上面的两个文件后,我们开始添加 pptpd server 连接帐户。
pptpd server 连接帐户控制文件位于:/etc/ppp/chap-secrets
chap-secrets 文件是有格式的,文件中每一行为一个客户端帐户,而一行又分为 4 段(用空格或者 TAB 分开),这 4 段从左到邮分别为:用户名、服务器名称*、密码、客户端分配到的 IP 地址。
*注意:
1、服务器名称必须和 pptpd.conf 中 name 处设置的名称一致,否则登录验证无法通过;
2、密码以明文填写,不需进行加密。
下面我们添加一个客户端帐户:
shell> vi /etc/ppp/chap-secrets
# PPTP User Accounts
# username server_name password ip
vpn1 Nanu-VPN "123456" 10.0.0.201
这样就配置好了一个连接帐户。
三、启动 pptpd server
shell> /usr/local/pptpd/sbin/pptpd --conf /usr/local/pptpd/etc/pptpd.conf --option /usr/local/pptpd/etc/options.pptpd
检查 pptpd server 是否启动成功:
shell> netstat -nlp
如果看到有进程 tcp 1723 端口监听就说明 pptpd server 已经启动成功了!
注意:
1、服务器防火墙必须对外开放允许 TCP 1723 端口的连接请求!
2、如果 pptpd server 位于网关或者其他前置设备之后,则必须在相应设备上开启 PPTP 穿越!
四、测试连接
在 Windows 2000/XP/2003/Vista 中新建一个 VPN 连接,填写相应的 pptpd server IP 地址、用户名、密码进行连接测试。