安卓4.0vpn源码
本发明针对Android设备后台程序偷跑流量、隐私泄露及单位网络管控难题,提出基于VPN隧道的动态网络管控方案。通过建立虚拟网络通道,解析应用数据包特征,将符合规则的数据包转发至真实地址(允许网络访问),不符合规则的数据包则重定向至虚假地址(禁止网络访问),实现对指定应用的精准网络控制。该方法无需Root权限,可灵活配置应用网络权限,有效防止数据泄露与非法流量传输。
:安卓(android)系统作为自由及开放源代码的操作系统安卓4.0vpn源码,近几年大量使用在智能设备,如智能手机和平板电脑上。随之而来的大量的程序被研发用于安卓系统上,还有大量的使用场景需要有不同的实际需求。从用户来看,程序在后台偷跑流量,偷偷将用户隐私数据传输出去,导致网银被盗,被监听监视,无端扣费,隐私泄露;从单位来看,在工作时候玩耍手机,导致工作效率低下,而又要用手机传播数据,进行联系,无法不用,这就需要针对特定应用进行网络管控,还有在某些特定保密单位,网络的灵活管控对于失泄密的预防有很大帮助。目前均是用户自己手动打开或关闭网络,但在未注意的时候,有的程序在后台偷偷打开,用户无法得知。技术实现要素:本发明的目的在于:提供一种基于vpn连接实现android设备网络灵活管控的方法,以解决现有android设备偷跑流量,容易泄露隐私、泄密等技术问题,用户还可灵活配置,选择性打开或者关闭某些应用程序的网络使用功能。本发明采用的技术方案如下:一种基于vpn连接实现android设备网络灵活管控的方法,包括以下步骤:步骤一、建立vpn隧道:将android设备通信连接于vpn,实现android设备与vpn进行数据交换;步骤二、执行网络管控:vpn通过将其从android设备收到的数据转发到原本/虚假地址的方式,实现android设备网络的打开或关闭;若需要选择性打开或关闭指定应用程序的网络,则将vpn从该应用程序收到的数据进行解析,判断vpn收到的数据是否符合特定格式,如果符合,则将vpn收到的数据正常转发到原本地址,以打开指定应用程序的网络;如果不符合,则将vpn收到的数据转发到虚假地址,以关闭指定应用程序的网络。进一步的,步骤一中,建立vpn隧道的过程包括:1.1:android设备的vpn程序使用socket将相应的ip数据包发送到线:android设备通过iptables和nat将所有ip数据包处理后,转发到tun虚拟机;1.3:android设备的vpn程序通过打开/dev/tun设备,并读取/dev/tun设备上的数据获得所有转发到tun虚拟机上的ip数据包。进一步的,网络设备为wifi设备。进一步的,步骤二中,采用link_socket_read()方法接收数据并进行解析。进一步的,步骤二中,使用ssl协议进行数据的处理,以判断vpn收到的数据是否符合特定格式。进一步的,步骤一中,建立vpn隧道不需要获得android设备的root权限。综上所述,由于采用了上述技术方案,本发明的有益效果是:本发明通过建立vpn隧道,实现android设备与vpn进行数据交换,并利用vpn来android设备网络的打开或关闭,任何应用程序均无法在后台偷偷打开网络,偷偷传输数据,解决了现有android设备偷跑流量,容易泄露隐私、泄密等技术问题;而且,还可以通过本发明实现选择性打开或者关闭某些应用程序的网络使用功能,满足了用户灵活配置应用程序网络的需求。附图说明图1是一种基于vpn的连接实现android设备网络灵活管控的方法流程图。图2是一种vpnservice框架数据转换流程图。具体实施方式本说明书中公开的所有特征,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。下面结合图1~2,对本发明作详细说明。一种基于vpn连接实现android设备网络灵活管控的方法,包括以下步骤:步骤一、建立vpn隧道:将android设备通信连接于vpn,实现android设备与vpn进行数据交换;所述方法中,主要是利用vpnservice框架,建立起一条从设备到远端的vpn连接,那么ip数据包在设备上就会完成步骤二中的四个转换。建立vpn隧道的过程包括:1.1:android设备的vpn程序使用socket将相应的ip数据包发送到真实的网络设备上;一般网络设备只有无线网卡,因此是发送到线:android系统通过iptables和nat将所有ip数据包处理后,转发到tun虚拟机,端口是tun0;1.3:android设备的vpn程序通过打开/dev/tun设备,并读取/dev/tun设备上的数据获得所有转发到tun虚拟机上的ip数据包。因为设备上的所有ip数据包都会被nat转成原地址是tun0端口发送的,所以也就是vpn程序可以获得进出该设备的所有数据。步骤二、执行网络管控:vpn通过将其从android设备收到的数据转发到原本/虚假地址的方式,实现android设备网络的打开或关闭;若需要选择性打开或关闭指定应用程序的网络,则将vpn从该应用程序收到的数据进行解析,判断vpn收到的数据是否符合特定格式,如果符合,则将vpn收到的数据正常转发到原本地址,以打开指定应用程序的网络;如果不符合,则将vpn收到的数据转发到虚假地址,以关闭指定应用程序的网络。整个转发过程为:经过处理的ip数据包vpn调用虚拟网卡的字符处理程序tun_write()写入虚拟网卡的字符设备,设备驱动程序完成数据从用户区到核心区的复制,并将数据写入skb链表,然后调用网卡netif_rx()接收程序,数据包再次进入系统tcp/ip协议栈,传到上层应用程序。所述方法中,要实现数据能够传输成功,需要实现一个继承自activity类的带ui的客户程序和一个继承自vpnservice类的服务程序。首先必须要在androidmanifest.xml中显式申明使用“android.permission.bind_vpn_service”权限。客户程序一般要首先调用vpnservice.prepare函数。目前android只支持一条vpn连接,如果新的程序想建立一条vpn连接,必须先中断系统中当前存在的那个vpn连接。同时,由于vpn程序的权利,必须由用户点击确认连接窗口。vpnservice.prepare函数的目的,主要是用来检查当前系统中是不是已经存在一个vpn连接了,如果有了的话,是不是就是本程序创建的。如果当前系统中没有vpn连接,或者存在的vpn连接不是本程序建立的,则vpnservice.prepare函数会返回一个intent。这个intent就是用来触发确认对话框的,程序会接着调用startactivityforresult将对话框弹出来等用户确认。如果用户确认了,则会关闭前面已经建立的vpn连接,并重置虚拟端口。该对话框返回的时候,会调用onactivityresult函数,并告之用户的选择。如果当前系统中有vpn连接,并且这个连接就是本程序建立的,则函数会返回null,就不需要用户再确认了。因为用户在本程序第一次建立vpn连接的时候已经确认过了,就不要再重复确认了,直接手动调用onactivityresult函数就行了。如果返回结果是ok的,也就是用户同意建立vpn连接,继承自vpnservice类的服务启动起来,通过intent传递一些别的参数。服务程序实现必须要继承自vpnservice类,publicclassmyvpnserviceextendsvpnservice。vpnservice类封装了建立vpn连接所必须的所有函数,后面会逐步用到。建立连接的第一步是要用合适的参数,创建并初始化好tun0虚拟网络端口,这可以通过在vpnservice类中的一个内部类builder来做到:parcelfiledescriptorinterface=builder.establish();可以看到,这里使用了标准的builder设计模式。在正式建立(establish)虚拟网络接口之前,需要设置好几个参数,分别是:1)mtu(maximuntransmissionunit),即表示虚拟网络端口的最大传输单元,如果发送的包长度超过这个数字,则会被分包;2)address,即这个虚拟网络端口的ip地址;3)route,只有匹配上的ip数据包,才会被路由到虚拟端口上去。如果是0.0.0.0/0的话,则会将所有的ip数据包都路由到虚拟端口上去;4)dnsserver,就是该端口的dns服务器地址;5)searchdomain,就是添加dns域名的自动补齐。dns服务器必须通过全域名进行搜索,但每次查找都输入全域名太麻烦了,可以通过配置域名的自动补齐规则予以简化;6)session,就是你要建立的vpn连接的名字,它将会在系统管理的与vpn连接相关的通知栏和对线)configureintent,这个intent指向一个配置页面,用来配置vpn连接。它不是必须的,如果没设置的话,则系统弹出的vpn相关对话框中不会出现配置按钮。最后调用builder.establish函数,如果一切正常的线虚拟网络接口就建立完成了。并且,同时还会通过iptables命令,修改nat表,将所有数据转发到tun0接口上。这之后,就可以通过读写vpnservice.builder返回的parcelfiledescriptor实例来获得设备上所有向外发送的ip数据包和返回处理过后的ip数据包到tcp/ip协议栈:parcelfiledescriptor类有一个getfiledescriptor函数,其会返回一个文件描述符,这样就可以将对接口的读写操作转换成对文件的读写操作。每次调用fileinputstream.read函数会读取一个ip数据包,而调用fileoutputstream.write函数会写入一个ip数据包到tcp/ip协议栈。所述方法中:1).vpn连接对于应用程序来说是完全透明的,应用程序完全感知不到vpn的存在,也不需要为支持vpn做任何更改;2).并不需要获得android设备的root权限就可以建立vpn连接。根据,在应用程序内的androidmanifest.xml文件中申明需要一个参数名称为“android.permission.bind_vpn_s”“android.permission.bind_vpn_service”的特殊权限;3).在正式建立vpn连接之前,android系统会弹出一个对话框,需要用户明确的同意;4).一旦建立起了vpn连接,android设备上所有发送出去的ip数据包,都会被转发到虚拟网卡的网络接口上去(主要是通过给不同的套接字打fwmark标签和iproute2策略路由来实现的);5).vpn程序可以通过读取这个接口上的数据,来获得所有设备上发送出去的ip数据包;同时,可以通过写入数据到这个接口上,将任何ip数据包插入系统的tcp/ip协议栈,最终送给接收的应用程序;6).android系统中同一时间只允许建立一条vpn连接。如果有程序想建立新的vpn连接,在获得用户同意后,前面已有的vpn连接会被中断;7).通过使用vpnservice,让vpn程序可以获得设备上的所有ip数据包。通过前面的简单分析,用来在android设备上建立和远端服务器之间的vpn连接。通过以上实施方式的描述可知,本领域的技术人员可以清楚地了解到本发明可以借助软件增加必须的通用硬件平台的方式来实现。虽然通过实施例描述了本发明,本领域的技术人员知道,本发明有很多变形和变化而不能脱离本发明的精神,一样受本发明的权利要求保护。本发明未详细阐述的部分属于本领域公知技术,本领域技术人员根据已有的描述已能够在不付出创造性劳动的前提下进行实施,因此,不再赘述。当前第1页12
1.数字信号处理 2.传感器技术及应用 3.机电一体化产品开发 4.机械工程测试技术 5.逆向工程技术研究



