Android-Vpn总结

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虚拟网卡 手机上所有流量会经过这个虚拟网卡

Android Vpn原理

根据协议 Tun虚拟网卡接受到Ip层的包

TcpIp传输协议

需要特殊解析SYN FIN等特殊协议字命令

Tcp握手

VpnService应用

网址检测

  1. 建立类继承VpnService
  2. 从虚拟网卡读取Byte数据 此数据为Ip层数据
  3. Ip层可以判断是IpV4 IpV6 TCP UDP 做不同处理
  4. 通过Tcp头解析出Ip地址与端口与data
  5. 通过Tcp头判断是不是Http请求 如果是Http请求 获取Host
  6. 检测Ip和Host 判断是否合法 允许访问 不需要则返回503 允许则继续
  7. 允许访问 将data封装为改短口发出去的数据 Tun虚拟网卡与真正服务器通信
  8. 真正服务器返回的数据到虚拟网卡 修改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管理缓存 遇到已处理的网址不需要额外再去服务器检查