iOS:有些应用程序似乎绕过了 NEPacketTunnelProvider如何强制执行?

问题描述

我正在开发一个 NetworkExtension,它使用 NEPacketTunnelProvider 提供类似 VPN 的隧道,以便我可以修改流量。

这对我迄今为止尝试过的基本上所有应用都非常有效,但 Facebook Messenger 似乎可以忽略它。我首先看到流量通过隧道,应该被阻止(用于测试),但随后消息还是成功发送了。

对我来说,这表明 Messenger 首先通过隧道,当它不起作用时,它有某种后备。无论我使用的是 Wifi 还是蜂窝数据,都会发生这种情况。起初我认为它可能会在 WiFi 不工作时以某种方式回退到蜂窝网络,但即使我在 iOS 级别禁用蜂窝网络,当隧道处于活动状态时,Messenger 仍然可以工作。

我尝试获取所有系统路由(即 IP 和掩码)并在 includedRoutes 上手动将它们设置为 NEIPv4Settings,但这没有任何效果

这看起来像是 Messenger 确实绕过了 VPN 隧道吗?或者也许还有其他事情在起作用?

到目前为止,我已经尝试了基本上所有的配置组合,似乎没有任何东西对 Messenger 产生任何影响。 Signal、Instagram、YouTube等应用可以通过隧道成功断网。

编辑:在 Apple 官方论坛上找到了这个:https://developer.apple.com/forums/thread/122330

实际上,Facebook Messanger 会将流量发送到 iOS 中的所有活动界面。当从设置中禁用移动数据时,它甚至会通过蜂窝网络发送流量。

编辑 2:我尝试了新的 iOS 14 配置选项 includeAllNetworks,它似乎适用于 Messenger,但不知何故弄乱了 Signal 或 WhatsApp 等其他应用程序。

当我没有打开这个标志时,Signal 与我的 VPN 一起工作,我可以看到它的流量,但是当我启用这个标志时,Signal 既不发送也不接收消息。

解决方法

应用程序可以使用低级 API 并通过某些接口强制流量(例如使用绑定),并走出您的 VPN。

强制使用 VPN 的方法是在您的 VPN 配置中启用标志 includeAllNetworks -

manager.protocolConfiguration!.includeAllNetworks = true