能否介绍一下smartproxy的工作原理?
Closed this issue · 6 comments
xjdrew commented
或者介绍一遍android这方面的文章,谢谢
xingrz commented
最近这阵子对 Smart Proxy 研究得比较透,擅自代作者回答一下吧。
- 首先是使用 Android 提供的 VpnService 创建一个虚拟网卡,在网络层截获系统所有出站流量
- 从数据包的 IP 头 和 TCP 头 解析出该数据包去往的 IP 地址、端口号,并将它们改成本地另一个 TCP 服务器的地址和端口(网络层转发)
- TCP 服务器在传输层得到刚才转发过来的流量,根据代理规则向外网建立连接并建立隧道在传输层通过 TCP socket 进行转发
- TCP 服务器获得外网回来的流量后,转发给系统内部一个不存在的 IP
- 虚拟网卡截获到去往这个不存在的 IP 的数据包后,用同样的方法将它们修改回原本的地址和端口号,会写到虚拟网卡中。于是就「不知不觉」地完成了一次转发(其实就是 NAT)
希望能对你的理解有所帮助。
xjdrew commented
我参考smartproxy,实现了一个(OneVpnService)[https://github.com/xjdrew/onevpnservice] , 思路类似,但由于只支持http proxy,所以简单了很多。
xingrz commented
继续读代码。看了一下 DnsProxy,大致上防止 DNS 污染的原理是:
- 截获 DNS 查询包,解析出里面的域名。查表,如果是墙名单内的域名(
ProxyConfig.Instance.needProxy
),则构造一个虚构 IP 的 DNS 应答返回给系统;否则照常转发到外网 - TCP 代理器上判断请求 IP,如果是去往上述虚构 IP 的请求,则说明是请求名单内的域名(此时就不需要通过 HTTP Header 或者 SNI 解析出 Host 了),走代理
bumblebee2333 commented
你好 我想请问下 VPNService抓取到数据后 发给TCPServer TCPServer的地址是如何设置的呢 10.8.0.2就可以么?
CrazyBoyFeng commented
我参考 smartproxy,实现了一个 OneVpnService,思路类似,但由于只支持 http proxy,所以简单了很多。
@xjdrew 你好,请问 OneVpnService
还在吗?我想学习一下对 HTTP 包的筛选和包头变换的实现。