扩展显示“关闭”,工具栏图标是灰的,浏览器却仍然从某个意想不到的地方出网。这不是 Chrome 界面的故障。扩展的“关闭”按钮只是应用自己的标签,它底下做的事情是几种代理操作之一,后果各不相同。在再切换任何东西之前,先读实际生效的设置及其来源,因为答案已经显示在那里了。

读实际生效的设置,以及是谁设置的

在受影响的配置文件里打开 chrome://net-internals/#proxy。该页面会显示实际生效的代理配置,更有用的是显示提供它的来源,这告诉你眼前是扩展、系统配置、策略,还是浏览器内置的东西。把它与扩展的说法对比,不一致通常立刻点出元凶。这一步只读,所以在改动任何设置之前先做。

接着打开 chrome://policy,检查与代理相关的策略。受管策略的优先级高于扩展自身的设置,所以一个自称处于活动状态的扩展,可能实际上已被推翻,而它显示的却是完全诚实的状况。

如果两个页面互相吻合,出口却依然不对,剩下的候选就在浏览器之外。

三种都像“关闭”的操作

代理 API 暴露的是模式,而不是单一开关。扩展可以设为直接模式,即浏览器对它覆盖的连接不使用任何代理。它也可以设为系统模式,把决定权交回操作系统配置。或者它可以清除自己的设置,从而移除该设置,让其他生效的东西接管。这是三种不同的结果,只有一种才是用户心里“关闭”的意思。

这个区别很重要,因为按钮上的标签是扩展作者选的,不是 Chrome 选的。

OperationWhat Chrome does with it
Set direct modeNo proxy for the covered browser connections
Set system modeUse the operating system proxy configuration
Clear the extension settingRemove that scope's setting; the effective result depends on the remaining layers

代理 API 参考记录了直接模式与系统模式,并指出系统模式并不等于把配置留空。那一句话就是全文的浓缩。

层与层不一致时,找出真正的主人

Chrome 会合并多个来源的设置,赢家由优先级决定,而不是你点击的先后。策略在扩展之上,扩展又在操作系统配置之上,所以工作管理的代理可能获胜,而个人扩展在自己的弹窗里看起来处于停用状态。要读实际值和它报告的来源,而不是凭记忆去推演那条层级链。

停用扩展、卸载扩展和清除它的设置也是三个不同的动作,只有最后一个才会明确删掉它存下的东西。

无痕模式又多出一层范围。扩展可以为无痕窗口单独保存设置,所以普通窗口里的测试证明不了私密窗口的任何事,而清除一个范围会留下另一个不动。

直接模式不代表什么

直接意味着在这个 API 层没有浏览器代理。它不意味着连接绕过了操作系统的 VPN、逃出了防火墙,或变成明文。如果设备上有全隧道 VPN,直接流量依然进入那条隧道,你观察到的公网地址仍然会是 VPN 出口。把这两件事混为一谈,就会出现用户关掉扩展却什么变化也没看到的困惑局面。

把两层分开测试:内页里浏览器实际生效的代理来源,以及同一台机器上浏览器请求和终端命令各自看到的公网地址。

一次只改一处,再重新测试

改一层,然后在测试其他任何东西之前重新读实际设置。为了拿到不同出口而去清除受管代理,正是支持调查变成违反策略的那一步,所以这件事要交给策略的所有者来决定。把改动前后的来源值记进工单;否则下一位工程师会把整个流程重走一遍。

一个装着三个扩展、一条公司策略和一个系统代理的浏览器配置文件,有四个看似合理的“主人”,而真正在回答的只有其中一个。

相关文章