同一个 PPTP 客户端给出的三条错误信息通常描述三种不同的故障。错误 800 表示隧道从未建立,错误 812 表示服务器拒绝了身份验证方式,而一分钟后掉线则是 keepalive 定时器判定健康的对端已经消失。每个阶段都有各自的失败原因,所以每一层都需要单独检查。

错误 800 表示隧道从未建立

Windows 在完全无法建立隧道时报告错误 800,而关于服务器不可达或安全参数不合适的文字只是汇总,不是诊断。PPTP 在检查任何凭据之前需要网络提供两样彼此独立的东西。TCP 1723 承载控制通道,IP 协议 47(即 GRE)承载被封装的载荷。

从你自己的局域网之外测试这条外部路径,因为在办公室内能连通并不能证明边缘的情况:

$ nc -vz vpn.example.net 1723
Connection to vpn.example.net 1723 port [tcp/*] succeeded!
$ sudo tcpdump -ni eth0 proto gre
tcpdump: listening on eth0, link-type EN10MB

如果 1723 有应答,而客户端尝试连接时抓包仍然为空,说明路径丢弃了协议 47。路由器转发了 1723 但关闭了 PPTP 透传时正好是这种情形:TCP 握手完成,随后 GRE 包消失,于是故障看起来像凭据问题,尽管根本没有尝试登录。

把转发指向服务器当前的局域网地址,在路由器提供该功能的地方启用 PPTP 透传,再从同一个外部位置重试。如果 GRE 在上游被过滤且你无法改变,那么 TCP 443 上的 SSTP 或 UDP 500 和 4500 上的 L2TP/IPsec 比你在 Windows 侧能做的任何改动都更有希望。

错误 812 是服务器拒绝了你的身份验证方式

错误 812 在隧道建立之后才返回,所以感觉像密码问题。服务器拒绝的是为连接协商的身份验证方式,不一定拒绝密码本身。在客户端打开 VPN 条目,进入安全选项卡,把类型设为 Point-to-Point Tunneling Protocol,选择明确的协议列表,并勾选 Microsoft CHAP 版本 2。

无需点击对话框就能读取当前设置:

$ Get-VpnConnection -Name "Office" | Select-Object -ExpandProperty AuthenticationMethod
MsChapv2

要求 MS-CHAP v2 的服务器会拒绝停留在 PAP 或会自动协商更弱方式的客户端,而且错误在任何用户密码被评估之前就出现了。账户格式是同一个拒绝的另一半。有一次 Windows 发送了 MicrosoftAccount\[email protected] 形式的 Microsoft 账户标识,而服务器需要本地或域账户。输入 SERVERNAME\username 告诉 Windows 该查询哪个账户存储,错误随之消失。请手动输入名称,而不是让已保存的凭据重复旧格式。

一分钟后的掉线是 keepalive 的决定

当隧道连接成功、通过一点流量然后断开时,先看服务器的 LCP 回显行为,再去动客户端。守护进程会定期要求对端确认它还在。如果在配置的额度内收到的应答太少,即使用户仍然有可用链路,会话也会被拆除。

在 Linux pptpd 服务器上,这些值位于 /etc/ppp/options.pptpd 中,通常的修法是把额度放宽,而不是把间隔缩短:

# /etc/ppp/options.pptpd
lcp-echo-failure 30
lcp-echo-interval 5
# then
sudo systemctl restart pptpd

五秒间隔下错过三十次才会容忍短暂的停顿,而不是判定对端消失。把次数降到一两次,就会让经过转换的路径上的普通抖动大约每分钟变成一次断开。如果你的服务器是 Windows RRAS 而不是 pptpd,那就要改看 PPP 会话超时和空闲断开策略。它们位于别处,编辑一个并不存在的 pppd 文件不会有任何改变。

重叠的子网会破坏数据路径

当两端使用同一个私有网段时,PPTP 隧道可以干净地通过身份验证却什么都到不了,例如办公室和家里都用 192.168.1.0/24。客户端无法判断某个地址指的是哪台主机,有些协议栈干脆拒绝安装路由,而不是二选一。

把这当作设计缺陷,重新编号其中一侧,或者给客户端一个刻意转换过的接入网段。调试 PPTP 客户端无法修复重复存在的地址空间,症状会继续看起来像随机掉线。

从失败的那一层开始排查:800 查 GRE,812 查方式与账户字符串,按计划死亡的隧道查回显设置。

相关文章