oldman1977/SmartProxy

能否介绍一下smartproxy的工作原理?

Closed this issue · 6 comments

或者介绍一遍android这方面的文章,谢谢

最近这阵子对 Smart Proxy 研究得比较透,擅自代作者回答一下吧。

  1. 首先是使用 Android 提供的 VpnService 创建一个虚拟网卡,在网络层截获系统所有出站流量
  2. 从数据包的 IP 头TCP 头 解析出该数据包去往的 IP 地址、端口号,并将它们改成本地另一个 TCP 服务器的地址和端口(网络层转发)
  3. TCP 服务器在传输层得到刚才转发过来的流量,根据代理规则向外网建立连接并建立隧道在传输层通过 TCP socket 进行转发
  4. TCP 服务器获得外网回来的流量后,转发给系统内部一个不存在的 IP
  5. 虚拟网卡截获到去往这个不存在的 IP 的数据包后,用同样的方法将它们修改回原本的地址和端口号,会写到虚拟网卡中。于是就「不知不觉」地完成了一次转发(其实就是 NAT)

希望能对你的理解有所帮助。

我参考smartproxy,实现了一个(OneVpnService)[https://github.com/xjdrew/onevpnservice] , 思路类似,但由于只支持http proxy,所以简单了很多。

@xjdrew 我也做了一个 prox

继续读代码。看了一下 DnsProxy,大致上防止 DNS 污染的原理是:

  1. 截获 DNS 查询包,解析出里面的域名。查表,如果是墙名单内的域名(ProxyConfig.Instance.needProxy),则构造一个虚构 IP 的 DNS 应答返回给系统;否则照常转发到外网
  2. TCP 代理器上判断请求 IP,如果是去往上述虚构 IP 的请求,则说明是请求名单内的域名(此时就不需要通过 HTTP Header 或者 SNI 解析出 Host 了),走代理

你好 我想请问下 VPNService抓取到数据后 发给TCPServer TCPServer的地址是如何设置的呢 10.8.0.2就可以么?

我参考 smartproxy,实现了一个 OneVpnService,思路类似,但由于只支持 http proxy,所以简单了很多。

@xjdrew 你好,请问 OneVpnService 还在吗?我想学习一下对 HTTP 包的筛选和包头变换的实现。