VpnService

这段时间项目中使用到了VpnService,整理了一下官方文档的资料

VpnService is a base class for applications to extend and build their own VPN solutions. In general, it creates a virtual network interface, configures addresses and routing rules, and returns a file descriptor to the application. Each read from the descriptor retrieves an outgoing packet which was routed to the interface. Each write to the descriptor injects an incoming packet just like it was received from the interface. The interface is running on Internet Protocol (IP), so packets are always started with IP headers. The application then completes a VPN connection by processing and exchanging packets with the remote server over a tunnel.

VpnService是一个基类,用于应用扩展和构建自己的VPN解决方案。通常,它会创建一个虚拟网络接口、配置地址和路由规则,并返回一个文件描述给应用。每次读取描述都会去检索一个路由到接口的输出数据包。每次写入描述都会注入一个输入数据包,就像从接口收到的一样。这个接口运行在IP协议上,所以这些包总是以IP头开始。应用利用通道上的远程服务器处理和交换数据包,实现VPN连接。

Letting applications intercept packets raises huge security concerns. A VPN application can easily break the network. Besides, two of them may conflict with each other. The system takes several actions to address these issues. Here are some key points:

让应用程序截获数据包会引起巨大的安全问题。一个VPN应用能够轻易地破坏网络。此外,两者之间可能会互相冲突。系统采取了一系列措施来解决这些问题。以下是一些要点:

  • User action is required the first time an application creates a VPN connection. 
  • There can be only one VPN connection running at the same time. The existing interface is deactivated when a new one is created.
  • A system-managed notification is shown during the lifetime of a VPN connection.
  • A system-managed dialog gives the information of the current VPN connection. It also provides a button to disconnect.
  • The network is restored automatically when the file descriptor is closed. It also covers the cases when a VPN application is crashed or killed by the system.
  • 应用第一次创建VPN连接需要用户操作。
  • 同一时刻只能运行一个VPN连接。当一个新的VPN被创建时,已经存在的会失效。
  • 在VPN连接的生命周期中,会显示一个系统管理级通知。
  • 一个系统管理级的对话框提供当前VPN连接的信息。也提供了一个按钮去关闭连接。
  • 当文件描述关闭时,网络会自动恢复。当一个VPN应用崩溃或者被系统杀死后,它的配置仍然有效。

There are two primary methods in this class: prepare(Context) and establish(). The former deals with user action and stops the VPN connection created by another application. The latter creates a VPN interface using the parameters supplied to the VpnService.Builder. An application must call prepare(Context) to grant the right to use other methods in this class, and the right can be revoked at any time. Here are the general steps to create a VPN connection:

这个类中有两个主要的方法:prepare(Context)和establish()。前者用于用户操作和停止在其他应用中创建的VPN连接。后者使用参数创建一个VPN接口提供给VpnService.Builder。应用必须调用prepare(Context)授权,才能使用本类中的其他方法,并且权限可以随时撤销。以下是创建一个VPN连接的一般步骤:

  1. When the user presses the button to connect, call prepare(Context) and launch the returned intent, if non-null.
  2. When the application becomes prepared, start the service.
  3. Create a tunnel to the remote server and negotiate the network parameters for the VPN connection.
  4. Supply those parameters to a VpnService.Builder and create a VPN interface by calling establish().
  5. Process and exchange packets between the tunnel and the returned file descriptor.
  6. When onRevoke() is invoked, close the file descriptor and shut down the tunnel gracefully.
  1. 当用户按下Button去连接时,调用prepare(Context)返回一个intent,如果这个intent不为空,就启动它。
  2. 当应用准备好后,启动这个服务。
  3. 创建一个到远程服务器的通道,为VPN连接协商网络参数。
  4. 提供这些参数给VpnService.Builder,通过调用它establish()创建一个VPN接口。
  5. 在通道与返回的文件描述之间,处理和交换数据包。
  6. 当onRevoke()被调用时,优雅地关闭文件描述与通道。

Services extended this class need to be declared with appropriate permission and intent filter. Their access must be secured by BIND_VPN_SERVICE permission, and their intent filter must match SERVICE_INTERFACE action. Here is an example of declaring a VPN service in AndroidManifest.xml:

1 <service android:name=".ExampleVpnService"
2          android:permission="android.permission.BIND_VPN_SERVICE">
3      <intent-filter>
4          <action android:name="android.net.VpnService"/>
5      </intent-filter>
6 </service>

继承自此类的Services需要声明权限和intent filter。它们必须通过BIND_VPN_SERVICE权限才能安全访问,并且它们的intent filter必须匹配SERVICE_INTERFACE的action。以下是在AndroidManifest.xml中声明一个VPN service的案例:

