[Proposal] 支持 DNS Upstream "fake"
Proposal
#565 反映了一个问题,考虑如下情况:
- 公司/学校的内网 dns 服务器上提供 example.edu.cn 或 abc.example.company 的解析,指向内网服务器,而在公网 dns(例如运营商和 alidns)没有该解析,从而使得只有在内网(通过网线/wifi连上公司/学校网络)可以访问某些域名
- 公司/学校使用了 easyconnect 作为 vpn 服务,提供了远程接入方式
- 居家办公或正在休假的员工/学生使用了类似 docker 化 easyconnect 并开放了 http 代理端口的方式使得宿主机可以通过 http 代理接入公司/学校内网进行工作/学习
- 通过 HTTP(S)_PROXY 环境变量或 curl -x 可以直接访问到上述域名,因为传统代理直接发送域名到代理服务器且不先进行 dns 解析
- 通过 dae 无法访问上述域名,因为上述域名在 public dns 上无法解析,从而不会通过代理进行转发
对于 #565 的问题,需要完善文档,如何透过 dae 和跳板机访问公司内网。
另一个方式是支持“fake” upstream,对特定的 qname 设置使用 fake upstream,从而返回一个 fake ip,绕过 dns 解析。
例如
qname(geosite:cn)->alidns
qname(suffix:company)->fake
fallback: googledns
有两种实现方式:
- 由于只需要解决特定问题,可以实现为返回固定 dummy ip,例如 127.114.5.14。dae 在遇到该 ip 时跳过 ip routing 规则(ip 规则将失效),并无条件使用嗅探结果,并向代理服务器发起请求,嗅探失败时拒绝请求。如果这样实现,建议改为 upstream 取名“dummy”。
- 完整实现 fakeip。在 dns 侧建立映射,跳过 ip routing 规则(ip 规则将失效),使用映射域名进行路由并发起请求。
如果完整实现 fakeip,尽管不是推荐的方式,但用户可以通过 dns request routing 里使用 fallback: fake 来全部使用 fakeip。
需要广泛讨论。
Use Cases
如上
Potential Benefits
- 减少特殊情况下的配置复杂度。
- 对特定域名可以减少一次 dns 请求次数。
Scope
No response
Reference
No response
Implementation
No response
Thanks for opening this issue!
属于特殊需求,直接添加hosts解析功能是否更妥?
hosts 只能单个单个添加。
这个功能先搁置了,后续有其他问题或更多人有类似需求再推动。先完善文档。
之前使用tcp的方式好像在某些情况下还是会有bug(目前发现的是网站一些操作还是有问题),我切换回用clash的方式是没问题的,所以目前有什么办法我可以直接跳过DNS解析直接进入routing规则么?上面提到的hosts的方法我不是很懂,hosts是静态的吧?如何让特定域名直接走代理呢
建议学有余力者fork个fakedae实现fakeip
之前使用tcp的方式好像在某些情况下还是会有bug(目前发现的是网站一些操作还是有问题),我切换回用clash的方式是没问题的,所以目前有什么办法我可以直接跳过DNS解析直接进入routing规则么?上面提到的hosts的方法我不是很懂,hosts是静态的吧?如何让特定域名直接走代理呢
dnsmasq设置:
server=/example.edu.cn/
address=/example.edu.cn/11.11.11.11
address=/example.edu.cn/2001::1
server=/abc.example.company/
address=/abc.example.company/11.11.11.11
address=/abc.example.company/2001::1
dae中:
dns {
...
routing {
request {
qname(full:example.edu.cn, full:abc.example.company) -> asis
qname(geosite:gfw) -> my_proxy_dns
fallback: asis
}
}
}
routing {
...
!domain(regex:'.*') && dip(11.11.11.10/24, '2001::10/120') -> block
domain(geosite:cn) -> direct
dip(geoip:cn) -> direct
fallback: my_proxy
}