PPTP 隧道建立、收发数据与断开流程简单总结
PPTP(点对点隧道协议)是一种早期(1999 年)的二层隧道协议,采用C/S架构,成员协议包括PPP、GRE等,PPTP隧道分为控制通道(TCP原生流量)和数据通道(GRE封装),由微软等厂
商推出,主要用于在公网上建立虚拟点对点连接,它依赖TCP 1723端口建立控制通道来完成隧道的协商、建立和维护,同时通过GRE协议(IP 协议号 47)封装 PPP 数据包形成数据通道,先
将用户数据封装成PPP帧,加密后再用GRE进行二次封装后在互联网传输,认证依靠PPP的PAP或CHAP等方式,加密则采用MPPE(微软点对点加密)的 RC4 算法,虽然配置简单、兼容性好、系统
原生支持广泛,但因为认证和加密机制存在大量已知安全漏洞,极易被破解,且对 NAT 和防火墙穿透能力较差,如今已不再安全,基本被 IKEv2、OpenVPN、WireGuard 等更安全的现代 VP
N 协议取代。
(1)PPTP配置过程
1 服务端开启RAS功能
2 RRAS配置界面启用VPN
3 RRAS配置界面配置虚拟IP地址池
4 注册允许接入的用户及其密码
5 配置防火墙、NAT放通PPTP数据包
6 客户端输入PPTP服务器IP地址,用户名和密码发起连接
(2)PPTP隧道建立过程
1 客户端已预创建PPTP虚拟网卡驱动实例,服务端已预创建WAN微型端口驱动实例
2 客户端随机端口发起TCP连接请求,服务端1723端口RAS服务接收,建立TCP控制通道基础连接
3 客户端RAS通过TCP控制通道发送PPTP Start-Control-Connection-Request请求,包含PPTP控制信息,服务端RAS响应PPTP Start-Control-Connection-Reply确认,PPTP控制通道协商成功
4 客户端RAS通过TCP控制通道发送Outgoing-Call-Request请求,包含GRE封装所需的Call ID、链路MTU等控制信息,服务端RAS回复Outgoing-Call-Reply确认,GRE数据通道的参数协商成功,GRE数据通道启用
5 客户端启用PPTP虚拟网卡,服务端启用WAN微型端口
6 客户端通过GRE数据通道发送LCP Configure-Request请求,服务端回复LCP Configure-Ack,LCP协商成功
7 服务端通过GRE数据通道发送MS-CHAPv2认证挑战请求,客户端返回用户名和结果值,服务端验证后返回认证结果,认证成功进入下一步,认证失败直接断开连接
8 客户端和服务端通过GRE数据通道分别发送CCP Configure-Request请求和CCP Configure-Ack确认协商,MPPE加密协商成功,加密密钥来自PPP认证过程中的共享密钥
9 客户端通过GRE数据通道发送IPCP Configure-Request请求,服务端RAS处理地址池后,返回IPCP Configure-Ack响应,包含隧道虚拟IP地址、默认网关、主备DNS服务器地址等配置信息
10 客户端收到后更新路由表并配置PPTP虚拟网卡,服务端配置WAN微型端口,PPTP隧道建立完成
TCP控制通道格式:[公网IP头部][TCP头部][TCP载荷]
GRE数据通道格式:[公网IP头部][GRE头部][PPP头部][PPP载荷]
(3)PPTP客户端数据收发过程(GRE数据通道)
发送:
前提:假设与实际目标服务器的TCP连接已建立,TCP建立时SYN数据包路径同应用数据
1 应用程序产生要发送的应用数据 当前包:[应用头部][应用数据]
2 应用程序发给协议栈TCP模块处理,通过其他端口发送应用数据 当前包:[TCP头部][应用头部][应用数据]
3 协议栈IP模块将其打包为IP包 当前包:[IP头部][TCP头部][应用头部][应用数据]
4 协议栈IP模块根据路由表,将IP包发送给PPTP虚拟网卡,PPTP虚拟网卡将其发送给RAS处理 当前包:[IP头部][TCP头部][应用头部][应用数据]
5 RAS将收到的初始IP包进行MPPE加密,再加上虚拟点对点链路的PPP头部,再加上GRE隧道头部,最后发给协议栈IP模块处理 当前包:[GRE头部][PPP头部][MPPE加密数据]
6 协议栈IP模块收到来自RAS的GRE包后,计算并加上校验和公网IP头部,然后发给物理网卡 当前包:[公网IP头部][GRE头部][PPP头部][MPPE加密数据]
7 物理网卡收到后,将其加上链路层头部后转换为电或光信号发送出去 当前包:[MAC头部][公网IP头部][GRE头部][PPP头部][MPPE加密数据]
接收:
1 物理网卡接收到电或光信号,转换为链路层PDU后核验校验和、目标地址后去除链路层头部返回给协议栈IP模块 当前包:[公网IP头部][GRE头部][PPP头部][MPPE加密数据]
2 协议栈IP模块收到后,校验各项参数通过后去除公网IP头部,判断协议字段为47(GRE),交给RAS处理 当前包:[GRE头部][PPP头部][MPPE加密数据]
3 RAS收到后,先核验并去除GRE隧道头部,再校验各项参数并去除虚拟点对点链路的PPP头部,最后根据密钥解密MPPE包,还原出初始IP包,最后再交给PPTP虚拟网卡 当前包: [IP头部][TCP头部][应用头部][应用数据]
4 虚拟网卡收到收到后,直接交给协议栈IP模块 当前包: [IP头部][TCP头部][应用头部][应用数据]
5 协议栈IP模块来自RAS的IP包后,核验并去除IP头部,判断协议字段为06(TCP),发给协议栈TCP模块 当前包:[TCP头部][应用头部][应用数据]
6 协议栈TCP模块收到后,核验并去除TCP头部,根据端口号发送给对应的应用程序 当前包:[应用头部][应用数据]
7 应用程序成功收到应用数据
虚拟网卡相当于连接RAS和协议栈的双向数据通道
(4)PPTP服务端数据收发过程(GRE数据通道)
发送:
1 服务端协议栈IP模块收到来自实际目标服务器响应的IP包 当前包:[IP头部][TCP头部][应用头部][应用数据]
2 协议栈IP模块根据路由表,将IP包发送给对应IP地址的WAN微型端口,WAN微型端口将其发送给RAS 当前包:[IP头部][TCP头部][应用头部][应用数据]
3 RAS将收到的初始IP包进行MPPE加密,再加上虚拟点对点链路的PPP头部,再加上GRE隧道头部,最后发给协议栈IP模块处理 当前包:[GRE头部][PPP头部][MPPE加密数据]
4 协议栈IP模块收到来自RAS的GRE包后,计算并加上校验和公网IP头部,然后发给物理网卡 当前包:[公网IP头部][GRE头部][PPP头部][MPPE加密数据]
5 物理网卡收到后,将其加上链路层头部后转换为电或光信号发送出去 当前包:[MAC头部][公网IP头部][GRE头部][PPP头部][MPPE加密数据]
接收:
1 物理网卡接收到电或光信号,转换为链路层PDU后校验各项参数后去除链路层头部返回给协议栈IP模块 当前包:[公网IP头部][GRE头部][PPP头部][MPPE加密数据]
2 协议栈IP模块收到后,校验各项参数后去除公网IP头部,判断协议字段为47(GRE),交给RAS处理 当前包:[GRE头部][PPP头部][MPPE加密数据]
3 RAS收到后,先核验并去除GRE隧道头部,再校验各项参数并去除虚拟点对点链路的PPP头部,最后根据密钥解密MPPE包,还原出初始IP包,最后再交给WAN微型端口 当前包: [IP头部][TCP头部][应用头部][应用数据]
4 WAN微型端口收到IP包后,直接交给协议栈IP模块 当前包: [IP头部][TCP头部][应用头部][应用数据]
5 协议栈IP模块收到来自RAS的IP包后,并不是走接收流程,而是进入转发数据流程,除非目标IP地址就是自己,接收流程同客户端
(5)PPTP服务端数据转发过程
发送:
1 协议栈IP模块根据原始IP包的目标IP地址查询路由表,确定IP包从哪个接口发出
2 协议栈IP模块进行重写校验和等参数和NAT转换,将原始IP包源IP地址转换为服务器的公网IP地址,同时记录NAT映射条目,用于匹配响应包,最后将包发送给物理网卡(NAT转换仅源IP地址在实际目标网络中不可路由时才会使用)
3 物理网卡收到后,将其加上链路层头部后转换为电或光信号发送出去
接收:
1 物理网卡接收到电或光信号,转换为链路层PDU后校验各项参数后去除链路层头部返回给协议栈IP模块
2 协议栈IP模块收到后,匹配NAT映射表中的条目,将目标IP地址转换为客户端虚拟IP地址,然后校验各项参数通过后进入发送操作(NAT转换仅源IP地址在实际目标网络中不可路由时才会使用)
(6)PPTP隧道断开过程
1 PPTP隧道主动断开方通过GRE数据通道发送LCP Terminate-Request报文,对端回复LCP Terminate-Ack确认,立即停止数据传输,释放MPPE加密密钥、PPP链路状态机,虚拟PPP链路断开成功
2 PPTP隧道主动断开方的RAS通过TCP控制通道发送PPTP Stop-Control-Connection-Request请求,对端RAS回复Stop-Control-Connection-Reply确认,PPTP控制通道断开成功
3 PPTP隧道主动断开方发起TCP断开请求,正常TCP四次挥手后,TCP连接断开成功
4 两端分别释放隧道所有资源:GRE隧道状态、虚拟网卡启用状态、客户端虚拟IP地址、NAT映射表项、隧道相关路由规则,隧道断开完成