eoe 移动开发者论坛

 找回密码
 加入eoe

QQ登录

只需一步,快速开始

查看: 786|回复: 5
收起左侧

[Android实例] Android VPN开发二

[复制链接]

签到天数: 216 天

连续签到: 1 天

[LV.7]常住居民III

3

主题

293

帖子

1845

e币
QQ认证社区认证会员
发表于 2017-3-21 14:01:14 | 显示全部楼层 |阅读模式

没有eoe的账号,级别还太低,出门如何吹牛逼?

您需要 登录 才可以下载或查看,没有帐号?加入eoe

x
建立VPN连接在VPN应用被准备完成并且获取到了执行所需要的权限之后即可启动VpnService组件,创建一个指向VPN网关的隧道,然后协商VPN连接需要的网络参数。接下来,VpnService使用协商的参数创建VpnService.Builder类,然后调用VpnService.establish()方法获取读写数据包用到的文件描述符。其中,establish()方法将会:首先检查调用者应用和得到当前建立VPN连接权限应用的UID是否匹配,保证两者相同。然后检查当前Android用户是否拥有建立VPN连接的权限,并且验证该服务的绑定需要BIND_VPN_SERVICE权限;如果服务中没有对这个权限进行要求,就会被认为是不安全的,并且抛出SecurityException异常。之后使用原生代码创建并配置一个隧道接口,然后设置路由和DNS服务器。
将VPN连接状态通知用户建立VPN连接的最后一步是显示一个运行状态通知,告知用户网络流量通过VPN隧道进行发送。而且通过相关的控制对话框,用户可以对连接进行监视和控制。OpenVPN Android应用相关的对话框如图9-11所示。

该对话框是专用包com.android.vpndialogs的一部分,这个包是非系统用户管理基于应用的VPN连接唯一可用的包。这样保证了VPN连接只能够通过系统授权的UI进行启动和管理。
利用基于应用的VPN架构,应用可以自行实现网络隧道并且使用任何认证和加密方法。因为设备发送或接收的所有数据包都会通过VPN应用,所以VPN应用不仅可以用来建立网络隧道,而且可以用来进行流量记录、过滤和修改(比如屏蔽广告)。
NOTE若想获取一个可用的、使用Android凭据库管理认证密钥和证书的、基于应用的VPN工具的实现,请查看OpenVPN for Android 的源码。该应用实现了一个完全兼容OpenVPN服务器的SSL VPN客户端。
多用户支持正如上文提到的,在多用户设备上,只有设备所有者用户才能够控制legacy VPN。然而,在Android 4.2和之后版本中增加了多用户的支持,允许所有次级用户(除了在受限设置,即restricted profile的情况下,所有次级用户必须共享主用户的VPN连接)启动基于应用的VPN。虽然这样允许每个用户自行启动各自的VPN,但是只能同时启动一个基于应用的VPN,所有设备用户的流量都会通过当前激活的VPN,启动这个VPN的用户是谁并不会造成影响。在Android 4.4中引入了对于多用户VPN的完整支持:增加了per-user VPN,允许每个用户使用各自的VPN连接,因此实现了多用户之间的隔离。
Linux高级路由Android使用了多个Linux内核的高级包过滤和路由特性来实现per-user VPN。这些特性(通过netfilter内核框架实现)包含了Linux的iptables工具的owner模块,能够使用数据包生成进程的UID、GID或者PID对数据包进行匹配。例如,清单9-12中的Œ命令创建了一个丢弃所有UID为1234的用户发送的数据包的包过滤规则。

清单9-12:使用iptables进行拥有者匹配和数据包标记
此外,netfilter的另外一个重要特性是能够为特定数据包打上特定的数字标签(mark)。例如,的规则将所有目标端口为80(通常是网站服务器)的数据包标记上0x1。之后这个标记可以被用来进行过滤和路由。比如,通过添加将标记的包发送给预定义的路由表(本例中为webŽ)的路由规则,将标记的包通过特定的接口进行发送。最后添加一条路由,将匹配web路由表的数据包发送到em3接口。
多用户VPN的实现Android使用之前提到的包过滤和路由特性,将特定Android用户的所有应用产生的数据,全部发送给该用户启动的VPN应用所创建的隧道。当设备所有者用户启动VPN的情况下,所有受限用户无法自行启动VPN,而是必须共享所有者所创建的VPN连接。
这种隔离路由的方法通过系统层NetworkManagementService实现,并且提供了管理UID或UID粒度的包匹配和路由的API。NetworkManagementService通过向以root运行的原生netd守护进程发送命令来实现这些API,因此可以修改内核的包过滤和路由表。而netd通过调用iptables和ip用户态工具进行内核层包过滤和路由的配置。
之后我们通过一个例子讲解Android的per-user VPN路由,如清单9-13所示。主用户(用户ID为0)和次级用户(用户ID为10)各自启动了一个基于应用的VPN。主用户的隧道接口为tun0,次级用户的为tun1。设备中也包含了一个受限用户,其用户ID为13。清单9-13中显示了当这两个VPN都被连接成功之后的内核包过滤表状态(忽略了一些不重要的细节)。
清单9-13:两个不同的设备用户启动VPN之后的包匹配规则

