椰树小屋

PPTP/L2TP协议讲述以及应用部署

PPTP/L2TP协议讲述以及应用部署

一、基本概念

PPTP

PPTP是对端对端协议(PPP)的一种扩展,它采用了PPP所提供的身份验证、压缩与加密机制。PPTP能够随TCP/IP协议一道自动进行安装。PPTP与Microsoft端对端加密(MPPE)技术提供了用以对保密数据进行封装与加密的VPN服务。 MPPE将通过由MS-CHAP、MS-CHAP v2身份验证过程所生成的加密密钥对PPP帧进行加密。为对PPP帧中所包含的有效数据进行加密,虚拟专用网络客户端必须使用MS-CHAP、MS-CHAP v2身份验证协议。

L2TP

与PPTP不同,Windows所支持的L2TP协议并非利用MPPE对PPP帧进行加密。L2TP依靠Internet协议安全性(IPSec)技术提供加密服务。L2TP与IPSec的结合产物称为L2TP IPSEC VPN。VPN客户端与VPN服务器都必须支持L2TP和IPSec。也可以单独使用L2TP,这就需要修改windows主机的注册表,具体的修改过程,在建立"简单的L2TP隧道"中讲述。

二、数据封装

PPTP     

1.控制连接和隧道维护

PPTP控制连接建立在PPTP客户端机IP地址和PPTP服务器IP之间,PPTP客户端机使用动态分配的TCP端口号,而PPTP服务器则使用保留TCP端口号1723。PPTP控制连接携带PPTP呼叫控制和管理信息,用于维护PPTP隧道,其中包括周期性地的发送回送请求和回送应答消息,用于检测出客户端与服务器之间可能出现的连接中断。PPTP控制连接数包包括一个IP报头,一个TCP报头和PPTP控制消息。

Star-Control-Connection-Request:由PPTP客户机发出,请求建立控制连接

Star-Control-Connection-Reply:PPTP服务器对Star-Control-Connection-Request回应

Outgoing-Call- Request:由PPTP客户机发出,请求创建PPTP隧道,该消息包含GRE报头中call id,该id可唯一地标识一条隧道

Outgoing-Call- Reply:PPTP服务器对Outgoing-Call- Request t回应

Set-Link-Info:由PPTP客户机或服务器任一方发出,设置PPP协商选项

Call-Clear-Request:由PPTP客户机发出,请求终止隧道

Call-Disconnect-Notify:PPTP服务器对Call-Clear-Request回应或者其他原因指示必须终止隧道

Stop-Control-Connection-Request:由PPTP客户机或者服务器任一方发出,通知对端控制连接将被终止

Stop-Control-Connection-Reply:回应Stop-Control-Connection-Request消息

 

2.PPTP数据封装

将原来Ethernet数据包先封装成PPP packet,再由GRE封装,通过Internet传送至接收端(注意:当身份认证协议选择MS-chap以及MS-chapv2的时候,ppp payload将被加密)

 

 

L2TP

  1. L2TP控制连接

L2TP控制连接建立在L2TP客户端机IP地址和L2TP服务器IP之间,PPTP客户端机使用动态分配的UDP端口号,而L2TP服务器则使用保留UDP端口号1701。L2TP控制连接用于隧道和会话连接的建立、维护以及传输控制。L2TP控制连接数包包括一个IP报头,一个UDP报头和L2TP控制消息。

控制连接建立和会话建立

首先由客户端发起隧道建立请求SCCRQ(start-control-connection-request)

服务器收到后用SCCRP(start-control-connection-reply)

客户端收到应答后返回确认SCCCN(start-control-connection-conneted)

服务器收到之后用ZLB(zero-length boby)消息作为最后应答,其中ZLB消息是一个只有L2TP头的控制消息,其作用是作为一个明确应答,以确保控制消息的可靠传输

客户端发起建立请求ICRQ(incoming-call-request)

服务器收到请求后返回应答ICRP(incoming-call-reply)

客户端收到应答会返回确认ICCN(incoming-call-conneted)

