一次 VPN 超时只能证明没有收到可用的回应,并不能证明原因。配置可能写错了端口,服务器可能已经下线,或者请求到达时没有可用的返回路径。每种情况留下的痕迹都不同,而正是痕迹告诉你该动哪条规则。按顺序做完下面四个阶段。只要其中一步解释了症状,就停下来。

阶段 1:确认服务器与传输方式

服务器名、传输方式和端口要从服务商当前的配置里读,而不是从本地改动里读。在笔记本上改的端口无法在公网服务器上生成监听端,这种不一致产生的超时和拦截完全一样。如果配置提供了受支持的备用传输方式,把它记为备选而不是修复。解析域名,并把结果与服务商公布的地址对照。

过期的 DNS 记录会把客户端送到从未应答的主机。这又是一处伪装成过滤的故障,排除它只需一次查询。

把这两个值写进工单。之后每次对比都要用到它们,缺了它们的工单会让排查从头再来。

阶段 2:用一次受控对比证明路径

保持设备和配置不变,换一条可信的接入网络再试。如果隧道在那里建立,差异就在原路径或其策略上。如果第二台已批准的设备在原网络能用,差异就在第一台设备上。这两种对比里总有一个几乎总是决定性的。

先把任何合法的网络登录做完,因为强制门户在完成之前看起来就像被拦截。

测试你实际使用的端口,并把 TCP 的结果只当作关于 TCP 的信息。

Resolve-DnsName vpn.corp.example
tracert -h 8 -w 500 vpn.corp.example
Test-NetConnection vpn.corp.example -Port 443 -InformationLevel Detailed

443 端口上 TCP 握手成功,说明那里有监听端作了回应。它既不能说明 51820 上是否有 UDP 监听端,也不能说明协商是否完成。

阶段 3:读取失败那一刻的安全事件

防火墙事件是目前最有力的证据,但它有一个需要先说明的前提。许多默认配置关闭了日志,所以在把空日志当成清白证明之前,先确认相关配置是否记录了丢弃。日志开启时,事件会写明规则、方向和地址,这正是改规则所需要的。应用规则和端口规则是两个不同的对象,受管策略还可能覆盖本地设置。要确认某条规则实际覆盖的是哪个客户端、哪个服务。

要从出故障的那台机器上收集配置状态和近期事件,而不是从旁边的主机。

把事件时间和你这次测试的时间对照,因为规则名相同而时间戳不同只是巧合。

Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction, LogBlocked
Get-NetFirewallRule -Enabled True -Direction Outbound | Where-Object DisplayName -match 'VPN'
Get-WinEvent -LogName 'Microsoft-Windows-Windows Firewall With Advanced Security/Firewall' -MaxEvents 20

在自己管理的服务器上,先问请求到底有没有到达监听端。有包进来却没有回应,是转发或回程路由的问题。请求从未出现,是过滤或寻址的问题。

阶段 4:在隧道建立之后测试转发

防火墙可以放行会话,却仍然拒绝会话想去的所有地方。转发 sysctl、NAT 规则和回程路由都排在认证之后,给 VPN 端口开一个大范围例外,一条都修不好。内网目标和互联网目标要分别测,因为它们通常因为不同原因失败。如果内网名字不通而地址可用,先看下发的 DNS,再去看规则。

在客户端已连接、正在发起失败请求的时候,在服务器上跑下面三项检查。

隧道接口上的计数器才是关键,因为它能显示包有没有进来、有没有东西出去。

sysctl net.ipv4.ip_forward
nft list ruleset | grep -n -E 'forward|masquerade'
tcpdump -ni tun0 -c 10

包到了隧道却没有任何东西发往目标,可疑的就是转发或 NAT。完全没有包进来,说明会话是通的但客户端没有发送,该看的是客户端的路由表。

验证修复,并移除没有起作用的部分

在获批的更正之后,把失败的那次测试原样重做,并把结果记在同一份配置和同一台设备上。然后移除所有没有改变结果的临时例外,因为不用的例外会不断累积,而每一条都是没人记得做过的决定。剩下的要收窄:一个目标、一个端口、一个方向、一个负责人。

重新执行同样的三条命令,并与改动之前保存的输出对比。

Test-NetConnection vpn.corp.example -Port 443 -InformationLevel Detailed
tracert -h 8 -w 500 vpn.corp.example
Get-NetFirewallRule -Enabled True | Where-Object DisplayName -match 'VPN' | Select-Object DisplayName, Action

当对照网络能用、原网络仍然失败、事件依旧为空时,剩下的可疑对象是路径而不是主机。把两条对照结果一并附上,作为明确的结论交给网络负责人。比起关掉防火墙配置,在这里停下来是更好的选择。

相关文章