返回博客
·9 分钟阅读·productdevbook

如何在 macOS 上监控 VPN 流量

在 macOS 上看清 VPN 隧道究竟承载了什么:单应用流量、加密开销与泄漏检测。

  • VPN
  • macOS
  • Bandwidth
  • Privacy

你连上 VPN,跑了一次报国家正确的网页检查,就以为现在所有东西都走隧道了。两天后你注意到其中某个应用——比如某个老聊天客户端或同步代理——这段时间一直直接跟公网通信,完全无视隧道。VPN 是开着的。漏在某个进程上,它在隧道起来之前绑定到物理接口,然后再没松手。

在 macOS 上监控 VPN 带宽一部分是确认 VPN 在做它的工作,一部分是抓住悄悄绕过它的应用。这篇覆盖 utun 接口实际是什么、用内置工具怎么读 VPN 流量、怎么检测泄漏、以及怎么测量隧道增加的开销。如果你在搜"Mac 监控 VPN 带宽"是因为 VPN 自己面板说得不够多,下面的工具集回答更难的问题。

utun 接口是什么

VPN 客户端在 macOS 上连接时会创建一个虚拟接口——通常叫 utun0utun1utun2 等等("utun" 代表 "user tunnel")。VPN 进程读 OS 路由到该接口的数据包,加密并封装它们,把得到的封装包通过你的物理接口(典型情况下 Wi-Fi 是 en0)写出去。

终端里跑这个看当前在跑什么:

ifconfig | grep -E "^(en|utun)" -A 3

你会看到类似:

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 192.168.1.42 netmask 0xffffff00 broadcast 192.168.1.255
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
        inet 10.8.0.6 --> 10.8.0.1 netmask 0xffffff00

en0 是你真实的网络。utun0 是 VPN。一些 VPN 客户端创建多个 utun 接口(一个数据面、一个控制面);一些创建 utun9 或更高以避免和 iOS 风格的个人热点隧道冲撞。

怎样用 nettop 监控 Mac 上的 VPN 带宽流量

nettop 内置于 macOS,是看进程在用哪个接口最直接的方式。相关调用:

sudo nettop -P -m route

这按路由分组显示每个进程的连接。走 VPN 的进程会显示流量经 utun 接口;绕过隧道的进程会显示经 en0(如果是以太网就是 en1)。

盯 nettop 一分钟,然后问:哪些应用在用 utun0、哪些在用 en0?如果你想要一切走隧道,但看到 Slack 在 en0,那是漏。

-P 标志按进程聚合;-m route 显示路由列。加 -x 显示字节数。加 -c 加延时做周期刷新,例如 nettop -P -c 2

ova 对 VPN 流量显示什么

ova 这种按应用监控看到的是 nettop 看到的同一份内核统计,并按时间汇总。ova 里归到 "Slack" 的带宽包含 Slack 发的所有——经 en0 还是 utun0 不改变按进程总数。所以 ova 干净地回答"Slack 用了多少?"。它目前不把按应用数字按接口拆——如果你需要那种细粒度,nettop 是工具。

对多数 VPN 用户这没事。你通常想要回答的问题是:

  • "我的 VPN 客户端自己用的带宽是不是符合预期?"
  • "过去一小时有没有什么尖峰?"
  • "现在最重的是哪个应用?"

ova 一眼给你全部三个,加上辅助进程归并,所以 Slack 辅助 PID 不会显示成单独行。VPN 客户端自己(Tailscale、Mullvad、ProtonVPN、NordVPN 等)作为一行出现,它的数字是经过你物理链路出去的封装/加密总量。

按应用历史
ova 保留可拖动历史,可以对比 VPN 启用前后的带宽——差值就是加密开销。

检测泄漏

VPN 泄漏是某个应用的流量绕过隧道直接走互联网。原因包括:

  • 应用在 VPN 起来之前缓存了路由还在用。
  • VPN 不路由某些目的地(局域网、组播、到特定服务器的 DNS)。
  • macOS 的"排除本地网络"开关在做它字面写的事。
  • VPN 是分流隧道,某个特定应用在旁路名单里。
  • IPv6 启用着但 VPN 只路由 IPv4(常见原因)。

诊断回路:

  1. VPN 连着时跑 nettop -P -m route,看有没有任何你预期被隧道的进程显示 en0 流量。
  2. ova 交叉核对按进程带宽。如果一个进程在 ova 里显示流量但 nettop 里没有 utun 行,它在漏。
  3. 在网络层面确认:从浏览器访问 ipleak.netdnsleaktest.com。报告的 IP 应该是 VPN 出口,不是你家/办公室。
  4. 特别针对 DNS:跑 scutil --dns | grep nameserver——列出的名字服务器应该是 VPN 的,不是你 ISP 的。

特别针对 IPv6,最安全的设置是要么用显式路由 IPv6 的 VPN,要么连接时全系统禁用 IPv6。按网络禁用:系统设置 → 网络 →(你的网络)→ 详细信息 → TCP/IP → 配置 IPv6 → 仅本地链路。