服务器收到ICCN后,用ZLB消息作为最后的应答,会话建立

  1. L2TP数据连接

L2TP数据消息用于封装PPP帧,并在隧道上传输。

  1. 工作原理

原始用户数据为IP报文,先经过PPP封装,然后链路层将PPP帧进行L2TP封装,将其封装成UDP,并继续封装成可以在internet上传输的IP报文,此时的结果就是IP报文中有PPP帧,PPP帧中还有IP报文,但两个IP地址不同,里面的IP头部是私有地址(原地址为L2TP服务器动态分配的地址,目的地址为公司内网服务器的地址),外层IP头部的原IP是客户端的原始地址,目的IP是L2TP服务器的地址,至此完成客户端数据封装,然后通过L2TP隧道将报文发送到L2TP服务器,L2TP服务器收到封装的IP报文,发现外层IP头部的目的地址是指定自己的,然后L2TP服务器解封装报文,得到里面的IP报文,然后根据IP头部的的目的IP地址将数据包发送到内网局域网服务器。

  1. L2TP IPSEC VPN

 

可以发现L2TP IPSEC VPN的数据封装是在原始L2TP数据连接的IP头部后面加入ESP字段的,所以这是一种传输模式的IPSEC隧道。因为ESP后面的数据是经过加密的,所以这里就不例举抓包结果了。

 

三.协议和算法介绍

PPP

1.工作流程

一个IP分组需要传输,出发PPP层启动连接过程,LCP协议负责完成连接的建立过程,PAP或者CHAP协议完成身份认证,IPCP协议进一步完成网络层协议协商,当以上过程都成功完成之后,IP分组封装在PPP帧中传输到对方

2.协议分析

LCP:负责链路的建立,维护以及拆除

CHAP:对客户端进行身份认证

IPCP:负责协商IP地址以及DNS等信息

CCP:负责压缩的协商

 

GRE

1.概述

GRE(通用路由封装)定义了在任意一种网络层协议上封装任意一个其它网络层协议的协议。

2.封装

在大多数情况下,系统拥有一个有效载荷包,需要将它封装并发送某个目的地。首先将有效载荷封装在一个GRE包中,然后将此GRE包封装在其它某协议中并进行转发。比如在PPTP隧道中,IP包封装GRE包,在IP头部中指明下层协议GRE的协议号47,GRE包封装PPP包,在GRE头部中指明下层协议PPP的协议号0x880b

3.应用

GRE OVER IPSEC

当数据包到达隧道一端A,A查询路由,发现去往该目的地的数据包需要经过GRE封装,在原始的数据包上加上GRE头部以及新的ip头部,然后A重新查询规则,发现该新的ip头部需要经过ipsec模块处理,所以数据包又经过加密封装之后,查询路由之后发送到隧道对端B,B发现该数据包的目的是发给自己的,解封装时ip头部的协议字段指明封装的是ESP或者AH,然后B解密等操作,发现该数据包的原始目的,查询路由之后,该数据包送到保护网络中。因为ipsec并不能承载动态路由协议以及组播,所以需要用到这两种技术的时候,可以选择GRE OVER IPSEC。

IPSEC OVER GRE

没有什么实际的使用意义

PPTP

请查看PPTP的讲述

L2TP

请查看L2TP的讲述

PAP

口令直接以明文在网络上传输,建议选择CHAP,更安全。

CHAP

CHAP是一种加密的验证方式,能够避免建立连接时传送用户的真实密码,服务器向客户端发送一个挑战口令challenge,其中包括会话ID和一个任意生成的挑战字符串。当客户端收到后,必须使用MD5算法计算用户口令以及挑战口令的hash值,然后将这个hash值和用户名传送给服务器。因为服务器上有该用户名和口令,然后服务器同样使用MD5算法计算出该用户密码和挑战口令的hash值,与客户端传送给自己的hash值比较,如果相同的话,则身份验证通过。

Challenge=session_id+challenge_string
Respond=md5(session_id+challenge_string+user_passwd)+uer_name

四.应用环境

建立虚拟专用网络

第一步: pc机上网络邻居—–属性

