[译] Apple NetworkExtension 框架

iOS 9 以后,苹果开放了 NetworkExtension 框架,用于定制和扩展核心网络功能。

最近在解决一些 Shadowsocks iOS 客户端的问题,涉及到 NE 框架,而网上又没什么中文资料,只能啃官方文档。 英文看着太慢太累,索性翻译成中文。这里只翻译了一部分开发 SS iOS 客户端需要用到的部分。

# 概述

通过 NetworkExtension 框架,你可以自定义和扩展 iOS 和 macOS 的核心网络功能。具体来说,你可以

  • 更改系统的 Wi-Fi 配置

  • 将您的应用程序与热点网络子系统(热点助手)集成在一起。

  • 创建和管理 VPN 配置,使用内置的 VPN 协议(个人 VPN)或自定义的 VPN 协议。

  • 实施设备上的内容过滤器

  • 实施一个设备上的 DNS 代理

NetworkExtension 框架在 macOS 和 iOS 中都可以使用,但并不是所有的功能都可以在两个平台上使用,而且有些功能有特定的限制(例如,有些功能只在有受监督的 iOS 设备上工作)。每个功能的文档中都会描述这些限制。

# 实现 VPN 的选项

NetworkExtension 框架对 VPN 有广泛的支持。VPN 是一种网络隧道的形式,VPN 客户端使用公共互联网创建一个连接到 VPN 服务器,然后通过该连接传递私有网络流量。

VPN 有很多不同的用途。例如,企业可以设置一个 VPN,让远程员工访问公共互联网上无法访问的企业网络资源。或者是想从一个不受信任的网络访问互联网的消费者,如机场的免费 Wi-Fi,可以设置 VPN 来保护他们的流量。

iOS 和 macOS 包含了许多不同的 VPN API,并以其支持的协议来区分。

  • 使用 Personal VPN 来创建和管理使用内置 VPN 协议之一(IPsec 或 IKEv2)的 VPN 配置。

  • 创建一个 Packet Tunnel Provider,以实现 面向数据包 的自定义 VPN 协议的 VPN 客户端。

  • 创建一个 App Proxy Provider,以实现 面向流量 的自定义 VPN 协议的 VPN 客户端。

# 关于 Always-on VPN

iOS 支持 Always-on VPN,以确保所有 IP 流量通过隧道传输。有关如何配置 Always-on VPN 的信息,请参阅 iOS Deployment Reference

# 话题

# Wi-Fi 管理

# Wi-Fi 配置

添加持续的 Wi-Fi 配置,或将设备临时移动到特定的 Wi-Fi 网络。

# 热点助手

将您的应用程序与 iOS 热点网络子系统集成。

# VPN

# Personal VPN

创建和管理一个使用内置 VPN 协议(IPsec 或 IKEv2)的 VPN 配置。

# Packet Tunnel Provider

实现 面向数据包自定义 VPN 协议 的 VPN 客户端。

VPN 是一种网络隧道的形式,VPN 客户端使用公共互联网创建一个连接到 VPN 服务器,然后通过该连接传递私有网络流量。如果你想建立一个实现面向数据包的、自定义的 VPN 协议的 VPN 客户端,请创建一个 Packet Tunnel Provider app extension

当系统启动一个使用你的 Packet Tunnel Provider 的 VPN 配置时,它会启动你的应用扩展,在该应用扩展中实例化你的 Packet Tunnel Provider 子类,并开始向你的 Provider 转发数据包。你的 Provider 会打开一个隧道到 VPN 服务器,并通过该隧道发送这些数据包。同样,如果你的 Provider 从隧道中接收到数据包,它应该将这些数据包传回系统。

Packet Tunnel Provider 可以在 目标 IP 模式源应用模式 下运行。后者是 per-app VPN 的一种形式(另一种形式是 App Proxy Provider)。

Packet Tunnel Provider 仅在 iOS 和 macOS for Mac App Store 应用程序中可用。

