Windows VPN 连不上?把错误代码与事件日志对上
Windows 的 VPN 对话框会藏起失败的那一层。读出结果代码,取出那次尝试的 RasClient 事件,只改真正坏掉的那一层。
周五它还正常。周一同一个 Windows 客户端弹出一个对话框,说连接尝试失败,而下面那句话你已经在十几种毫不相干的问题里见过。那个对话框是一条链的末端,不是开端。Windows 把尝试真正死掉的那一层藏了起来,两条小证据能把它指出来:数字形式的结果代码,以及同一分钟的一条 RasClient 事件。下面是我用的顺序——固定这次尝试,读出代码,取出事件,然后只改一层。
对话框文字是最后一步,不是原因
你读到的那句话是在尝试已经收场之后才被选中的。“连接在建立之前被远程计算机终止”会在服务器于协商中途挂断时出现,会在用户名还没发出去 IPsec 就失败时出现,也会在某条策略直接拒绝隧道时出现。三种不同的责任方,同一句话。把措辞当成一类症状,在代码同意之前别让它主导任何判断。
仍然能固定下来的是这次尝试本身。写下连接名、配置里保存的隧道类型——PPTP、L2TP/IPsec、SSTP 或 IKEv2——、精确到秒的时间,以及代码。如果不确定实际跑的是哪个协议,就打开 %APPDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk 读条目,而不是凭记忆;为新协议复用的配置会保留它旧的显示名。
先读数字,再读文字
代码分成三个阶段,而阶段比精确措辞更重要:走到并被拒绝的身份验证交换、始终没有回应的服务器,或者链路起来之后崩掉的协商。691 属于第一种——凭据检查跑了并失败,可能是密码错误、账户被锁或过期,也可能是服务器不接受的验证协议。812 也是拒绝,但凭据是有效的:远程访问服务器上的一条策略做出了不利于你的决定。Microsoft 维护着权威的拨号与 VPN 连接的错误代码清单,在检索提示文字之前,值得先去那里查自己的号码。
809 是相反的一类:什么也没回来。这是路径问题——SSTP 的 TCP 443 被过滤、PPTP 的 GRE 被封锁、IPsec 穿透的 UDP 500 和 4500 或 ESP 被丢弃。新密码修不好它,新证书也修不好。720 说明链路起来了而 PPP 始终没完成协商,这指向协议不匹配,或者服务器分配不了地址。789,或者 IKEv2 上的 13801,是 IPsec 内部的身份问题:证书主体与你拨号的名称不符、信任链不受信,或者两端的预共享密钥不一致。
取出同一分钟的 RasClient 事件
在事件查看器里,按来源 RasClient 筛选的 Windows Logs > Application 是第一个该看的地方。Microsoft 关于错误 720 的文章指向那份日志里的 20227 事件。同一个提供程序会为其他结果发出别的标识符,所以要读消息本身以及其中内嵌的结果代码,而不是把 ID 当成诊断;一个笼统的对话框加上一条携带 720 的 20227,已经是窄得多的故事。
在 PowerShell 里,不用点图形界面:
Get-WinEvent -FilterHashtable @{
LogName = 'Application'
ProviderName = 'RasClient'
StartTime = (Get-Date).AddMinutes(-15)
} | Format-List TimeCreated, Id, Message
空结果本身就是信息。它通常意味着拨号根本没走到 RAS 能记下任何东西的程度,或者失败的软件压根不是原生客户端——第三方客户端有自己的诊断,常常什么都不写进 Application 日志。在下结论说事件记录坏了之前,先查厂商的日志。
搭一条时间线,而不是一堆事件
重试循环会制造噪音。五次自动重连留下一簇事件,而诱惑是把它们读成一条单一原因的序列。那是五次彼此独立的尝试,只有一部分到达了服务器。取两三分钟的窗口、一个连接名,在解释任何东西之前先把每条事件连同它自己的代码列出来。
然后问尝试停在了哪里。当网关或身份验证后端对该时间戳没有任何记录时,客户端根本没到达那里,你看的是可达性问题。当后端显示有请求也有拒绝时,决定是在那里做出的,凭据或策略那一类就适用。比时间之前先比时钟:客户端报的是本地时间,很多网关记的是 UTC,一个时差就会让一对完全相关的记录看起来毫无关系。
想要可重复的抓取,就从命令行拨号,让它把结果打印出来:
rasdial "Office VPN"
rasdial "Office VPN" /disconnect
控制台会显示图形界面藏在友好文字背后的那个号码,跑两次就能知道代码是稳定的还是间歇的。
每个阶段要你改什么
只有把改动集合收窄到一层时,给阶段命名才有用:
691— 身份验证:客户端提出的 EAP 方法与服务器接受的方法、账户状态、密码到期、拨入权限。812— 服务器策略:与这个用户、这个时间窗口相符的远程访问策略或 NPS 规则。809— 可达性:路径上的防火墙规则、NAT 与协议穿透、所选隧道类型需要的端口。720— PPP 协商:验证协议不匹配、地址分配、服务器侧的 PPP 设置。789/13801— IPsec 身份:证书主体与你拨号的名称、信任链、预共享密钥。
改其中一项,重测同一个配置,把新代码记下来。改动之后代码变了是进展而不是矛盾:你把故障挪到了更后面的阶段,而修多阶段握手看起来正是这样。不该做的是在一个回合里同时改防火墙、证书和密码,然后把功劳算在最后动的那一项上。
分享证据,而不是环境
事件消息比看上去更丰富。它们带着连接名、账户,常常还有网关的内部名称或地址,有时还有证书指纹。把原始件留在该留的地方,另外做一份脱敏副本给任何人;凭记忆重打时间线,恰好会丢掉让它有用的那些细节。
能真正推进的交接需要五个字段:代码、它所属的阶段、客户端与隧道类型、带时区的时间戳,以及网关到底有没有看到请求。其余都是可选的。有了这五项,下一个人不必重做调查就能把凭据之争和路由之争区分开。
在关闭任何东西之前,用同一个配置重放这次尝试,确认代码现在落在哪里。成功就结束;换了一种失败,说明原来那一层修好了,下一层已经在你手里。