第二步:在网络连接中选择"创建一个新的连接"

第三步:在弹出的"新建连接向导"中选择下一步

第四步:选择"连接到我的工作场所的网络",然后下一步

第五步:选择"虚拟专用网络连接",然后下一步

第六步:输入公司名,我这里输入的是leadsec,这个是随便怎么写的,然后下一步

第七步:选择"不拨初始连接",然后下一步

第八步:输入服务器的ip地址,然后下一步

第九步:选择完成即可

不经过NATPPTP隧道

  1. 拓扑图

2.环境描述

经过专线的远程用户连接互联网,该远程用户需要连接到公司局域网,需要与公司出口防火墙建立PPTP隧道,当建立PPTP隧道成功之后,测试该远程用户是否还能访问互联网

3.配置

在远程用户的虚拟专用网络属性中指定VPN类型是PPTP VPN,项目只选择Internet协议(TCP/IP),常规选项中填入目的主机地址124.1.1.2,在安全选项中选择高级,指定数据加密可选加密,允许认证协议MSCHAP以及MS-CHAPV2,其他参数保持默认(3.4.6.8版本以及之前的版本必须这么配置)

 

在防火墙处开启PPTP服务,配置远程拨号用户以及全局的地址池或者用户中的虚拟ip地址(如果用户中配置有虚拟ip地址,则该地址优先与地址池中地址分配给远程用户)

 

连接虚拟专用网络leadsec

查看防火墙给远程用户分配的虚拟地址10.10.10.2

查看虚拟专用网络leadsec的状态,类型是PPTP,身份验证MS CHAP V2,,分配给远程客户端地址为10.10.10.2,防火墙PPTP服务器虚拟地址10.10.10.1

查看远程客户端的路由变化,第一条默认路由是虚拟专用网络leadsec连接成功之后添加,它的网关为它自己,并且它的度量值为1,比第二条默认路由的度量值小,所以默认查不到明细路由的数据包都送到第一条默认路由进行处理。所以虚拟专用网络leadsec连接之后,远程用户不能再访问互联网地址,只能访问公司局域网

查看防火墙的路由变化,多了到目的网络10.10.10.2的出接口ppp0的明细路由

经过NATPPTP隧道

1.拓扑图

 

2.环境描述

分支机构通过出口FW1连接互联网,在出口FW1上作NAT,将172.16.1.0/24网段转换为出口FW1的外网口地址211.103.135.192,现在分支结构需要通过PPTP隧道连接到公司总部局域网。

3.配置

在公司总部出口FW2上添加两个远程拨号用户,并且开启PPTP服务

在出口FW1上作NAT转化,将172.16.1.0/24到any的流量源地址转化为211.103.135.192

分别在分支结构的两个客户端建立虚拟拨号连接,连接到211.103.135.192,具体的参数配置参考"不经过NAT的PPTP隧道",这里不再详述了。接下来要分析的是PPTP穿越NAT的工作机制

PPTP穿越NAT的工作机制

我们知道GRE(请看GRE协议介绍)是没有端口信息的,并且它是跟TCP、UDP是同一层的,GRE的ip协议号是47,TCP的ip协议号是6,UDP的ip协议号是17。那GRE穿越NAT的时候怎么映射呢?这个时候你可能会想到那就只转换ip不就得了,但是这对防火墙是个问题。接下来我们就来分析下:如果处于分支机构的主机A172.16.1.2(NAT转换为211.103.135.192)与pptp服务器211.103.135.221建立连接,控制连接成功建立,数据连接由于没有端口,NAT只做其ip的转换,于是在出口FW1上有这样的一个NAT表:

SIP SPort Proto 转换地址 转换端口 DIP DPort
172.16.1.2 5000 TCP 211.103.135.192 5001 192.168.1.2 1723
172.16.1.2   GRE 211.103.135.192   192.168.1.2  

