NiceLeeのBlog 用爱发电 bilibili~

Android VpnService初探

2019-02-14
nIceLee

阅读:


发现网络上关于Android VpnService的巴啦啦很多,但没有一个能够简单的能够实现抓包全部ip报文,然后不影响正常使用的关于VpnService的Demo,都是只考虑拦截不考虑正常功能的也是醉了…

写在前面

先说说我的理解

  • 假设是抓所有的IP包,那么要想把报文发送出去,一定要自己建立socket负责与外界的沟通(VpnService类提供了一个叫protect的函数),直接往虚拟网卡里面写是不行的!
  • 现在要做的事情:
    • 建立一个NatManager,管理本地端口与与外面连接的对应关系;
    • 建立一个TCPServer,处理对内对外的TCP连接;
    • 建立一个UDPServer,处理对内对外的UDP报文;
    • 建立一个VpnService,专门与VpnService.Builder返回的ParcelFileDescriptor实例,以及TCPServer/UDPServer对接

坑s

  • 什么IP包会往虚拟网卡发?或者说,虚拟网卡出入的IP报文怎么才算有效的?
    • 只有本地到外地,或者外地到本地的报文,才会途径虚拟网卡。
    • 比如说, 本地6666端口,往本地9999端口发送了一个UDP包,其对应的IP报文不会经过虚拟网卡,不要指望读ParcelFileDescriptor实例能够得到这份IP报文。
    • 比如说, 本地6666端口,往外地8.8.8.8:53发送了一个UDP包。虚拟网卡收到后,将其目的地改为指向本地UDPServer6.6.6.6:6666,重新写入虚拟网卡。
      但这时本地UDPServer并不会收到这个报文,只有将这个IP报文的源地址更改一下,例如由本地ip改为8.8.8.8(原目的地址),这个报文才会被本地UDPServer收到。
  • TCP/UDP/IP报文长度
    • 没有接收或接收到不服预期的内容,可能是这个原因。
  • TCP/UDP校验
    • 没有接收或接收到不服预期的内容,可能是这个原因。
  • 关于DNS报文
    • 似乎如果不在Builder生成时指定DNS服务器,手机本身另有一套机制,使得系统默认的DNS查询不会经过虚拟网卡。如果有需要,不妨再加一条:
      builder.addDnsServer("114.114.114.114")

相似文章

内容
隐藏