iOS 9 为 NetworkExtension引入了许多有用的 API,尤其是自定义 VPN 协议的 API。
这里简单介绍下 NETunnelProvider
这个可以实现自定义 VPN 协议的东西。它有以下几个优点:
创建一个自定义 VPN 协议程序。
- 作为 App 的扩展可以在后台一直运行来处理流量。
- 基于 IP 层的数据包隧道程序
- 基于应用层的 App 的代理程序
可以从 App 里配置和控制协议程序。
NEPacketTunnelProvider
基本原理
假设系统里有一个已经连上了 VPN 的 NEPacketTunnelProvider 运行并且使用的是私有隧道协议,这样你的 App 会试图连接到私有服务器中创建并打开 socket 然后建立 TCP/IP 连接。TCP/IP 的数据包将路由到UTUN0 虚拟接口并转发到 NEPacketTunnelProvider。NEPacketTunnelProvider将接收这些数据包然后用你的睡到将它们封装为隧道协议格式发送到隧道服务器。隧道服务器解析这些数据包将它们发送到内部网络,然后转发到目的地。随后数据包经过服务器的封装被传输给 NEPacketTunnelProvider 来解析它们。通过 UTUN0 接口将它们注入到网络传输堆栈,最后通过 TCP/IP 协议栈将数据包返回给应用程序。
上面是基本原理。
NEPacketTunnelProvider 有很多控制 UTUN0 接口的 API。最重要的是它可以指定路由,这样 IP 目的地将被路由至 UTUN0 接口并穿过隧道。NEPacketTunnelProvider 可以给接口指定虚拟地址、DNS 和应该使用的代理设置,以用于路由经过隧道的数据流量。