PPTP协议的工作原理!点对点隧道协议(PPTP)是建立在PPP(Point to Point)点对点协议上的VPN隧道技术。
PPTP 的工作模型:
PPTP client首先同PPTP server建立一条TCP连接, 然后在该TCP连接上实现PPTP链接控制,之后的链路控制协议和数据包都通过IP协议上的GRE承载,建立的TCP连接只用于PPTP链路控制。实际传输过程也是讲数据包以PPP协议格式封装, 然后在IP协议上传输PPP封装的数据。
PPTP的作用:
当远程用户要访问公司专用网时,可采用PPTP网络接入方式,用户先拨号到PPTP Server建立PPP连接,PPTP Client和Server之间建立TCP连接,然后通过PPTP协商建立一条用户到服务器的隧道,然后通过PPP协议的NCP协商,为用户分配一个网段内IP,用户可以使用分配到的IP进行局域网(实际上只是逻辑上的局域网, 有可能地理位置跨越很大)内的通信。从而为远程接入虚拟专用网提供一条在公共网络上创建安全连接的途径。
PPTP协议是点对点隧道协议,其将控制包与数据包分开,控制包采用TCP控制。PPTP使用TCP协议,适合在没有防火墙限制的网络中使用。
NAS:: Network Access Server, 网络访问服务器。
PAC: PPTP Access Concentrator, PPTP网络集中器。 隶属于一个或多个PSTN或ISDN线路的能够允许你个PPP和处理PPP协议的设备。PAC仅需执行TCP/IP传输业务到一个或者多个PNS上,也能够为非IP协议开辟隧道。
PNS: PPTP Network Server,PPTP网络服务器
PPTP允许采用Client-Server模型分解现存的网络访问服务器(NAS)的功能。这里我们先看下传统的NAS有那些功能
+ 1) 到PTSN、ISDN的固有物理接口和外部modem、终端适配器的控制
+ 2) 作为PPP的LCP会话的终端
+ 3) 参与PPP认证协议
+ 4) 对PPP多链路协议进行通道汇聚和绑定管理
+ 5) 作为各种PPP网络控制协议(NCP)的逻辑终端
+ 6) NAS接口之间的多协议路由和桥
PPTP协议将以上NAS的功能分给了PAC和PNS。 PAC负责1和2, 有可能还需要负责3;PNS负责4、5、6, 有可能还要负责3.
PPTP协议仅有PAC和PNS执行, 其他任何系统都无需知道PPTP。 拨号网络可以在不知道PPTP的情况下连接到了一个PAC。
PPTP帧
PPTP报文分为两种
+ PPTP控制报文:用于创建、维护、终止PPTP连接
+ PPTP数据报文:用来传送PPP数据包,PPP数据包封装在GRE(通用路由封装)里进行传送
1 PPTP控制报文
前面我们提到要建立PPTP隧道需要先建立TCP连接,由此出现了下面PPTP报文的封包
IP首部TCP首部PPTP 控制报文
2. PPTP数据报文
IP首部(公网地址)GRE首部PPP数据报IP首部(私网地址)数据
对于数据报文, PPTP Server和PPTP Client都使用到了两个IP地址。一个是公网IP地址,用于连接Internet; 另一个是通过PPTP拨号分配的内网IP。(PPTP Server可能是手动配置的私网地址,PPTP Client的私网地址是从PPTPServer上获取到的)
PPTP协议概述
PPTP有两个并行的组成部分:
+ 1. PPTP链路控制: 基于TCP的PAC-PNS对操作的控制连接
+ 2. PPTP数据传输:一个在相同的PAC-PNS对之间的IP隧道操作。 该操作用来传送封装好的PPP包的GRE(Generic Routing Encapsulation,即通用路由封装协议),为PAC-PNS对之间的用户提供服务。
链接控制
在PAC和PNS之间的PPP隧道建立之前, 它们之间必须建立控制连接。
控制层的主要功能包括:
1. 彼此交换基本信息;
2. 负责创建、维护、删除Session;
3. 负责创建、维护、删除Tunnel;
4. 更新通信参数;(Set-Link-Info)
5. 维护控制层自身的连接状态。(Echo-Request、Echo-Reply)
控制连接是标准的TCP会话, PPTP呼叫控制和管理信息就可以通过TCP传送。
控制层连接是基于TCP建立的,PPTP Server监听TCP1723端口,等待Client的连接请求。
其中需要注意的是控制层自身的状态维护。PPTP连接双方在一段时间内(60秒)如果没有收到任何控制层信息,就会发Echo-Request查询控制层连接状态,接收方会应答Echo-Reply。如果发送方在60秒内还没有收到应答就会断开控制层连接。
控制层本身不负责传输有效载荷。
PPTP链接的建立可以分为以下几个阶段:
1. TCP连接的建立阶段
2. PPTP控制层连接的建立阶段
3. PPP会话阶段(包括LCP协商、身份认证、NCP协商等)
4. PPTP隧道中数据包的交互(这是实际通信流量、通信的packages是经过GRE封装过的PPP包)
5. PPTP链接的维护
6. PPTP链接的终止
1. 建立TCP连接
a)Client端向PPTP Server的1723端口发TCP SYN包,请求建立TCP连接;
b)PPTP Server接受TCP连接请求,回SYN ACK;
c)PPTP Client 回复ACK报文,完成三次握手。(我看到一些文章上说PPTP协议建立TCP连接时,三次握手只执行了前面两次,第三次没有单独发送ACK报文,而是带着有效载荷,不晓得是否真的可能如此,但从我抓到的报文来看,三次握手是有完成的。
2. 建立PPTP控制层连接
a)PPTP Client发送Start Control Connection Request.
控制链接发起请求,用于初始化PPTP Client 和Server之间的Tunnel,开始Tunnel的建立过程。
b)PPTP Server回Start Control Connection Reply。
控制链接响应,表示接受了对端的连接请求,Tunnel的建立过程可以继续。
c)PPTP Client发Outgoing Call Request;
创建隧道,选择一个用以从客户端到服务器发送数据的PPTP隧道进行标识作用的调用ID
d)PPTP Server回Outgoing Call Reply。
隧道创建成功应答。选择一个用以从服务器到客户端发送数据的PPTP隧道进行标识作用的调用ID
e) PPTP Client 发送一条Set-Link-Info
指定PPP协商选项。
到此为止,PPTP的控制层连接就已经建立起来了。
3. PPTP控制链接终止
1). PPTP Client发送一条Set-Link-Info,以指定PPP协商选项。
2). PPTP Client发送一条LCP Terminate-Request消息来终止PPP连接。
3). PPTP Server发送一条Set-Link-Info,以指定PPP协商选项。
4). PPTP Server发送LCP Terminate-Reply,从而终止PPP连接。
5). PPTP Client发送一条PPTP Clear-Call-Request,以请求呼叫终止。
6). PPTP Server发送一条PPTP Call-Disconnected-Notify,通知呼叫将要终止。
7). PPTP Client发送一条PPTP Stop-Control-Connection-Request终止连接。
8). PPTP Server发送一条PPTP Stop-Control-Connection-Reply进行响应。
至此TCP链接终止
数据传输( 隧道 Tunnel)
控制层是不提供有效载荷的, 应用层的数据是通过隧道进行传输的。
PPTP隧道建立后,就可以在客户机与服务器之间传送PPP数据包,PPP数据包是封装在GRE(通用路由封装)包中的,GRE包是在IP层上传送的。
**什么是隧道Tunnel:**RFC对Tunnel的定义是“A tunnel is defined by a PNS-PAC pair”, 即一个PNS-PAC对就是一个tunnel。
PPTP数据的传输 关键点其实就是 数据报文的封包与解包。我们先看下一个在PPTP中传输的数据报文
数据的发送——封包过程
在发送端,要把一个数据包发出去,需要首先把packet发到VPN的虚拟网卡,虚拟网卡把它变成GRE frame,然后发往IP层再次进行路由。数据包这次会被发往物理网络,并最终抵达PPTP Server端。
封包的关键在网络层和链路层。
1. **PPP帧的封装:**IP层从传输层接收到数据包后,传输给链路层的VPN虚拟网卡,添加PPP报头,封装成PPP帧。
2. GRE报文的封装:经过VPN网卡封装后的数据包重新交回网络层,由网络层的GRE协议添加GRE报头,形成GRE报文
3. IP再封装: GRE报文交给同属于网络层的IP协议,进行IP头在封装,二次添加IP首部,形成新的IP数据报
在经过二次IP封装的IP数据报就传给链路层的Ethernet处理程序进行正常传输,经网卡传输到因特网。
数据的接收——解包过程
在接收端,从物理网卡上收到frame之后交给IP层,IP对其解包之后转发给VPN虚拟网卡,虚拟网卡再解包把它变成普通IP packet再次发往IP层,这次IP层知道是VPN对端发来的数据,直接交给TCP/UDP并最终抵达应用层。
PPTP隧道 数据的接收过程与发送过程刚好相反。