daeuniverse / dae

eBPF-based Linux high-performance transparent proxy solution.
GNU Affero General Public License v3.0
2.64k stars 164 forks source link

[Proposal] 支持 DNS Upstream "fake" #567

Open mzz2017 opened 6 days ago

mzz2017 commented 6 days ago

Proposal

565 反映了一个问题,考虑如下情况:

  1. 公司/学校的内网 dns 服务器上提供 example.edu.cn 或 abc.example.company 的解析,指向内网服务器,而在公网 dns(例如运营商和 alidns)没有该解析,从而使得只有在内网(通过网线/wifi连上公司/学校网络)可以访问某些域名
  2. 公司/学校使用了 easyconnect 作为 vpn 服务,提供了远程接入方式
  3. 居家办公或正在休假的员工/学生使用了类似 docker 化 easyconnect 并开放了 http 代理端口的方式使得宿主机可以通过 http 代理接入公司/学校内网进行工作/学习
  4. 通过 HTTP(S)_PROXY 环境变量或 curl -x 可以直接访问到上述域名,因为传统代理直接发送域名到代理服务器且不先进行 dns 解析
  5. 通过 dae 无法访问上述域名,因为上述域名在 public dns 上无法解析,从而不会通过代理进行转发

对于 #565 的问题,需要完善文档,如何透过 dae 和跳板机访问公司内网。

另一个方式是支持“fake” upstream,对特定的 qname 设置使用 fake upstream,从而返回一个 fake ip,绕过 dns 解析。

例如

qname(geosite:cn)->alidns
qname(suffix:company)->fake
fallback: googledns

有两种实现方式:

  1. 由于只需要解决特定问题,可以实现为返回固定 dummy ip,例如 127.114.5.14。dae 在遇到该 ip 时跳过 ip routing 规则(ip 规则将失效),并无条件使用嗅探结果,并向代理服务器发起请求,嗅探失败时拒绝请求。如果这样实现,建议改为 upstream 取名“dummy”。
  2. 完整实现 fakeip。在 dns 侧建立映射,跳过 ip routing 规则(ip 规则将失效),使用映射域名进行路由并发起请求。

如果完整实现 fakeip,尽管不是推荐的方式,但用户可以通过 dns request routing 里使用 fallback: fake 来全部使用 fakeip。

需要广泛讨论。

Use Cases

如上

Potential Benefits

  1. 减少特殊情况下的配置复杂度。
  2. 对特定域名可以减少一次 dns 请求次数。

Scope

No response

Reference

No response

Implementation

No response

dae-prow[bot] commented 6 days ago

Thanks for opening this issue!

Mitsuhaxy commented 3 days ago

属于特殊需求,直接添加hosts解析功能是否更妥?

mzz2017 commented 3 days ago

hosts 只能单个单个添加。

这个功能先搁置了,后续有其他问题或更多人有类似需求再推动。先完善文档。

marsjane commented 2 days ago

之前使用tcp的方式好像在某些情况下还是会有bug(目前发现的是网站一些操作还是有问题),我切换回用clash的方式是没问题的,所以目前有什么办法我可以直接跳过DNS解析直接进入routing规则么?上面提到的hosts的方法我不是很懂,hosts是静态的吧?如何让特定域名直接走代理呢