如何删除 Windows VPN 遗留的过期路由
找出真正过期的那条记录,在正确的策略存储中预览删除操作,并确认查找会选中你预期的接口。
你的会话几小时前就结束了,适配器已经消失,路由却还留在表里,指向接口 42。删除那一行只需要一条命令;判断它是不是正确的那一行,却需要四项检查。路由表是共享的,所以大范围删除会带走其他连接仍在使用的路径,包括承载隧道的那一条。下面的每一步都在收窄目标,直到只可能匹配一条记录。
1. 判断这条记录是过期还是有意为之
经历过一次重启仍然存在的记录,一定是在某处被写入的,而那个某处通常是决定,不是意外。拆分隧道依赖的正是看起来像残留的路由,而把某个前缀推入隧道的策略,在单次列表里与过期记录无法区分。要问路由是什么时候出现的:只在隧道运行期间存在的路由属于客户端的配置,因此清理命令是错的工具。删掉一条有意配置的路由,下一次连接就会在没人注意的步骤上失败。
端点路由值得单独警告。当客户端为 VPN 服务器添加一条主机路由,让加密数据包能经本地连接抵达它时,删除那条路由会让隧道在下一次重连时崩溃,而症状会被读成服务器故障。动手之前,先把目标与客户端连接的地址对比:与 VPN 服务器相符的单个公网地址是外层路径,不是垃圾。
2. 记录能唯一确定这条记录的四个字段
只有前缀并不构成身份,因为两个接口可能持有通往同一目标的路由。记下目标前缀、接口索引、下一跳和策略存储,因为这四个值恰好描述一条记录。一条列表就能给出全部:
Get-NetRoute -AddressFamily IPv4 | Sort-Object RouteMetric按度量排序会把机器真正偏好的路由抬上来,残留通常就坐在那里。在隧道运行期间比较一次,丢下之后再比较一次:随适配器一起消失的是客户端写入的,留下来的则是别的东西写的。策略存储是大家会跳过的字段,而它恰恰能解释重新出现——从活动存储中删除的记录,会在下次策略刷新后回来。在运行任何改变状态的东西之前,先把这四个值写下来。
3. 先预览删除,再删除一条记录
Remove-NetRoute 接受 Get-NetRoute 打印出的同一前缀和接口索引,而且有预览开关,所以不必猜。按这个顺序运行这一对命令:
Remove-NetRoute -DestinationPrefix 10.20.0.0/16 -InterfaceIndex 42 -WhatIf
Remove-NetRoute -DestinationPrefix 10.20.0.0/16 -InterfaceIndex 42预览会打印将要删除的对象,所以在松开开关之前,把前缀、接口和下一跳与笔记核对一遍。两行都不会触及永久记录,因为活动存储是默认目标;如果你识别出的路由住在那里,就要加上 -PolicyStore PersistentStore,否则删除看起来成功了,记录却会在下次策略刷新时回来。会话是远程的时候,要保留带外恢复路径,因为删掉承载你自己连接的那条路由,连接就断了。绝不要伸手去拿清空整张表的命令。
4. 找出把它放回去的组件
只要所有者仍被配置为安装这条路由,删除就不是修复。所有者通常是三者之一:带拆分隧道列表的 VPN 客户端配置文件、在登录时添加路由的脚本或计划任务,或者应用到这台机器的域策略。先检查配置文件,因为每次连接它都会运行:
Get-VpnConnection | Select-Object Name,SplitTunneling,ServerAddress
Get-NetRoute -PolicyStore PersistentStore永久记录无需连接任何东西就能看到,所以重启后在没有 VPN 会话的情况下回来的路由,几乎总是住在那份存储里,或者住在启动脚本里。在那里修正所有者,手动删除就从治疗变成了验证。
5. 验证查找、邻居和笔记
干净的结果不是「路由没了」,而是查找现在选中的是你预期的接口。问机器一个发往受影响前缀的数据包会走哪里,因为残留仍然指向已死的索引,而干净的答案会指向链路本地接口或正确的网关。Find-NetRoute 一次回答一个地址:
Find-NetRoute -RemoteIPAddress 10.20.4.7然后再测一个邻居:选一个拆分隧道仍需要的第二个前缀,确认它的查找没有变化,因为多删一条路由正是这次清理容易犯的错误。重试最初失败的应用,并记下现在由哪个组件拥有这个前缀。Microsoft 的 Get-NetRoute 文档列出了你在第二步记下的字段。半年之后,正是那条笔记阻止同一条记录被诊断两次。