#
  • class NEPacketTunnelProvider Packet Tunnel Provider app extension 主要类。

  • class NETunnelProvider NEPacketTunnelProvider 和 NEAppProxyProvider 的抽象基类

  • class NEProvider 一个用于所有 NetworkExtension Provider 的抽象基类。

  • class NEPacketTunnelNetworkSettings

  • class NETunnelNetworkSettings 虚拟接口的配置。

# 数据包处理
  • class NEPacketTunnelFlow 一个用于读写数据包到隧道虚拟接口的对象。

  • class NEPacket 一个网络数据包及其相关的属性。

  • 运营商内联网 网络 API 供所有类型的 NetworkExtension 提供商和热点助手使用。

# VPN 配置
  • class NETunnelProviderManager 用于创建和管理 自定义 VPN 配置的对象。

  • class NEVPNManager 用于创建和管理 Personal VPN 配置的对象。

  • class NETunnelProviderProtocol VPN 隧道的配置参数。

  • class NEAppRule 流量要通过隧道进行路由的应用程序的身份。

  • VPN 按需规则 设置 VPN 点播。

# VPN 控制
  • class NETunnelProviderSession 一个对象,用于启动和停止一个隧道连接并获取其状态。

  • class NEVPNConnection 一个对象来启动和停止个人 VPN 连接并获得其状态。

# App Proxy Provider

以实现 面向流量 的自定义 VPN 协议的 VPN 客户端。

虚拟专用网络(VPN)是一种网络隧道的形式,VPN 客户端使用公共互联网创建一个连接到 VPN 服务器,然后通过该连接传递私有网络流量。如果你想建立一个 VPN 客户端,实现面向流量的、自定义的 VPN 协议----它的工作原理是通过 TCP 连接的数据,而不是用来传输数据的数据包----创建一个 app 代理提供商 ap p 扩展。

当系统启动一个使用你的 app 代理提供者的 VPN 配置时,它会启动你的 app 扩展,在该 app 扩展中实例化你的 app 代理提供者子类,并开始向你的提供者转发流。每个流代表一个 TCP 连接或 UDP 会话。你的提供者会打开一个隧道到 VPN 服务器,并通过该隧道转发每个流。同样,如果您的提供商从隧道中接收到流数据,它应该通过适当的流传回系统。

应用代理提供商是每一个应用 VPN 的一种形式,另一种是源应用模式下的 Packet Tunnel Provider。

App 代理提供商仅在 iOS 中支持托管设备上的 App 代理提供商,在 macOS 中仅在 Mac App Store 应用商店应用中支持。

# 内容过滤器

# 内容过滤器供应商

创建一个设备上的网络内容过滤器。

# 过滤网络流量

使用网络扩展框架来允许或拒绝网络连接。

# DNS 代理

# DNS 代理供应商

创建一个设备上的 DNS 代理。

# 参考

# 网络扩展枚举

# 网络扩展常量

# NEPacketTunnelProvider

NEPacketTunnelProvider 类通过 packetFlow 属性赋予其子类访问虚拟网络接口的权限。使用 setTunnelNetworkSettings(_:complementHandler:) 方法指定以下网络设置与虚拟接口关联。

  • 虚拟 IP 地址

  • DNS 解析器配置

  • HTTP 代理配置

  • 通过隧道路由的 IP 目标网络

  • IP 目的网络被路由到隧道外的 IP 目的网络。

  • 接口 MTU

通过指定 IP 目的网络,Packet Tunnel Provider 可以决定哪些 IP 目的网络将被路由到虚拟接口。然后,具有匹配的目标地址的 IP 数据包将被转发到 Packet Tunnel Provider,并可以使用 packetFlow 属性读取。然后,Packet Tunnel Provider 可以按照自定义的隧道协议对 IP 数据包进行封装,并将其发送到隧道服务器。当 Packet Tunnel Provider 对从隧道服务器接收到的 IP 数据包进行解封装后,可以使用 packetFlow 属性将数据包注入到网络栈中。