当211.103.135.192这个防火墙收到来自于pptp服务器211.103.135.221的数据流包时,211.103.135.192这个 nat设备发现来自于网络211.103.135.221的gre 协议数据包,是给分支结构的172.16.1.2主机的,所以成功通信。分析如果位于分支结构的172.16.1.3 也与211.103.135.221的pptp服务器通信,结果就不太理想了。因为如果在nat表中还有一条到达主机172.16.1.3的gre通信,到收到一个gre协议数据包时,211.103.135.192这个nat设备犹豫了,这个包给谁呢?172.16.1.2?还是172.16.1.3呢?在此大家也不要忘了,我们的实验环境是只有一个公网ip,分支结构的172.16.1.2和172.16.1.3出去的时候,源ip都转换成了公网的ip211.103.135.192,所以收到的数据包都是目标ip为211.103.135.192,然后nat设备根据端口的不同转发到不同的主机,但是又因为GRE根本就没有端口这一说法,所以有两个客户端就无法通信。

当然了,明知道PPTP穿越NAT的时候有问题,我们就要解决它,就好像IPSEC穿越NAT的时候,就需要在IPSEC包头前面额外的插上UDP。人们发现gre协议中有一个字段,可以拿来利用,那就是这个call id值,这个值并不固定,可以改变。这个值是怎么回事呢?用来标识唯一会话的。这个值最早出现在控制连接中,客户端与服务器互相通告彼此的call id值,然后在其数据连接中,服务器call  id值写上客户端的,客户端写上服务器的call id值。所以我可以把call id值当做端口来看,然后添加到nat表中。下面来具体分析下call id和nat转化的关系了!!!

分析客户端172.16.1.2到PPTP服务器211.103.135.221的PPP以及GRE数据报

172.16.1.2到211.103.135.221的Outgoing-Call-Request包中表明自己的call id为3277

211.103.135.221到172.16.1.2的Outgoing-Call-Reply包中表明自己的call id为3712,并指明客户端的call id为3277

172.16.1.2到211.103.135.221的GRE包中会携服务器的call id 3712

211.103.135.221到172.16.1.2的GRE包中会携客户端的call id 3277

接下来看下NAT设备的NAT表

将NAT表转化为图标的形式为:(注意需要把srckey以及deskey当成源端口以及目的端口,并且将十六进制转化为十进制)

SIP SPort Proto 转换地址 转换端口 DIP DPort
172.16.1.2 3277 TCP 211.103.135.192 3277 211.103.135.221 1723
172.16.1.2 62524 GRE 211.103.135.192 3712 211.103.135.221 3712
211.103.135.221 3712 GRE 211.103.135.192 3277 172.16.1.2 3277
172.16.1.3 2051 TCP 211.103.135.192 1723 211.103.135.221 1723
172.16.1.3 32768 GRE 211.103.135.192 3840 211.103.135.221 3840
211.103.135.221 3840 GRE 211.103.135.192 2051 172.16.1.3 2051

可以看出利用客户端以及服务器的call id当成端口号,多个客户端穿越nat的时候可以同时与PPTP服务器建立连接

简单l2tp隧道

默认情况下,windows系统中L2TP是与IPSEC功能相结合的,如果只想简单的使用L2TP隧道,需要在远程客户端系统中禁用L2TP与IPSEC的结合功能,这时就需要修改远程客户端的注册表了。

在\HKEY_MACHINE\SYSTEM\CurrentContorlSet\Services\RasMan\Parameters增加名称为prohibitipsec,类型为REG_DWORD,值为1的键值,保存之后重新启动计算机才有效。

修改虚拟专用网络的VPN类型为L2TP IPSec VPN,其他参数与PPTP隧道的参数一致

然后连接虚拟专用网络leadsec,L2TP服务器的虚拟地址为10.10.10.1,分配给远程L2TP用户的虚拟ip为10.10.10.52。所以PPTP用户和L2TP用户共享地址池中地址,L2TP用户使用地址池中的后一段。在新版本的防火墙中,PPTP和L2TP用户的虚拟地址将分别设置。

查看L2TP客户端的路由,添加了一条默认路由,网关是10.10.10.52.并且度量值为1,所以到目的网络的数据包没有明细路由的都选择使用L2TP隧道

