你试用一款免费 VPN 客户端或浏览器扩展一周,把它关掉,网络就断了。Wi-Fi 图标仍显示已连接,同一台路由器上的其他设备一切正常,而唯一能让浏览器恢复的办法就是重新启用这个应用或者卸载它。这种情形并不是加密造成了依赖。它是应用写在了隧道管不到的地方的配置。

客户端改了隧道并不拥有的设置

Windows 或 macOS 上的隐私客户端通常一次动三处地方。它设置系统 HTTP 代理,也就是 Internet 选项里暴露的那个字段。它安装一块虚拟网卡,通常是 TAP 驱动,以便抓包。它还重写解析器列表,而按下断开时消失的只有隧道。

浏览器扩展则是更窄的东西。它通常只改自己的配置文件,或者某一个浏览器所遵循的代理。这就是为什么可能只有一个浏览器坏掉而命令行工具照常工作,或者反过来:扩展从来就没有权限去动其他几层。它改的是哪一层,决定了哪些工具会坏。

无论哪种情况,那个过期的决定都是由没理由撤销它的软件做出的。隧道是可见的部分,也是唯一拥有干净退出路径的部分。其余全部是存放在能活过进程的存储里的设置,所以卸载应用是唯一一步同时撤销这三者的操作。在重装任何东西之前先读这些存储,才能把症状变成诊断。

三处残留,三种不同的故障

第一处残留是指向空处的代理:局域网代理的勾还留着,或者配置脚本 URL 指向一个已经没有进程在监听的 localhost 端口。浏览器把每个请求都转发到那个死端口,然后卡住,直到超时看起来像网络死了。第二处是仍然占着默认路由的网卡,因为 TAP-Windows 设备或厂商的路由驱动在卸载之后仍是一个真实接口。它保留了当初被赋予的路由,流量就消失在并不存在的隧道里。两处残留都不会自我声明;它们看起来都完全像一次断网。

第三处是 DNS,而且它比前两处失败得更早。如果解析器列表里只有能通过隧道访问的服务器,那么在每个页面被请求之前,每次查询都会超时,于是浏览器报的是网站无法访问,而不是代理已死。无论你遇到的是哪一种,它们都不是网络意义上的断网。每一处都是没人撤销的残留,而且各自在不同的地方修复。

自上而下走完四层

从最靠近应用的地方开始往下走,因为这几层的失败顺序正是它们被看见的顺序。每次测试只改一层,改完就重测。一次性全部重置通常能恢复上网,却让你说不出是哪处残留造成的,于是下一次安装又会复现同一个谜题。顺序是:代理、网卡、路由、解析器。

在 Windows 上,每项检查都是操作系统自带的一条命令,不需要安装任何东西。按顺序运行,并把输出放在一起,因为四个答案只有并排看才有意义。它们按这个顺序报告代理、网卡、IPv4 路由和解析器列表:

netsh winhttp show proxy
Get-NetAdapter
route print -4
Get-DnsClientServerAddress

Linux 和 macOS 各有自己的命令,而且不能互换。在 Linux 上,路由来自 ip route,解析器在 systemd-resolved 掌管的地方来自 resolvectl status,回退方案是 cat /etc/resolv.conf。在 macOS 上,路由来自 netstat -rn,解析器来自 scutil --dns,系统代理来自 scutil --proxy。在 macOS 上运行 ip route 的读者会得到 command not found,而那里的 /etc/resolv.conf 是生成的占位文件,不是权威配置。先确认平台再确认层,否则第一条命令本身就成了发现。

对每一层只问一个问题:当应用关闭时,这个值是否还指向确实存在的东西?指向死端口的代理、没有隧道的网卡、经由已断接口的默认路由,以及隧道内部的解析器,答案全都是否。任何一个否都足以解释症状,这就是每次只改一处的重要性。

代理不是隧道

代理接受请求,到别处取回,再把响应交回来,这意味着它知道目的地,也能看到网站自己没有加密的任何内容。它不承载其他协议。除非目的地本身已经使用 TLS,否则它不保护路径。而且它可以被当初安装它的任何东西改掉,无需你参与。

这个区别改变了值得问的问题。当代理留在后面时,要弄清楚是哪个程序还在操纵你的浏览器,而不是隧道是否起来。隧道可能完全健康,也与这次故障毫无关系。

如果你想知道这类客户端究竟做了什么,就去观察它,而不是读它的面板。Process Monitor 记录它碰了哪些注册表键和文件,抓包则显示它的流量去了哪里。两者都是普通工具,也都比任何状态灯更能回答关于残留的问题。两者都不要求应用还在运行。

移除组件,而不是移除证据

持久的修复是移除写下那条设置的东西。卸载应用,删掉它添加的虚拟网卡,清掉代理和解析器列表,然后重启,并在应用仍未安装的状态下测试。如果那时能上网,你找到的是原因而不是变通办法。记下哪一层是过期的,因为同一个厂商往往会把同一个错误犯两次。

如果装上下一款客户端后症状又回来了,在断定是服务弄坏了什么之前,先把四层再走一遍。证据通常还在那儿,就在四处地方之一。第二个应用不会造出第五层;它改的是四层之一。

重装会重置代理,却不会重置过期的网卡,而且它可能在列表里留下两个解析器。正是这种不对称,让先卸载再测试胜过一键重置全部。它同时给你一个基线,供下次连接掉线时对照。

相关文章