测试始于一句有人希望其为真的话,而证据要么支持它的一个狭窄版本,要么什么都支持不了。公开地址检查只显示某一次请求用了哪个出口。它不显示服务商保留了什么、谁能读到,也不显示一个从未完成的会话会怎样。把测试当作有记录的程序来走,你就不会声称超出测量所能承载的范围。

选择一个可观察的声明

在打开任何工具之前,把声明写成一句可检验的话:在此配置下、在此网络上,发往公开地址回显的请求经由服务商声明的出口离开。这句话点明了主体、条件和观察,正因如此它才可被证伪。像 VPN 保护隐私这样的声明没有可观察的形式,所以任何测量都无法裁定它。为测试不会覆盖的内容留第二句话,因为留存、第三方访问和流量关联都落在浏览器测试之外。

第二句话要事先写好,而不是等结果出来再写。在结果尚未揭晓时对范围保持诚实,比一张令人安心的截图进了工单之后再补要容易得多。事后追加的范围说明,往往描述的是结果而不是问题。

读者复现测量所需的配置事实

配置正是让结果可复现的东西,也恰恰是答案看起来不错时人们会跳过的部分。版本字符串、配置名、接入网络和地址族都应写进记录,连同任何可能把流量带出隧道的分流规则。还要点明被测事件,因为正常连接、意外掉线、手动断开和网络切换所适用的规则各不相同。把这些事件混在一起的测试,对其中任何一种都证明不了什么。

在你有权测试的环境中,使用不敏感的流量。抓取无关数据包会让记录显得技术化,却只增加暴露而不增加证据。把抓包只对准隧道接口,并设置文件大小上限,以免长时间运行把磁盘写满。在改动任何东西之前先停止抓包,好让文件与你写下的配置行对应。

说明测了什么,以及它意味着什么

记录工具打印了什么,以及工具能看到什么。解析器应答、地址回显结果和路由查询回答的是不同问题,而网页里的位置标签是对数据库的推断,不是关于出口的事实。把产生每一行的命令写在旁边,因为没有命令的值无法复现。时间戳要与变更工单处在同一时区,否则一周之后顺序就读不懂了。

curl -s https://icanhazip.com
curl -s https://ipinfo.io/ip; echo
resolvectl status --no-pager | head -15

两个独立回显服务结果一致,比只有一个更强;而两者不一致本身就是一个值得记下的发现。 解析器的输出显示 DNS 是走了隧道,还是继续使用本地网络,这是与出口地址分开的另一项声明。保存带时间戳的原始输出,并保留相反的结果,而不是最令人安心的那张截图。当某项改动使结果移动时,一次只改一个变量,因为同时更换服务器和客户端会让你说不清哪一个起了作用。

记录里该有什么,什么必须删掉

保留方法、非机密输出和局限,其余的都删掉。带有凭据的配置、私有主机名和账号标识不必随证据一起流转,而一份泄露它们的测试记录,已经损害了它本该证明的东西。下面五个字段,是仍能经得起交接的最短形态。

FieldWhat to write
ClaimOne testable sentence naming the profile, the network and the observation
Observer and scopeWho could see the traffic or the record, and under which conditions
SetupClient and server versions, profile name, access network, address families, split-tunnel rules, event under test
Raw resultTool output with a timestamp, exit addresses from both echo services, resolver answer
What it does not supportRetention, third-party access, correlation, untested address families

附上你用来对照的政策声明,连同它的日期和适用范围。RFC 6973围绕具名观察者和明确范围来框定隐私分析,而这个框架适合测试记录:谁能观察到什么、在什么条件下观察,以及哪些部分始终未被检视。

最后用一段话说明证据支持什么、不支持什么。那一段就是交付物,上面的一切都是为了让这段话诚实。如果必须对每个分句都加以保留才能写出来,那么这次测试所测到的,就少于工单所声称的。

相关文章