测量 VPN 开销

VPN 在两个方面增加开销:吞吐量(你拿到比实际线速少)和延迟(每次往返多一跳)。

吞吐量开销

加密税取决于协议:

  • WireGuard:在快链路上典型 5 到 10% 开销。Apple Silicon 上有硬件加速。
  • OpenVPN:15 到 30% 开销。CPU 受限,高速时比 WireGuard 慢。
  • IKEv2/IPsec:10 到 20% 开销。macOS 原生支持。
  • 专有协议(Lightway、基于 WireGuard 的 NordLynx 等):约 WireGuard 级效率。

测量方法:VPN 关闭时跑测速,记结果。VPN 开启时对同一都市区的服务器跑同样测试。比例就是开销。两次测试时都用 ova——测速客户端显示的按应用流量应该是应用层吞吐;VPN 测试时系统级速率因为加密封帧而更高。

延迟开销

VPN 关闭时跑 ping 8.8.8.8,记稳态 RTT。连 VPN,再跑 ping 8.8.8.8。差值是加密、走到 VPN 出口、回来的往返成本。典型数字:

  • 同城市的 VPN 出口:+5 到 +15 ms。
  • 另一国家的 VPN 出口:+50 到 +200 ms,看地理位置。
  • 不同大洲的 VPN 出口:+150 到 +400 ms。

这多数情况下是不可避免的物理——你没法隧道到东京而不付往返代价。

识别 VPN 自己的带宽用量

VPN 客户端进程自己作为单独一行出现在 ova 里——"Mullvad VPN"、"Tailscale"、"ProtonVPN" 等。你看到的数字是经你物理链路出去的加密、封装总量。这是回答"VPN 在消耗多少真实互联网带宽"的合适数字。

一个有用的合理性检查:任何时刻,VPN 报告的带宽应该约等于所有其他用它的应用之和,加上一小份加密开销。如果差很多,有别的事在发生——分流、漏、或者 VPN 客户端在做维护工作(密钥轮换、对端发现)。

看 ova 实战

一眼可瞄的菜单栏带宽监控——本地、签名、约 3 MB。

下载 macOS 版

始终在线 VPN:陷阱

几款 VPN 客户端提供"kill switch"或"始终在线"模式,隧道掉时阻止所有流量。有用,但有意外:

  • 唤醒后头几秒可能在隧道重建之前有未阻止的流量。一些客户端显式守住;其他不。
  • Wi-Fi 网络切换(家到咖啡馆)触发短暂断连。kill switch 应该守住但实现各异。
  • 一些应用有激进重连逻辑——隧道断时每 100 ms 重试一次。隧道回来时是一次重连时的带宽尖峰。

VPN 开着从睡眠唤醒后立刻盯 ova。规律通常是:VPN 客户端自己因为重新握手显示一个小涌动,然后 5 到 30 秒内单个应用开始涌动,因为它们在重连自己的 socket。如果你看到唤醒时 200 MB 尖峰,那通常是 Slack/Discord/iMessage 一起追账。

按应用路由与分流隧道

一些 VPN 客户端支持只把特定应用走隧道。用例是"把我的种子客户端通过 Mullvad 发出去,但让 Slack 直走,这样视频通话不增加 VPN 延迟"。

用 nettop 验证分流规则:

sudo nettop -P -m route

被分流的应用应该只显示 en0 流量;被隧道的应该只显示 utun。如果同一进程两者都出现,规则没干净执行——通常因为应用持有早于规则变化的长生命周期 socket。重启应用清掉它们。

监控多个 VPN 连接

资深用户有时同时跑两个 VPN——比如 Tailscale 用来访问公司内部服务,加上商业 VPN(Mullvad、Proton)做一般互联网隐私。macOS 通过路由表处理这个:更具体的路由(Tailscale 的 100.64.0.0/10)胜过更宽泛的(商业 VPN 的默认路由)。

ifconfig 里你会看到多个 utun 接口。用 netstat -rn | head -30 读路由表——第一条匹配的路由胜出。ova 显示总按应用带宽不区分哪条隧道;要那个,nettop 的 -m route 视图是参考。

接下来做什么

10 分钟的端到端 Mac VPN 带宽监控审计:

  1. 连 VPN。
  2. 打开菜单栏的 ova,记下当前活跃应用。
  3. 终端里跑 sudo nettop -P -m route
  4. 交叉核对:在 ova 里显示有意义带宽的每个应用,连接应该都出现在 nettop 的 utun0(或你 VPN 用的 utun)下。这些进程的任何 en0 流量都是漏的候选。
  5. 访问 ipleak.net 确认 IP 和 DNS 经 VPN 出口。
  6. 断开,跑测速,重连,再跑一次。算开销。

走完这一遍你会知道你的 VPN 是不是真的在做你以为的事、它的开销实际是多少、以及哪些应用要盯着。这比你 VPN 客户端菜单栏里"已连接"指示器是更强的答案。