-
Notifications
You must be signed in to change notification settings - Fork 8.9k
[feature request] 增加 Fake IP / Fake DNS 功能 #2233
Description
未解决的问题
在透明代理模式下,被代理的程序将会自行发送出 DNS 请求。目前,用户可以将 DNS 请求转发到代理进行处理(直接发出或经过代理服务器发出)。
对于受 DNS 污染影响的域名,用户必须将 DNS 请求发送至服务器来获取正确的 IP 地址,而这在访问网站之前需要消耗 1RTT。
什么是 Fake IP
当用户发送 DNS 请求时,代理并不发送请求到远程 DNS 服务器,而是为每个域名返回一个唯一假 IP。在指向这些假 IP 的流量发送到代理时,按查询得到的域名重置当前连接的目标。
目前的方案及它们的局限
Socks 5 或 HTTP 代理方式
程序会将域名直接发送至对于 Socks 5 或 HTTP 代理 ,在服务端进行解析。
手动为程序配置代理需要消耗大量的精力,并且对于不支持这些代理方式的程序 / 平台,这种方式是不友好的。
V2Ray 已有的 Sniffing 方案
参见已有的讨论。大概思路是用本地 DNS 服务器给所有需要代理的域名返回同一个不可访问的 IP,之后在流量再次发送到 V2Ray 时,按流量中包括的目标地址重置当前连接的目标,从而达到不需要访问远程 DNS 服务器的效果。而且,在 V2Ray 支持本地 DNS 处理之后,可以直接在 Hosts 规则里面拦截这些请求。
这个方案会污染本地 DNS 缓存。同时最大的问题在于,Sniffing 功能只能从 HTTP / TLS 类型的流量中提取出域名,而考虑到我们使用的是一个虚假的 IP,这将直接导致部分功能不可用(UDP 全崩)。
额外的 Fake IP 程序
参考 go-tun2socks,仅有少数的 GUI 程序支持该项目与 V2Ray 同时使用,目前发现两个:kitsunebi, mellow. 它们直接修改了 V2Ray 内核,与 go-tun2socks 均来自同一开发者。
手动部署 go-tun2socks 将(较大幅度)增加用户使用 V2Ray 的成本。
Fake IP 的代价
返回错误的 IP 会污染本地 DNS 缓存,使得代理断开之后一段时间内设备无法访问网络。