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
- OpenVpn for Android编译
- OpenVPN for Android
- OpenVPN for Android
- OpenVPN For Android实现手机刷Twitter
- OpenVPN 客户端For OSX
- OpenVPN for CentOS搭建
- 深度定制 OpenVPN for Windows
- 深度定制 OpenVPN for Windows
- 深度定制 OpenVPN for Windows
- android下配置OpenVPN
- android openvpn 编译文档
- [软件下载]openvpn 2.1 rc12 for windows
- Android + OpenVPN 完全配置方法
- openvpn ios android 上网教程
- OpenVPN
- OpenVPN
- openVPN
- openVPN
- Android 内存泄露分析--MAT分析hprof文件
- 关于rxjava与retrofit结合详情
- asp.net母版页中实现点击菜单切换对应的样式
- linux上安装最新git
- 自定义splash导航器,选中的点变大
- OpenVPN for Android
- JavaWeb:用JDBC操作数据库
- hibernate 注解使用日期@Temporal(TemporalType.DATE)
- JAVA 通过URL 获取页面内容
- 整数划分-张义胜
- ulcoud修改mysql的某一个参数
- Rxjava(Subject)-一个综合例子
- linux内核调试指南
- 生成学习算法