向外的数据包将会首先被发送给st_mangle_OUTPUT链,其负责对数据包进行匹配和标记。不需要进行per-user路由(已经被标记上0x1Œ)和来自于legacy VPN(UID 1016,表示内置vpn用户,负责启动mtd和racoon守护进程)的数据包不被修改直接通过。
接下来,由UID在0和99999之间的进程(由主用户启动的应用进程,详见第4章)产生的数据包会被匹配,并被发送给st_mangle_tun0_ OUTPUT链Ž。而由受限用户(用户ID为13)启动的进程(UID在1300000~1399999之间)产生的数据包也会被发送到同一个链。因此,主用户和受限用户的流量会被以同样的方式进行处理。而由第一次级用户(用户ID为10,UID为1000000~1099999)产生的数据包会被发送给一个不同的链,st_mangle_ tun1_OUTPUT。目标链本身非常简单:st_mangle_tun0_OUTPUT首先会清除包原来的标记并标记上0x3c‘;st_mangle_tun1_OUTPUT会做相同的处理,但使用的是标签0x3d’。在数据包被标记之后,这些标记会被用于实现不同的路由规则,如清单9-14所示。
清单9-14:两个不同的设备用户启动VPN之后的路由规则

可以注意到,清单中的两条规则针对每个标记创建,而且关联不同的路由表。拥有0x3c标签的数据包会被发送给路由表60(十六进制0x3cŒ),而拥有0x3d标签的数据包会被发送给路由表61(十六进制0x3d)。路由表60将所有流量发送给主用户创建的tun0隧道接口Ž,而路由表61将所有流量发送给次级用户创建的tun1接口。
NOTE 虽然Android 4.4中引入的VPN路由方法提供了更多灵活性,而且允许隔离不同用户的流量,但是在撰写本书时,这个实现还有很多问题,特别是在不同接口之间进行切换的 场景下,比如移动网络和Wi-Fi之间的相互切换。这些问题在之后的Android版本中可能会被改进,可能会修改包过滤链与接口的关联方式,但是基本策略的实现方法应该会保持不变。

签到天数: 142 天

连续签到: 1 天

[LV.7]常住居民III

0

主题

326

帖子

1522

e币
发表于 2017-3-22 08:28:08 | 显示全部楼层
看看看看。。。。。。。。。。

签到天数: 142 天

连续签到: 1 天

[LV.7]常住居民III

0

主题

326

帖子

1522

e币
发表于 2017-3-27 08:29:00 | 显示全部楼层

签到天数: 14 天

连续签到: 1 天

[LV.3]偶尔看看II

5

主题

145

帖子

1705

e币
发表于 2017-4-10 14:39:12 | 显示全部楼层
看看VPN的相关内容

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

0

主题

5

帖子

15

e币
发表于 2017-8-13 22:17:14 | 显示全部楼层
请问有源码吗,我现在需要做一个VPN的连接,但没找到合适的资料

该用户从未签到

1

主题

82

帖子

910

e币
发表于 2017-12-28 04:28:24 | 显示全部楼层
推哈网是国内首家淘宝店铺综合服务平台,专注于淘宝推广领域!为淘宝店主提供全网最全的淘宝活动报名,淘宝店铺推广,打造爆款,淘宝客推广,提升销量,店铺优化,掏包招募,淘客悬赏等淘宝推广,淘宝活动,淘宝店铺推广,打造爆款
      

     推哈网官方网址:www。tuiha。com
              联系QQ:联系QQ663799833
*滑动验证:
您需要登录后才可以回帖 登录 | 加入eoe

本版积分规则

推荐阅读
赞助商们

QQ|联系我们|小黑屋|手机版|eoe 移动开发者论坛 ( 京ICP备11018032 京公网安11010802020210  

GMT+8, 2018-1-20 01:35 , Processed in 0.539753 second(s), 45 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表
关闭

扫一扫 关注eoe官方微信