L2TP服务端新增了一条路由,出接口是ppp0

 

l2tp ipsec vpn

使用预共享密钥认证

1.客户端的配置与"简单l2tp隧道"的配置区别

删除注册表中

\HKEY_MACHINE\SYSTEM\CurrentContorlSet\Services\RasMan\Parameters中,名称为prohibitipsec的键值,重启客户端主机。因为客户端默认prohibitipsec的键值是不存在的,所以这步可以省略。

2.在虚拟专用网络中修改开启使用预共享密钥身份认证,并且该密钥与服务器的保持一致

L2tp服务器配置需要增加ipsec隧道的配置

开启ipsec模块

配置远程VPN,这里需要注意的是因为windows认证野蛮模式不安全,所以远程VPN中必须选择主模式

配置客户端隧道,注意这里使用的是传输模式。传输模式只保护有效负载,不对原始ip加密,所以这里的本地保护子网即是建立隧道的端口地址

隧道建立之后

IPSEC隧道中有L2TP的流量

建立隧道的接口收到的包是经过ESP封装的

L2TP服务器的虚拟接口收到的是原始数据报

需要注意的是,虽然流量经过了IPSEC隧道,但是IPSEC隧道监控处显示的流量一直为0

L2TP隧道监控处显示的加密强度是NONE,因为是通过ipsec进行加密处理的,与MPPE没有关系

使用证书认证

1.相比预共享密钥的认证,使用证书进行认证更可靠并且可用性更高。安装一个证书服务器,至于怎么安装,这里就不详细说了。一般情况下证书服务器部署在企业局域网中,所以远程用户需要使用证书服务的时候,可以先使用PPTP隧道连接企业的局域网,这样就可以进行证书的申请和安装了

2.先假设远程用户1与PPTP服务器的隧道已经建立成功,并且可以成功访问证书服务器172.16.1.2。浏览器访问http://172.16.1.2/certsrv,申请一个证书

3.使用高级证书申请

4.使用"创建并向此CA提交一个申请"

5.填写姓名,使用远程用户主机的计算机名字,证书类型选择"客户端身份验证证书",并勾选"将证书保存在本地计算机存储中",然后提交即可

CA服务器的管理员需要离线确认该申请,CA服务器管理员打开管理工具中的证书颁发结构,在"挂起的申请"中选择"颁发"动作

然后远程用户1访问http://172.16.1.2/certsrv,选择"查看挂起的证书申请的状态"

选择"客户端身份证书验证证书"

选择"安装此证书"

安装客户端成功之后,远程用户在运行中输入mmc,打开控制台

打开"文件"中的"添加/删除管理单元"

选择"添加"操作,选择"证书",选择"计算机账户",然后选择"本机计算机"即可

12.完成之后,在个人证书中就有客户端证书

13.远程用户访问http://172.16.1.2/certsrv,下载CA证书保存在本地

14.在控制台的"受信任的根证书颁发结构"中选择导入保存在本地的CA证书

15.在L2TP服务器中导入CA证书

16.在L2TP服务器中选择"本地证书",选择"密钥本地生成",填写相应的字段,然后导出该请求文件,保存在本地。打开该请求文件,复制全部内容

17.访问http://172.16.1.2/certsrv,选择"申请一个证书",选择"高级证书申请",选择"使用 base64 编码的 CMC 或 PKCS #10 文件提交 一个证书申请,或使用 base64 编码的 PKCS #7 文件续订证书申请",然后将上一步复制的内容粘贴到此处

18.在证书颁发结构中颁发该L2TP服务器的证书,以及下载该证书,然后将该证书导入本地证书,并且也需要导入对端证书也就是客户端证书。

19.在远程VPN中选择使用证书认证,选择相应的证书即可

20.在客户端的虚拟专用网络中取消预共享密钥认证,虚拟专用网络其他的配置与"使用预共享密钥认证"一样,然后连接该网络,L2TP服务器显示ipsec隧道建立成功,L2TP隧道建立成功

21.至于其他远程用户需要使用证书建立l2tp ipsec vpn隧道,则配置与上面类似