Android Vpn实现分类
iptables
Android平台的透明代理早期都是基于NAT来实现的,netfilter模块内部有三张表,mangle, filter和nat。 修改地址转换或者端口转发 实现Vpn
VpnService
早期的Android版本只支持内置的VPN连接,VPN服务器必须是标准的PPTP或者L2TP/IPSec实现,
从Android 4.0开始,SDK提供了VpnService系列的接口,允许开发者实现自定义的VPN协议。这套API提供了拦截IP包的能力,给开发者提供了高度的可定制性。
socks代理
将接受到的数据库转发到一个Socket服务器 实现代理功能
VpnService原理
如图所示 VpnService启动后 会生成一个新的Tun虚拟网卡 手机上所有流量会经过这个虚拟网卡
根据协议 Tun虚拟网卡接受到Ip层的包
需要特殊解析SYN FIN等特殊协议字命令
VpnService应用
网址检测
- 建立类继承VpnService
- 从虚拟网卡读取Byte数据 此数据为Ip层数据
- Ip层可以判断是IpV4 IpV6 TCP UDP 做不同处理
- 通过Tcp头解析出Ip地址与端口与data
- 通过Tcp头判断是不是Http请求 如果是Http请求 获取Host
- 检测Ip和Host 判断是否合法 允许访问 不需要则返回503 允许则继续
- 允许访问 将data封装为改短口发出去的数据 Tun虚拟网卡与真正服务器通信
- 真正服务器返回的数据到虚拟网卡 修改Ip与Tcp头后 从虚拟网卡写入到VpnService的FileOutputStream(mVpnFileDescriptor)中
注意点
1.避免发生循环问题 与真正服务器连接的Socket连接需要是用protect
2.提高效率 需要4个优先队列LinkedBlockingQueue Tcp2Net Udp2Net Net2Device CurrentTcp2Net(优先处理当前应用的数据)
3.需要特别关注Host和端口号 写入和写出的需要对换 计算校验和
4.步骤7需要处理Tcp特殊字段 遇到Syn的字段不需要处理 需要发起连接 当连接建立成功的时候 给客户端发送SYN+ACK的特殊信息
5.需要FIN 需要关闭客户端建立的连接
6.是用Netty Nio包 提高效率 Bootstrap ChannelOutboundHandlerAdapter ChannelInboundHandlerAdapter
7.addDisallowedApplication方法 过滤哪些包不经过Vpn可以直接发给服务器 21以下没有这个方法 需要解析/proc/net/tcp文件 有Uid和端口的对应关系 可代替实现
8.需要是用Lru管理缓存 防止有些连接长时间过期 不处理
9.需要使用Lru管理缓存 遇到已处理的网址不需要额外再去服务器检查