MetaCubeX / mihomo

A simple Python Pydantic model for Honkai: Star Rail parsed data from the Mihomo API.
https://wiki.metacubex.one
MIT License
15.69k stars 2.57k forks source link

[Bug] strict route模式下网页加载缓慢 #778

Open transformer10015 opened 1 year ago

transformer10015 commented 1 year ago

Verify steps

Clash version

v1.16.0 windows amd64 with go1.21.1

What OS are you seeing the problem on?

windows 10

Clash config

tun:
  enable: true
  stack: system
  dns-hijack:
    - any:53
  auto-route: true
  strict-route: true
  auto-detect-interface: true

dns:
  enable: true
  listen: 0.0.0.0:53
  prefer-h3: true
  ipv6: true
  enhanced-mode: fake-ip
  fake-ip-range:  198.18.0.1/16
  fake-ip-filter:
    - '*'
    - '+.lan'
    - '+.local'
    - '+.msftconnecttest.com'
    - '+.msftnsci.com'
  default-nameserver:
    - 'tls://8.8.8.8#dns'
    - 'tls://8.8.4.4#dns'
  nameserver:
    - 223.5.5.5
    - 223.6.6.6
  fallback:
    - 'tls://8.8.8.8#dns'
    - 'tls://8.8.4.4#dns'
    - 'tls://1.1.1.1#dns'
    - 'tls://1.0.0.1#dns'
    - 'https://dns.cloudflare.com/dns-query#dns'
    - 'https://doh.dns.sb/dns-query#dns'
  fallback-filter:
    geoip: true
    geoip-code: CN
    geosite:
      - gfw
    domain:
      - '+.google.com'
      - '+.facebook.com'
      - '+.youtube.com'
  proxy-server-nameserver:
    - 'https://223.5.5.5/dns-query?'
    - 'https://223.6.6.6/dns-query?'

除dns策略外全部选择direct

Clash log

No response

Description

开启strict route时,网页加载缓慢。利用wireshark抓包发现当刷新网页时,没有立刻发送dns请求。

transformer10015 commented 1 year ago

上述配置文件访问国内网站所需时间 图片 在fake-ip-filter中加入'+.*'使其退化为对所有dns请求返回真实ip: 图片

transformer10015 commented 1 year ago

经过尝试,发现开启windows的智能多宿主名称解析时,网页加载速度是正常的。上述情况出现的条件是:智能多宿主名称解析关闭的同时fake-ip模式开启。我不明白这是什么原因。

Paulgudring commented 8 months ago

这个问题仍然存在。

根据sing-box.tun在windows中strict-route用于设置防火墙规则禁止多宿主解析。

stack: system时,如果strict-route: false,windows会使用智能多宿主名称解析,反常的是tun不能劫持掉这个dns,导致DNS泄露,这时可以修改物理网卡的DNS服务器,指定为meta tun的地址,——该地址在singbox是由tun.inet4_addresstun.inet6_address 指定的,而在meta中v4地址是由dns.fake-ip-range所指定。

如果strict-route: true,则会导致在解析完域名之后很长时间的延迟,在singbox的issue处有人提过这一问题,该问题已被关闭。

因此,这仍然是上游sing-box的问题,且至今尚未得到解决。

总结:

  1. 复现网页加载缓慢的条件:windows 组策略中禁用智能多宿主域名解析 + strict-route 为 true + fake-ip
  2. 分析:windows 组策略中禁用智能多宿主域名解析 + strict-route 为 false 不能解决智能多宿主的问题,该选项只限制了多网卡的 ipv4 查询,ipv6的查询仍然会泄露;而 strict-route 可以严格限制 DNS 劫持经过 meta TUN。因此建议不改变组策略的选项,启用 strict-route 。为什么fake-ip会导致网页加载缓慢,而 redir-host 不会?通过查看网络响应,发现问题在于 dns loopup 花了很长时间,怀疑是前两者互相作用,导致 fake-ip 网段发生了 dns 回环。
  3. 建议:windows 组策略中开启 智能多宿主域名解析 + strict-route 为 true + fake-ip/redir-host 模式。
MJRT commented 7 months ago

+1, same issue

happyZYM commented 6 months ago

不知道为什么在我的电脑上只有这种配置是有效的:允许智能多宿主域名解析+strict-route+fake-ip(但把fallback-filter设置为'+.*')

此时绝大多数域名解析正常,但仍有少量域名(如github.com)解析时会超时,在WSL2下使用nslookup可以看到报错;; communications error to 172.21.48.1#53: timed out,直接在windows下nslookup正常但是使用curl时一样会有一个将近12秒的延迟。(windows下安装Clash Verge Rev,防火墙设置已允许WSL访问Windows网络)

