【问题标题】:How to achieve VpnService's protect in an iOS VPN?如何在 iOS VPN 中实现 VpnService 的保护?
【发布时间】:2021-10-22 18:24:41
【问题描述】:

我正在将 Android 设备的 VPN 应用程序移植到 iOS(使用 NEPacketTunnelProvider)。

Android 使用以下 API 为某些 tcp/udp 连接提供绕过 VPN 的机制:

class VpnService {

  // ...
  
  public boolean protect(int socket) { /* ... */ }

我在 iOS 中没有看到等效的 API。如何为 iOS 实现等效功能?

【问题讨论】:

  • 如果您想包含或排除网络扩展接收的流量,特别是 Packet Tunnel Provider,它通过包含和排除路由支持。用于此的类是NEPacketTunnelNetworkSettings。这将允许操作系统决定是否将某些流量定向到您的 VPN 扩展。但是,一旦您的 NE 收到流量,就无法绕过 VPN。您必须处理您在 NE 中收到的流量。
  • 您需要更多的VPN经验;问题是关于有选择地排除连接(不被路由),而不是一次性排除整个 IP 地址。
  • "once your NE has received the traffic" 问题是关于排除服务本身创建的连接,以及在进行任何流量之前(例如,正是提到的 protect 方法所做的)。

标签: ios vpn tunnel networkextension android-vpn-service


【解决方案1】:

来自 Android 并且对 Apple API(Swift 和 ObjC++ 语言除外)一无所知,我将尝试指出普通开发人员想知道的内容。


iOS 应用程序的生命在视图关闭的那一刻结束,因此永久 VPN 服务只能在扩展中实现,这与您的视图的目标完全不同(因为 iOS 没有服务概念)。

除了了解上述内容之外,还要了解从您的扩展程序中创建的任何连接(又名 Socket)都被神奇地排除(又名受保护)通过packetFlow(又名隧道)这一事实,无论它是否是原始套接字由 Swift5 中的 C/C++ 或 OOP-Wrapped 类制作。

令人惊讶的是,实际上让您的扩展程序的套接字通过隧道要困难得多,
你需要使用NEPacketTunnelProvider 类的方法:

- createTCPConnectionThroughTunnelToEndpoint:enableTLS:TLSParameters:delegate:

- createUDPSessionThroughTunnelToEndpoint:fromEndpoint:

注意上面是实例方法,也就是ObjC中减号的意思,
所以只能在扩展上下文中使用(但无论如何,App-targets 都不会从隧道中逃脱)。

另请参阅:https://developer.apple.com/forums/thread/94430

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 2016-12-01
    • 2012-04-30
    • 2017-11-09
    • 2021-11-09
    • 2012-08-20
    • 1970-01-01
    • 2020-03-24
    • 2017-11-22
    相关资源
    最近更新 更多