1、1搭建 VPN 的目的如下图 1 所示,上面部分是总部网络 150.0.1.0/24,网络边界是一台 RedHat 9.0,使用 Netfilter/Iptables防火墙,准备在这台服务器上安装 PPTP VPN 服务,这样分支机构就可通过 PPTP VPN 与其实现站点到站点的 VPN 连接,这里的分支机构是下方的 192.168.254.0/24 网络。两方都是通过 ADSL 接入因特网的,我们现在要通过 PPTP VPN 把分支网络与总部网络连接起来,使它们就像位于同一个局域网一样,这样分支机构就可以通过 VPN 连接总部的服务器,反之亦然。2PPTP VPN 的基本原理PPTP VP
2、N 本质上是虚拟的点对点链路,它先把到达远方内网的数据包打包成 PPP 帧,然后再对这些PPP 帧进行二次封装,以便于能够在其他物理链路上进行传送。 PPTP VPN 有控制信道和数据信道之分,控制信道连接到 VPN 报务器的 TCP1723 端口,起着控制和管理 VPN 隧道的功能,数据信道是传送 PPP帧的信道,关于 PPTP 数据帧的封装过程如图所示:在打包 PPP 帧的过程中,将对 PPP 数据包进行加密,为了取得最大的安全性,我们这里将使用 MPPE加密和 MSCHAPv2 身份验证方法。下面我们来看看具体配置过程。注:这里的 PPTP 只是一种协议,P PTP: Point to
3、Point Tunneling Protocol - 点 到 点 隧 道 协 议 。 读 者 不要 被 他 迷 惑 了 。 实 现 VPN 有 多 种 协 议 可 以 选 择 , 本 文 讲 述 的 是 使 用 PPTP 协 议 来 实 现 VPN, 即 :PPTP VPN.3安装和配置 PPTP VPN 服务器1)下载必要的安装包Poptop 环境需要软件包:1.Dkms(个人理解这个工具不是必需的,只是可以优化某些东西,后面有具体的说明)2.kernel_ppp_mppe MPPE (Microsoft Point to Point Encryption,微软点对点加密)3.ppp (Po
4、int-to-Point Protocol,点到点协议)4.pptpd(架设 pptpd vpn 服务器使用的软件,可以这么理解,就是因为使用了 pptpd,所有此种方法架设的 vpn 才称之为 pptpd vpn)1、 查看当前 dkms 版本(对于 rpm 命令的用法请读者自行查阅)如果当前没有安装 dkms 则显示:package dkms is not installed下载 dkms-2.0.17.5-1.noarch.rpm, (个人理解这个工具不是必需的,只是可以优化某些东西) ,安装方法:# rpm ivh dkms-2.0.17.5-1.noarch.rpm注:Oikawa
5、等人在 1996 年提出一种与 LKM 类似的动态核心模块(DKMs)技术。与 LKM 一样,DKMs 以文件的形式存储并能在系统运行过程中动态地加载和卸载。DKMs 由一个用户层的 DKM 服务器来管理,并非由内核来管理。当核心需要某模块时,由 DKM 服务器负责把相应的 DKM 加载;当核心的内存资源紧缺时,由 DKM 服务器负责卸载一个没有被使用的 DKM。缺点是所有的 DKM 是存储在本地系统上的,占用了大量宝贵的存储空间。2、 查看 PPP 版本Linux 系统本身有 PPP 功能,但它并不一定支持 MPPE,用以下命令检查 PPP 版本再用下面的命令查询该版本的 PPP 是否支持
6、MPPE若结果显示“0”则表示不支持,而“30”或更大的数字就表示支持,如果不支持则需要更新系统的 PPP组件,下载 ppp-2.4.2_cvs_20030610-1.i386.rpm,安装命令如下:# rpm -Uvh ppp-2.4.2_cvs_20030610-1.i386.rpm3、 查看 pptpd 版本如果内核中未安装 pptpd 则显示:package pptpd is not installed此时需要下载 pptpd 并安装它,可以选择 pptpd-1.1.4-b4.i386.rpm,安装命令:# rpm ivh pptpd-1.1.4-b4.i386.rpm4、 确保 Li
7、nex 内核支持 MPPE 加密协议要使用 MPPE 加密,还需要内核支持,Linux 2.6.14 起 Linux 核心提供完整的 PPTP 支援包括自由版本的 MPPE 。查看内核版本可以使用命令:uname r,如果内核版本低于 2.6.14 则还要下载一个MPPE 内核补丁:kernel-mppe-2.4.20-8.i686.rpm ,安装命令如下:# rpm ivh kernel-mppe-2.4.20-8.i686.rpm安装之后可以检查 kernel MPPE 是否安装成功,输入如下命令:# modprobe ppp-compress-18 & echo “OK“ 如果输出 OK
8、 则表示安装成功2)修改配置文件1. 修改 modules.conf 文件 编辑/etc/modules.conf 配置文件,加入如下内容: alias net-pf-47 ip_gre注: 此配置文件在安装 MPPE 内核补丁后才会产生,内核版本高于 2.6.14 就不会有该文件(个人理解,正确性待定)2. 修改:/etc/pptpd.conf :PPTP 服务 PPTPD 运行时使用的配置文件debug-把所有 debug 信息记入系统日志/var/log/messagesoption /etc/ppp/options.pptpd-PPP 组件将使用的配置文件localip 221.6.1
9、5.150-分配给 VPN 服务器的地址,可以任意起remoteip 192.168.1.1-100-VPN 服务器分配给客户端的 IP 段,可以任意起3. 修改:/etc/ppp/options.pptpd就是上面/etc/pptpd.conf 中的 option 所指定的,它是 PPP 功能组件 pppd 将使用的配置文件,由于PPTP VPN 的加密和验证都与 PPP 相关,所以 PPTP 的加密和验证选项都将在这个配置文件中进行配置。auth-启用身份验证,为了安全,肯定需要进行身份验证debug-name cc3-自行设定的 VPN 服务器的名字,可以任意refuse-pap-拒绝
10、pap 身份验证refuse-chap-拒绝 chap 身份验证refuse-mschap-拒绝 mschap 身份验证refuse-eap -拒绝 eap 身份验证,这种方式本身不错,但这里不使用require-mschap-v2-为了最高的安全性,我们使用 mschap-v2 身份验证方法require-mppe-128-要求 128 位 MPPE 加密,还可以是 require-mppenomppe-stateful-无状态,有状态有 mppe-statefulms-dns 150.0.1.88-VPN 服务器的 DNS,存放在/etc/resolv.conf 中#ms-wins 150
11、.0.1.88-proxyarp-启用 ARP 代理,如果分配给客户端的 IP 与内网卡同一个子网logfile /var/log/pptpd.log-存放 pptpd 服务运行的的日志multilink-dump-lock-4. 修改:/etc/ppp/chap-secrets在这里配置能够连接到 VPN 服务器的用户和密码信息# Secrets for authentication using CHAP# client server secret IP addressesxyx * 123456 *# redhat-config-network will overwrite this pa
12、rt! (begin) # redhat-config-network will overwrite this part! (end) #“xyx”是 Client 端的 VPN 用户名;“server”对应的是 VPN 服务器的名字,该名字必须和/etc/ppp/options.pptpd 文件中指明的一样,或者设置成“*”号来表示自动识别服务器;“secret”对应的是登录密码;“IP addresses”对应的是可以拨入的客户端 IP 地址,如果不需要做特别限制,可以将其设置为“*”号5. 启动服务到此 VPN 的配置文件就全部配置完成了,此时 pptpd 服务还没有启动,必需启动后才能
13、被客户端连接相关命令如下:启动: service pptpd start停止: service pptpd stop重新启动: service pptpd restartpptpd 服务使用的端口是 1723,这个端口是系统固定分配的,可以通过查看该端口检查 pptpd 服务的运行情况,命令:netstat ntpl如果服务已经启动,会看到下面的内容tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN 24981/pptpd如果希望 pptpd 服务在每次服务器重启后自动开启,可以做下面的设置键入:ntsysv 出现如下内容,把 pptpd 服务选择后 OK 即可4设置
14、VPN 服务器的防火墙通过第三步我们已经把 VPN 服务器部署好了,这一步的目的是制定一些约束规则,以便我们可以控制哪些请求可以被 VPN 服务器处理,哪些请求需要被拒绝。即:设定防火墙的参数。Linux 下设定防火墙使用 iptables 命令,详细用法请参考Linux网 络 配 置 -iptables配 置 .doc设置防火墙的 net 表,目的是为了实现数据包的伪装及转发,从内网发出的包通过 VPN SERVER 伪装后变成由外网发出。iptables t nat F-清除 nat 表中所有规则 (视具体情况决定是否执行这一步)在 VPN 客户端成功拨号以后,本地网络的默认网关会变为 V
15、PN 服务器的 VPN 内网地址,这样会导致客户端只能够连接 VPN 服务器及其所在的内网,而不能访问互联网(很重要的一条,这条不配置会导致无法通过 VPN 访问外网,具体见 FAQ.1 中的现象描述) ;防火墙设置数据包转发伪装iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT -to (外网 IP)-这句话的意思是:对即将发送出去的数据包进行修改,对源地址是 192.168.0.0/24 的数据包,把源地址修改为 (外网 IP),iptables 中的规则在每次服务器重新启动后被清除,所以把这些规则加入到/etc/rc.loca
16、l,以便服务器启动后自动添加到 iptables中。只有设置了 IP 伪装转发,通过 VPN 连接上来的远程计算机才能互相 ping 通,实现像局域网那样的共享。用下面的命令进行设置:echo 1 /proc/sys/net/ipv4/ip_forward将 Linux 服务器的 1723 端口和 47 端口打开,并打开 GRE 协议,以便允许 VPN 连接iptables I INPUT p tcp dport 1723 j ACCESS-让防火墙方通目的端口是 1723 的 tcp 数据包iptables I INPUT p tcp dport 47 j ACCESS-让防火墙方通目的端口
17、是 47 的 tcp 数据包iptables I INPUT p gre j ACCESS-让防火墙方通 gre 协议的数据包5. 设置客户端客户端的设置很简单,这里就以 XP 为例简单说明一下。1. 在“网上邻居”点右键“属性”2. 选择“创建一个新的连接” , “下一步”后选择“连接到我的工作场所的网络”3. “下一步”选择“虚拟专用网络连接”4. “下一步”输入你希望的本链接的名字,可以任意5. “下一步”后,如果你已经有一个 VPN 得连接了,会出现下面的提示框,选择“不拨初始连接” 。如果你没有建立过 VPN 连接则不会有该界面,直接跳到第六步6. 在下面的界面里面输入 VPN 服务
18、器的地址7. 点“下一步” 、 “完成”后会出现连接提示,输入我们在/etc/ppp/chap-secrets 中设置的用户名和密码后点“连接”即向 VPN 服务器发起了登陆请求8. 连接成功后,点开右下角的本地连接,在详细信息里面可以看到6 FAQ1. VPN 登陆成功了,但是不能访问外网尝试做如下修改:在建立的 VPN 链接上右键属性,选择“网络”并选择“TCP/IP 协议”,点属性把下图的“在远程网络上使用默认网关”勾选去掉通过上述操作可以解决登陆 VPN 不能上外网的问题,但是这种方式存在安全隐患,因为这种方式出去的数据包是没有经过 VPN 加密的。所以正确的做法应参见:本文第四章节2. 登陆 VPN 的时候报“IPX/SPX 不兼容” (具体忘记了,没有截图)尝试问题 1 相同的步骤到出现下面的界面如果已经安装的协议里面有:请把它卸载掉,我是这样解决的,具体为什么不清楚。