ssyangchn commented 5 months ago

+1 same issue

LordHumphrey commented 2 months ago

复现了,同样的情况

LordHumphrey commented 2 months ago

这个问题有修复计划吗,谢谢

dyhkwong commented 2 months ago

同时关闭智能多宿主名称解析并开启 strict route 会导致某些应用的 DNS 查询异常,这个是预期副作用,不需要修复,除非有比 WFP 屏蔽除自身外的 53 端口流量更好的方案。要么就关闭智能多宿主名称解析并关闭 strict route(AAAA 一样会漏),要么就开启智能多宿主名称解析并开启 strict route。

LordHumphrey commented 2 months ago

同时关闭智能多宿主名称解析并开启 strict route 会导致某些应用的 DNS 查询异常,这个是预期副作用,不需要修复,除非有比 WFP 屏蔽除自身外的 53 端口流量更好的方案。要么就关闭智能多宿主名称解析并关闭 strict route(AAAA 一样会漏),要么就开启智能多宿主名称解析并开启 strict route。

好的,感谢您的回复,按照您的建议,以下两种方案:

  1. 关闭智能多宿主名称解析并关闭 strict route,v6会漏
  2. 开启智能多宿主名称解析并开启 strict route,这个方案Windows会漏 也就是说目前没有完美的解决方案吗? 谢谢您的回复。
dyhkwong commented 2 months ago

开启 strict route 还会漏那就是通过其他方式漏或者你自己配置文件的问题了,strict route 只为了处理通过智能多宿主名称解析方式的泄漏。

开启智能多宿主名称解析并开启 strict route,这个方案Windows会漏

ForestL18 commented 2 months ago

同时关闭智能多宿主名称解析并开启 strict route 会导致某些应用的 DNS 查询异常,这个是预期副作用,不需要修复,除非有比 WFP 屏蔽除自身外的 53 端口流量更好的方案。要么就关闭智能多宿主名称解析并关闭 strict route(AAAA 一样会漏),要么就开启智能多宿主名称解析并开启 strict route。

好的,感谢您的回复,按照您的建议,以下两种方案:

  1. 关闭智能多宿主名称解析并关闭 strict route,v6会漏
  2. 开启智能多宿主名称解析并开启 strict route,这个方案Windows会漏 也就是说目前没有完美的解决方案吗? 谢谢您的回复。

Windows会漏是什么意思?能否举例说明一下 我这边测试strict和多宿主同时开没有泄露问题

ssyangchn commented 2 months ago

我的解决方案

  1. windows开启智能多宿主名称解析

    组策略-计算机配置-管理模板-网络-DNS客户端-禁用智能多宿主名称解析-勾选已禁用/未配置

  2. clash开启tun.strict-route = true, 由clash自动配置防火墙避免dns请求泄露

dyhkwong commented 2 months ago

觉得 WFP 拦截侵入性太大的话也可以自己在开启 tun 时把所有网卡的 dns 都改成 tun 网卡的(或者公网的?),关闭 tun 时再改回去,不过这样就更脏了

bling-yshs commented 2 months ago

我的解决方案

  1. windows开启智能多宿主名称解析 组策略-计算机配置-管理模板-网络-DNS客户端-禁用智能多宿主名称解析-勾选已禁用/未配置
  2. clash开启tun.strict-route = true, 由clash自动配置防火墙避免dns请求泄露

感谢,亲测可用

LzNOHentai commented 2 weeks ago

复现+1,如果禁用智能多宿主名称解析就必须同步关闭严格路由,否则域名解析极其缓慢。

dyhkwong commented 2 weeks ago

复现+1,如果禁用智能多宿主名称解析就必须同步关闭严格路由,否则域名解析极其缓慢。

这是预期问题,请不要在这里抱怨。如果你有更好的没有侵入性的方案可以去实现一下,否则就只能是像现在这样。该功能没有默认开启。

LzNOHentai commented 2 weeks ago

复现+1,如果禁用智能多宿主名称解析就必须同步关闭严格路由,否则域名解析极其缓慢。

这是预期问题,请不要在这里抱怨。如果你有更好的没有侵入性的方案可以去实现一下,否则就只能是像现在这样。该功能没有默认开启。

倒不是抱怨,只是发现了这个问题找到这个issue顺手回报一下,个人建议是可以在示例配置或文档中备注一下这两个功能的关系。