OpenVPN for Android

来源:互联网 发布:淘宝有招脚模的吗 编辑:程序博客网 时间:2024/05/16 00:28

整这个vpn差不多半个月了,太痛苦了,我来吐槽下这个vpn,
源码地址https://github.com/schwabe/ics-openvpn
需求类似与蓝灯那种的有个button点击直接连接vpn服务器,或者安装启动程序时直接连接vpn。
刚刚开始时,我使用的是PPTP连接方式,我发现VpnService.Builder这个东西里面根本就没有设置账号这个东西,所以VPN连接一直不成功,
4.0之后,安卓提供VPNService供大家实现自己的VPN应用.

VpnService和client交互

那VpnService是如何跟client应用通信的呢?这里利用了linux的TUN/TAP机制。TUN/TAP提供了一种虚拟的软网络接口(相对于物理网卡而言)。开发人员可以打开这个软接口设备,获取一个文件描述符(设备即文件),然后read就是从其中读数据,write就是向其中写数据。不同于物理网卡接口是把数据发送到网上或者接收自网上(其实是写/读到内核里,然后网卡驱动发/收到网上),该虚拟网络接口是读/写到应用空间。当建立其TUN/TAP后,client应用本来要发送到实际网卡的包,都会发送给这个虚拟的tun/tap,此时vpnservice就可以read到client发送的数据;vpnservice可以写数据到tun/tap中,此时client如果recv或read,那就会读取这个虚拟网口,获取vpnservice写的数据。这个我估计是通过修改路由表实现的,使得所有的网楼包都优先走tun/tap虚拟网口。

tun和tap的区别是前者这有IP头和IP负载(即三层和以上),而tap包括数据链路层头(二层和以上)。在Android中,实际是一个tun,读写的数据是IP原始报文。为了验证vpnservice创建了一个虚拟网口,可以下载noroot filewall,然后通过adb shell netcfg。如果已经打开了vpnservice,则名字是tun0的接口,其状态是UP。

关于tun/tap可以参考http://backreference.org/2010/03/26/tuntap-interface-tutorial/和https://www.kernel.org/doc/Documentation/networking/tuntap.txt。这是linux的机制,而不仅仅是android的。

VpnService和网络服务器交互

那VpnService如果把收到的数据发送到网上呢?不同于普通linux允许用户发送原始ip报文,Android安全机制只允许socket发送普通的tcp/udp报文。这就要求我们把通过tun收到的ip报文进行解包,获取其tcp/udp payload(即应用层数据),然后通过send发送到服务器。在接收的时候,需要把服务器过来的recv的数据,添加tcp/udp头和ip头,然后write到tun中。对于tcp具体而言要复杂很多:

如果受到的是syn包,则要connect 如果connect成功,则需要返回给tun一个syn ack。这样子三次握手结束(因为不用处理最后一个ack)。 传输的时候要记录双向的seq,以生成seq和ack序号。 收到fin包的时候需要close,并返回fin ack。有时候是服务器发起连接终止,此时需要向客户端发fin。 收到rst同样要close连接。某种程度上,这里要重现实现一个tcp协议栈,不过要比完整的简单很多。

github上项目编译

找了好几天的资料,发现源码太少了,刚刚开始看了这个源码,但是编译没通过,就开始找别的,发现github上几乎没有编译通过的,都有问题,资料太少了,
把他的项目直接导入as,配置ndk,发现找不到so,这里写图片描述
试了好多遍,自己试着写了一个hello jni ,然后回来重新编译还是这个错,丫的好气啊!
相信大家做这个项目应该看到csdn上有个8分的eclipse的项目,我一看分好高,应该没问题,于是下载了,然后导入eclipse,配置ndk,编译,运行了,这里写图片描述好激动!
装到手机上这是什么鬼,无法安装!然后调了一天发现还是不能,其中也有下载了其他的项目,最后还是回到了ics-openvpn,重新下载,看到有个ReadMe文档,当时没有细读,因为英语太差了,一边百度翻译,一边读,原来博主是linux下运行的,在github上找遇到相同的问题的,看他他们有留得扣扣号我都加了,嘿嘿,反正用的都用了,都是在ubuntu上编译的,无奈啊,还是还原git博主当时环境,装了ubuntu,
ubuntu下载地址:
http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso
你可以装双系统,或者虚拟机,本人是虚拟机,
虚拟机下载地址:
http://sw.bos.baidu.com/sw-search-sp/software/996c4609e64/VirtualBox_5.0.24.8355_Win.exe
Linux上的ndk下载地址:
https://dl.google.com/android/repository/android-ndk-r13-linux-x86_64.zip
ndk要大于10,
ubuntu配置ndk连接:
http://www.linuxdiyf.com/linux/13024.html
ubuntu配置git环境:
http://jingyan.baidu.com/article/066074d645c224c3c21cb081.html
由于找这些东西花了很长时间,全都贴出来,
本人亲测能用,
好了开始编译把:
ctrl+shift+t Linux 打开命令行,
git clone 克隆项目到本地:

在项目 main目录里执行
git submodule init
git submodule update
最后main目录下 执行 ./misc/build-native.sh
这里写图片描述
编译通过了!!!
哈哈哈哈,心情美丽啊!
客户端连接vpn他的是导入sd卡的配置文件,进行连接,
不过编译成功了后面改动很快的。
android客户端的配置文件的获取,我自己搭建一个本地的,
配置文件有ca.crt ,client.crt,client.key,组成的,

编译demo放到百度云盘里,,这里写图片描述
csdn下载链接:
http://download.csdn.net/detail/qq_34207582/9666365

在刚刚要发表时看到一篇关于openvpn配置写的很详细的
http://blog.csdn.net/zxs9999/article/details/52813147#comments

0 0
原创粉丝点击