iftop 画面一次只回答一个问题:你指定的那个网卡上,哪些主机对在交换字节。它不能回答每个应用是否遵守 VPN 策略,空画面也证明不了没有泄漏。大部分泄漏测试的争论,恰恰错在这两句话之间的差距上。屏幕到底意味着什么由三个条件决定,而这三个条件都写在你用过的那条命令行里。

三个条件决定画面意味着什么

这三个条件是:显示的是哪个网卡、过滤器和工具自身藏起了什么、测试究竟跑过什么。请按这个顺序回答,因为第一条错了,后两条就没有意义。

网卡这一条重要,是因为隧道视图和物理视图显示的是同一份流量的不同层。看隧道网卡看到的是隧道内的流;看物理网卡看到的是隧道的承载,外加共享这条链路的任何合法配置、控制或本地流量。两种视图都不算错,也都不是全貌。说出你在看哪一个,才是证据与印象的区别。

条件一:显示的是哪个网卡

iftop 用 -i 显式指定网卡,它的手册也写明了不指定时的行为:它会自己挑一个,挑中的可能是那个看起来对外的设备,而不是隧道。这个默认值对带宽工具合理,对泄漏测试很差。

永远显式传网卡,并把它写在结果旁边。没有网卡名的截图无法复现。

条件二:过滤器和工具藏起了什么

iftop 接受过滤表达式,被过滤器排除的流是因为构造而不可见,不是因为不存在。工具默认还会做主机名查询来给地址打标签,而那些查询本身会产生 DNS 流量,也就是你并不打算观察的流量。-n 关掉查询并让显示变成数字;事后再隐藏 DNS 行,并不等于没有产生查询。

这个区别值得直说,因为它在别的工具里同样出现:压制某种活动的显示,不等于阻止它发生。如果 DNS 查询是你测试的一部分,就在关闭查询的情况下跑测试,免得观察被观察者自己污染。

条件三:测试究竟跑过什么

来自一个应用、发往一个目的地、在一个地址族中的一次请求,只能证明这次请求本身。它证明不了另一个应用、另一个目的地或另一个地址族的任何事,而恰恰是这类检查最常忘掉 IPv6。

所以在开始前先把请求定义清楚:无害的目的地、你关心的应用、你关心的地址族、隧道处于已批准状态。然后去核对接收侧或客户端自己的诊断,因为远端知道到达了什么,本地画面做不到。接着再跑已批准的「隧道不可用」情形,看流量是否停下,这通常才是要求真正针对的行为。

DNS 值得单独观察。查询的接收方和查询走过的路径是两件事,带宽画面一件都不显示。

把 iftop 当作辅助证据

到这时 iftop 才提供价值,而且是作为佐证。sudo iftop -i wg0 -n -B -P -f "host 203.0.113.9" 会显示预期的那条流是否出现在预期的网卡上,并给出字节数,让「空闲」这一说法可以被核查。

把它和 ss -tnp 的套接字层视图、ip route get 的内核会选的路由放在一起看,你就得到对同一次请求的三份观察,而不是对一台机器的一份印象。iftop 手册记录了网卡选择、过滤器语法和查询行为,这三样正是泄漏测试所依赖的。带宽画面只负责定位活动;路由、例外和失败时的行为才决定这份活动是否满足要求。

相关文章