1  <service android:name=".ExampleVpnService"
2          android:permission="android.permission.BIND_VPN_SERVICE">
3      <intent-filter>
4          <action android:name="android.net.VpnService"/>
5      </intent-filter>
6  </service>
时间: 2024-10-13 11:51:24

VpnService的相关文章

Android英文文档翻译系列(5)——VPNService

API14位于android.net.VpnService 类概述|Class OverviewVpnService is a base class for applications to extend and build their own VPN solutions//VpnService一个为应用程序扩展和建立自己的VPN解决方案的基类.In general, it creates a virtual network interface, configures addresses and

Android 7.0 Nougat(牛轧糖)---对开发者来说

android 7.0出来了.让你的app准备迎接最新的android版本吧,支持节省电量和内存,这样新的系统行为.使用多窗口UI.直接恢复通知以及其他操作来扩展你的app. android 7.0介绍了各种各样的新功能给用户和开发者, 本文重点介绍面向开发者的一些新功能. 确保检查android 7.0的行为变化,了解有关平台的变化可能会影响你的app. 如果要了解更多的关于用户的新功能,请查看www.android.com. 1.支持多窗口 在android 7.0中,我们介绍了在支持多窗口

Android上的OpenVPN-TAP模式/策略路由

睡醒写一篇日志.在Android的OpenVPN Service的FAQ上,关于TAP模式有三问三答,最后回答的建议是:Support TAP via emulation.这也是我自己前几个月实现过的.要问为何Android自己不能提供对TAPmode的支持,似乎不关VPNService作者本人的事,其建议是:If you really want to see tap-style tunnels supported in OpenVPN Connect, we would encourage y

关于Android实现VPN开发方案探索

手上有个Android vpn开发的需求,对这一块也没什么经验,网上找资料发现很有限,整理出来结论如下: 1[知乎]https://www.zhihu.com/question/22675356/answer/22219771 根据 http://stackoverflow.com/questions/10444757/how-to-configure-vpn-programatically 的说法,需要用反射调用一些私有api完成这个工作,还是比较复杂的… https://code.googl

Android Framework 记录之二

原文地址:http://blog.csdn.net/banketree/article/details/24982021 接着上次的记录,续写. 23.services目录 文件 描述 class AlarmManagerService extends IAlarmManager.Stub { //定时管理服务 public class AppOpsService extends IAppOpsService.Stub {  // 程序选项服务 public class AppsLaunchFa

AndroidManifest.xml文件安全探索

secbang.comsimeon 最近在做一些apk的安全检测,对AndroidManifest.xml文件进行了研究和探讨,介绍AndroidManifest.xml文件的作用和架构,并研究了AndroidManifest.xml配置文件存在的一些漏洞,在进行安全检测时,可以对症下药. 0X00 AndroidManifest.xml文件作用 AndroidManifest.xml文件的作用非常重要,应该说是缺一不可.在android官方介绍文档中(https://developer.and

openstack运维实战系列(二十)之neutron创建网络并指定vlan号码

1. 背景说明   neutron在openstack中负责instance的网络,如虚拟机内部网络,虚拟机外部网络等,和实体网络相类似,openstack中的网络也存在路由器router,交换机switch,网络network,子网subnet,端口port等概念,这些功能都有neutron来完成,neutron由有个不同的插件plugins组成,如二层插件neutron-openvswitch-agent,三层插件neutron-l3-agent,动态地址分配neutron-dhcp-age

【译】Android 7.0 for Developers

译者注: 译者:aroundme 原文地址:https://developer.android.com/about/versions/nougat/android-7.0.html 主要是介绍Android 7.0提供新特性. 翻译的动机主要是为了适配Android 7.0,提前踩点.防止大坑. 就翻译来看,除去一些可有可无的更新之外,关注点主要是集中在四点: * 通知栏一系列更新 * 对于应用后台优化(或者说限制) * WebView持续性更新(混合开发需要注意) * 对于GPU的优化,优化3

Ubuntu系统下OpenDaylight源码编译安装

操作系统:Linux x64 / Ubuntu 14.04 研究领域:软件定义网络SDN (Software-defined Networking) 开发组件:OpenDaylight 声明:转载请注明出处及本文链接 一.环境搭建 1. Java+Apache Maven基本开发环境搭建.详见相应的前面两篇文档: <Linux Ubuntu系统下Java开发环境搭建> <Linux Ubuntu系统下Apache Maven的安装和配置> 2. 安装用来获取OpenDaylight