V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
RageBubble
V2EX  ›  宽带症候群

使用 clash 上网时应对 dns 泄露的心得

  •  3
     
  •   RageBubble · 249 天前 · 25482 次点击
    这是一个创建于 249 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ** 本人使用的是 clash verge rev 客户端,内核为 clash-meta ( mihomo ),windows 系统。

    一、

    最近我对上网隐私有些关注,虽然 vpn 可以有效保护隐私,但根据大家都知道的原因,vpn 上网在国内非常不方便,一个是无法根据域名和 ip 分流,另一个是 vpn 协议太容易被检测。所以我就在想,使用 clash 这类更符合国情的代理软件,怎么才能保证基本的隐私和信息安全呢?

    当然我只是追求基本的隐私保护,对于更高的安全需求,当然可以使用 tor 网络和虚拟机等,这些不在此次讨论范围,我主要以 ipleak.net 这类网站的结果作为判断标准。

    ipleak.net 这类网站对泄露的检测可以分为三类:dns 泄露,ip 泄露,webrtc 泄露。

    只要使用 clash 上网,ip 泄露和 webrtc 泄露检测的结果都是代理服务器的 ip ,这两个没什么问题。但是对于 dns 泄露,我总是发现检测到的服务器列表里,除了国外的服务器,竟然还有很多是国内的 dns 服务器(包括本地 isp 运营商的),而在我的 clash 中(系统代理+规则模式),dns 字段里 nameserver 设置的是 8.8.8.8 ,fallback 设置的是国外加密 dns 。这有些不对劲,因国内的 dns 服务器不应该出现。

    这里说明一下,clash 的 dns 字段里,nameserver 就是主要使用的 dns 服务器,default-nameserver 是用来解析 nameserver 中的加密 dns (如果有加密 dns 的话),fallback 是备用的 dns 服务器,当 clash 要发出 dns 请求时,如果 fallback-filter 没有特别设置,会并发的向 nameserver 和 fallback 中的 dns 服务器发出解析请求,使用最早响应的那个结果。

    mihomo 的 dns 解析流程

    言归正传,为了搞清楚这背后的原理,我做了很多测试,用到了 wireshark 抓包 53 端口的 dns 请求。发现 wireshark 中,电脑是按照 clash 配置正确地,并发地向 nameserver 和 fallback 中的 dns 服务器发出了域名解析请求( ipleak 提供的测试域名),也收到了发回的响应,所以不太可能是 clash 或者 windows 系统的问题。

    我推测会不会是因为 nameserver 使用了明文 dns ,导致 dns 泄露,使得 isp 运营商的 dns 服务器也向测试域名发出了解析请求。于是我把配置里 nameserver 中的 dns 服务器全部替换成加密 dns ( DOH ),果然,再次检测后就再也没有中国 dns 服务器的踪迹了。

    需要说明的是,当 clash 使用系统代理+全局模式时,dns 请求会被 clash 加密并全部发往代理服务器,是让代理服务器的 dns 去解析域名,所以也不会出现国内 dns 服务器的踪迹。

    二、

    在解决了上面的 dns 泄露问题后,我又有了新的疑惑。

    clash 系统代理下的规则模式打开,通过 ipleak 网站测试,我发现明明 clash 日志中这些 ipleak 的测试域名最后都是命中了我规则中最后一行的 final ( final 的作用是兜底,当前面的所有规则都没有命中时,域名最后会命中 final 规则,我设置的是命中 final 规则后使用代理服务器).本应该是通过代理服务器去解析域名,但得到的结果和全局模式下检测到的 dns 服务器不同,而且 wireshark 中会发现 clash 在通过 nameserver 和 fallback 发送域名解析请求.

    因为根据那张流程图,域名命中代理规则后应该直接让代理服务器去解析域名,电脑上的 clash 是不该发出这些请求的。这是为什么呢?原因只能是这些测试域名既通过了代理服务器解析域名,又通过 clash 的 dns 去解析域名。

    我又折腾了一下,到处上网查阅,仔细查看那张 dns 解析流程图,我注意到了“匹配到基于 ip 的规则”这几个字,瞬间恍然大悟。原来这是因为 clash 通过从上往下的方式一条条匹配规则,直到命中规则停止。这些测试域名的确命中了 final 规则,通过代理服务器的 dns 解析了域名。

    但是,在此之前,由于我的配置中有基于 ip 的规则存在,位置比 final 规则更靠前,并且没有加上 no- resolve 这个参数( no-resolve 告诉 clash 在遇到基于 ip 的规则时,不要去单独解析域名),导致在遇到这些靠前的 ip 规则时,clash 会先通过 nameserver 和 fallback 中的服务器并发请求,以查看该域名是否符合该 ip 规则,不符合则继续往下匹配规则,最后命中了 final 规则。

    所以这就是为什么在我的电脑上,这些 ipleak 的测试域名既会先被 clash 上的 dns 解析,还会被代理服务器上的 dns 解析。而在全局模式下,因为不需要判断规则,这些自定义测试域名只会被代理服务器解析。

    三、

    说了这么多,我总结出来的经验是,要想避免 dns 泄漏,一个方法是在 nameserver 中使用加密 dns ,另一个是给配置中的 ip 规则后面加上 no- resolve ,告诉 clash 直接跳过,不要去解析域名。最后是 fallback-filter 中设置 geosite 为“!CN”等,这样在遇到国外的网站域名时,clash 不会再并发请求,只会使用 fallback 的 dns 服务器而不会使用 nameserver 中的服务器。可以看出,最后两个方法的思路都是不让 clash 向 nameserver 发送国外网站的 dns 请求。为了防止 dns 泄露,这三个方法我建议最好同时使用。

    上面就是最近这段时间我自己折腾后整理出来的心得,希望能帮助知道如何处理出现的 dns 泄露。不知道文中有没有什么错误,欢迎大家反馈。另外,我到现在也不太清楚图片中的 fake-ip 未命中和 fakeip-Direct 未命中是什么意思,该如何理解,希望有大佬解释一下。

    95 条回复    2024-12-23 19:04:19 +08:00
    RageBubble
        1
    RageBubble  
    OP
       249 天前
    我理解的是 fakeip-Direct 是指那些位于 fakeip-filter 中的域名和网址,也就是那些不使用 fake-ip 的网络连接。但是当我连接 fakeip-filter 中的域名时,查看 wireshark ,clash 还是向 nameserver/fallback 查询了该域名。

    fakeip 未命中也不太理解,如果是“当一个应用程序或设备第一次请求一个域名时,如果这个域名还没有在 Clash 的内部 FakeIP 映射表中,那么它就会是一个“未命中”的情况。”,那么是否意味着所有的第一次发起的域名解析都属于 fakeip 未命中,然后使用代理解析域名?但我在 wireshark 中测试,clash 同样还是向 nameserver 查询了该域名。
    M5tuA
        2
    M5tuA  
       249 天前   ❤️ 1
    你可以进 verge rev 的 TG 群组,没记错 meta 内核的开发者也在其中,可以跟他交流下
    Puteulanus
        3
    Puteulanus  
       249 天前
    我理解的要彻底防止 DNS 泄漏的话,国内 DOH 也得走代理,然后用 EDNS 告诉它一个你所在地的 IP
    MeikoZh
        4
    MeikoZh  
       249 天前
    说了这么多,我咋感觉是 ai 说的,而不是你说的?
    RageBubble
        5
    RageBubble  
    OP
       249 天前
    @Puteulanus 如果提供一个自己实际地理位置的虚假 ip ,还是有可能泄漏位置信息吧
    Puteulanus
        6
    Puteulanus  
       249 天前   ❤️ 1
    @RageBubble 这个已经很宽泛了,而且它也不能确定你提供的就一定是你所在地的 IP
    想要 CDN 解析得准 DNS 肯定还是得知道你大致在什么方位
    heganyuliang
        7
    heganyuliang  
       249 天前   ❤️ 4
    就单纯隐藏翻墙行为而言,使用 clash 时防止 dns 泄漏意义有,但不大

    假设有以下三个域名:
    a.net 非法国外域名
    b.net 合法国外域名
    c.cn 合法国内域名

    只要 clash 配置文件是正常的,而非有且仅有两行:
    - GEOIP,CN,DIRECT
    - FINAL,PROXY
    这种,a.net 都会优先匹配到域名规则,发送到代理端解析; c.cn 也会匹配到域名规则,走 nameserver 解析(顺便说一句,nameserver 用国外 DNS 会非常影响体验,国内服务可能解析到国外 CDN ,国外服务也可能解析到远离代理端的 CDN )

    真正会因为 IP 规则而向 nameserver 发起解析的,只有 b.net (各类 dns 泄漏检测就属于这种)。至于这部分域名能不能向(有污染的) nameserver 暴露,就见仁见智了。至少我认为在大部分情况下,ISP 和墙并不在意你访问这些网站。只要 ISP 没有 DNS 劫持打广告之类的行为(现在应该少见了),即使完全不配置 dns 字段、全部用 ISP 的 DNS 也没什么问题
    Puteulanus
        8
    Puteulanus  
       249 天前
    @heganyuliang 主要是怕 a 的列表更新得没那么及时/没那么全,比如虚拟货币,或者在网上逛到了什么诈骗网站,可能遇到不在 GFWList 里但在 ISP 那边看起来又很严重的
    mschultz
        9
    mschultz  
       249 天前 via iPhone   ❤️ 2
    @heganyuliang 赞同。
    个人简短总结:在较为靠前的位置(在所有 IP 类规则之前)将主流被墙域名分流至代理,例如

    RULE-SET, gfwlist, PROXY

    剩下的就随他去吧。
    Cooky
        10
    Cooky  
       249 天前
    chrome 自身设置全局走 cf 的 doh 再走 clash
    vx007
        11
    vx007  
       249 天前 via Android
    @heganyuliang 有意义啊,光靠域名规则不可能囊括所有 a.net 啊,这必然导致某些"非法"网站 dns 泄露
    RageBubble
        12
    RageBubble  
    OP
       249 天前
    @Puteulanus #8 确实,如果自己的配置中恰好 a.net 非法国外域名没有优先匹配到域名规则,而是先碰到了 IP 规则(没有 no-resolve ),nameserver 又是国内明文 dns 的话,就会暴露。
    RageBubble
        13
    RageBubble  
    OP
       249 天前
    @RageBubble #12 当然这里的暴露是说向 isp 暴露,nameserver 使用国内加密 dns ,内容也会向加密的国内 dns 厂商暴露。
    RageBubble
        14
    RageBubble  
    OP
       249 天前
    @RageBubble #12 所以还是有必要设置 fallback-filter 中的 geosite 和 geoip ,这样即使遇到了这种情况,也只会向 fallback 中设置的国外加密 dns 发送请求,而不会向 nameserver 中的国内加密 dns 发送请求。

    虽然这依赖于 geosite 的数据库,可能还是会有漏网之鱼,但对于普通上网的人来说足够了。
    RageBubble
        15
    RageBubble  
    OP
       249 天前   ❤️ 1
    dns 设置推荐:

    default-nameserver 国内明文 dns
    nameserver 国内加密 dns
    fallback 国外加密 dns
    vx007
        16
    vx007  
       249 天前 via Android
    我认为系统代理或全局代理防止 dns 泄漏很有必要,但只是聊胜于无,避免不了国产软件或系统的主动探测,这个软件可能同时走直连和代理,这相当于代理节点实名了。
    所以我最好不要用系统代理和全局代理,而是直接在单个软件内设置代理为佳。
    BlackEagles
        17
    BlackEagles  
       249 天前
    youtube 的不良林有做过系列视频讲解 dns 泄露问题
    主要是规则里面的涉及 ip 的规则,如果不加 no-resolve 的话 clash 就会直接发起 dns 请求然后判断是否符合规则。
    RageBubble
        18
    RageBubble  
    OP
       249 天前
    @M5tuA 已经加过了,但是 tg 群组(包括所有社交软件的群组)其实都不太适合严肃讨论,倒是可以在 github 上问一下
    RageBubble
        19
    RageBubble  
    OP
       249 天前
    @vx007 #16 确实是这样,但是对于绝大部分的普通人来说,他们的需求只是尽量降低隐私泄露,用最小代价实现最大的隐私保护,本质上是效能问题。
    SenLief
        20
    SenLief  
       249 天前
    解决的最佳手段就是所有的 dns 请求 8.8.8.8
    xwhxbg
        21
    xwhxbg  
       249 天前
    所谓的全局+系统代理看起来说的应该是隧道模式,也就是所有流量不管是不是要走 direct 都按照虚拟网卡( tun )=>tun2socks=>lwip/gvisor=>clash=>rule match=>remote 这个形式
    这种模式下某些 clash 客户端做的是直接把你发往 53 端口的 udp packet 全都通过软路由或者 hard coding 丢进 clash 启动的 dns 服务器,这里再根据你的配置是否走 fake ip 还是 resolve ,开源版本是直接 dial 出去了,但是这个 dial 又会走进刚才那一套重新看 match 哪个 rule ,因为这个 dial 没有 mark socket ,然后如果你写的是 MATCH,US 也就是全局走 US ,那么 dns 的请求就会 match 到这个,dial 的时候就会走 US 的服务器
    所以你如果想要的是非全局模式下也能让 dns 走 remote 再出去,可以直接写一条针对你 dns 服务器的规则就行了,因为比如 trojan 的协议是 tls 的,dns 请求虽然是明文的但是走了 trojan 再出去就不是了
    clash 的 dns 配置开源版本是支持 https ,tls ,tcp 和普通的 udp 的,但是 tcp 和 https 的 bug 太特么多了,要是不想改代码不建议直接用
    RageBubble
        22
    RageBubble  
    OP
       248 天前
    @xwhxbg 我这里说的就是系统代理,没有涉及 tun 模式
    wzhpro
        23
    wzhpro  
       248 天前
    你们应该再担心下 ipv6 泄露
    Jirajine
        24
    Jirajine  
       248 天前
    如果你的使用场景涉及不想让其他实体知道你访问的网站,那么你就不是 clash 的目标用户。你有空抓包不如去看看代码,看了你就会知道你现在所做的这些就如同用筛子装水,漏洞百出。
    ochatokori
        25
    ochatokori  
       248 天前 via Android
    https://github.com/vernesong/OpenClash/issues/3843#issuecomment-2054031364
    用的这个配置,在你发的这个检测网站测不出来。

    但是把,只要用分流模式就很难避免泄漏,只要同时请求你分流的不同区域查询 ip 服务,只要不一致那肯定有一边开了代理
    jackOff
        26
    jackOff  
       248 天前
    dns 分流应该是其他软件的职责,clash 的职责撑死就应该只是代理加一个 fakeip ,过多的 one for all 导致的结果就是普通设备跑 clash 的速度都很不理想
    zbowen66
        27
    zbowen66  
       248 天前
    我不专业,我用 MosDNS 作为 Clash 的 DNS 上游,没有出现泄露
    mschultz
        28
    mschultz  
       248 天前 via iPhone
    @SenLief #20 我以为明文的 8.8.8.8 已经几乎等价于设置为运营商 DNS 了。
    先不说有没有境内 Anycast 以及延迟问题,反正查询一定会被监听,被污染的域名也一定会被抢答… 所以在中国大陆环境下设置 DNS 为明文的 8.8.8.8 应该没有任何意义吧。
    jqtmviyu
        29
    jqtmviyu  
       248 天前   ❤️ 1
    所以这样的设置有问题吗?(实在有点难看懂)
    dns:
    enable: true
    ipv6: true
    listen: '0.0.0.0:53' # 监听所有 53 端口
    use-hosts: true
    enhanced-mode: fake-ip
    fake-ip-range: 198.18.0.1/16
    fake-ip-filter:
    - '*.lan'
    default-nameserver: # 解析 nameserver
    - 223.5.5.5
    - 119.29.29.29
    nameserver:
    - https://223.5.5.5/dns-query # 阿里
    - https://120.53.53.53/dns-query # 腾讯
    fallback:
    - https://1.1.1.2/dns-query # cloudflare (过滤恶意网站)
    - https://1.0.0.2/dns-query # cloudflare (过滤恶意网站)
    - https://208.67.222.222/dns-query # OpenDNS
    - https://208.67.220.220/dns-query
    - https://9.9.9.9/dns-query # IBM Quad9 (过滤恶意网站)
    fallback-filter: # 满足条件的将使用 fallback
    geoip: true
    geoip-code: CN # 除了配置的国家 IP, 其他的 IP 结果会被视为污染
    geosite: # 列表的内容被视为已污染
    - gfw
    ipcidr: # 这些网段的结果会被视为污染
    - 240.0.0.0/4
    Blankspacee
        30
    Blankspacee  
       248 天前 via iPhone
    鉴定完毕,看不良林看多了。
    danbai
        31
    danbai  
       248 天前 via Android
    直接用 warp
    RageBubble
        32
    RageBubble  
    OP
       248 天前
    @Blankspacee 并不认识
    xwhxbg
        33
    xwhxbg  
       248 天前
    @RageBubble 指向不明,系统代理说的如果是网络设置里面的 http https 代理,那个不可能代理 udp 流量,所以试图用这个来代理普通 dns 怕是不行
    zhy0216
        34
    zhy0216  
       248 天前 via Android
    想不明白 ipleak 是怎么知道你用哪个 dns 解析的?
    RageBubble
        35
    RageBubble  
    OP
       248 天前
    @xwhxbg 据我所知,clash 内置的 dns 模块本身就会劫持和处理 dns 请求,然后再决定是否本机发出解析请求还是让远程代理服务器解析。
    和 clash 是否使用的是 http 还是 socks5 代理没有关系,这应该是两个不同的部分。
    icy37785
        36
    icy37785  
       248 天前 via iPhone   ❤️ 1
    所谓应对 dns 泄漏没有任何意义。互联网民科特别喜欢跟 dns 过不去,不是做无用功就是反方向做功。坏就就坏在互联网民科的经验分享充满了整个互联网,把你这样的青春少年都带偏了。
    RageBubble
        37
    RageBubble  
    OP
       248 天前
    @icy37785 如果不忍心看着我们被带偏,那就好心给我们科普一下,为什么应对 dns 泄漏没有任何意义。怎么界定互联网民科,为什么互联网民科不是做无用功就是反方向做功?你有什么好的上网隐私保护建议?
    vocaloid
        38
    vocaloid  
       248 天前
    你把主流国外网站列出来放到配置里强制走远端代理就好了,doh 的话解析速度太慢了,实在受不了
    RageBubble
        39
    RageBubble  
    OP
       248 天前
    @xwhxbg #33 遵循系统代理的软件把 dns 请求发到了 clash 上,这个过程确实没有“代理”dns
    RageBubble
        40
    RageBubble  
    OP
       248 天前   ❤️ 1
    @jqtmviyu ipcidr 和 fake-ip-filter 还可以继续完善补充,但这样的设置对普通人上网来说已经可以了。
    vcn8yjOogEL
        41
    vcn8yjOogEL  
       248 天前
    解决方法就是不要用 Clash 解析, 它始终并发查询全部 DNS, 规则是用来筛选结果的
    lxcopenwrt
        42
    lxcopenwrt  
       248 天前   ❤️ 1
    像楼上说的用其他支持加载域名列表的 DNS 分流然后作为 clash 的 DNS 上游就行了,例如 mosdns 就能完美解决 DNS 泄露问题只是要花点时间研究
    RageBubble
        43
    RageBubble  
    OP
       248 天前
    @lxcopenwrt 第一次听说 mosdns ,有空去看看
    LuvF
        44
    LuvF  
       248 天前   ❤️ 1
    @RageBubble
    我现在是
    default-nameserver 国内明文 dns
    nameserver 国内加密 dns
    nameserver-policy
    geosite:private,cn 国内加密 dns
    geosite:geolocation-!cn 国外加密 dns
    fallback 空
    LuvF
        45
    LuvF  
       248 天前
    @LuvF 用 ipleak 测了一下 没有本地 isp 的 dns
    9H93q6EKnTVFQDRq
        46
    9H93q6EKnTVFQDRq  
       248 天前
    还是 v2ray 简单,可惜没有路由插件
    heganyuliang
        47
    heganyuliang  
       248 天前
    @Puteulanus #8
    @vx007 #11
    理论上确实是有可能的,但是目前热门的规则集之类更新得还是挺频繁,并且现实中我自己 FINAL 用的是直连,从来没遇到过被墙的网站走到了 FINAL ,只有主动屏蔽大陆访问的要临时切换成代理
    fightkirito
        48
    fightkirito  
       248 天前 via Android
    我可以证明楼主,我用联通 wifi 链接 clash 规则模式有的外网会被自动跳转到 js96110 。5g 网则不会。太怪了,再这样我都不太敢用 clash 了。然后今天就看到楼主发了帖子。
    fightkirito
        49
    fightkirito  
       248 天前 via Android
    @fightkirito 我是看这个网站被跳转的。1000novel.com
    RageBubble
        50
    RageBubble  
    OP
       248 天前
    补充下,我使用 clash verge rev ,mihomo 内核,windows11 系统,不用系统代理而是开启 tun 模式,哪怕我的 nameserver 和 fallback 都是加密 dns ,不论是使用规则还是全局都会泄露。也就是绕过了 clash ,直接让操作系统里设置的 dns 向测试域名发送解析请求。

    我猜测可能是内核 tun 和 windows11 的适配有关,因为在另一台 windows10 电脑上就不会有泄露。
    RageBubble
        51
    RageBubble  
    OP
       248 天前   ❤️ 1
    @zhy0216
    在 DNS 泄露检测服务中,通过创建专门的测试域名和设置这些测试域名的 NS 记录(指明哪些 DNS 服务器是负责处理特定域名的查询)指向检测服务控制的 DNS 服务器,检测服务可以追踪所有对这个子域名的查询。当设备尝试解析这些测试域名时,所有的 DNS 请求将被发送到有检测服务的服务器,允许服务检测是否有任何非预期的 DNS 服务器在处理这些查询。
    bluaze
        52
    bluaze  
       248 天前
    ip 规则都 no-resolve 的话,除非能保证这些 ip 都是直接通过 ip 访问的,不然这些 ip 规则就是废了
    Puteulanus
        53
    Puteulanus  
       248 天前
    @heganyuliang 被墙的我相信大部分应该是没问题的,但是像诈骗的跟这一套天然冲突,他们肯定会勤换域名,尽量保证自己不在屏蔽名单上,毕竟被屏蔽了还怎么骗人;各种规则的作者也不一定有动力去收录这种网站,毕竟根本不是正常用户想要去访问的

    蛋疼点在于现在国内反诈搞得如火如荼,经常能看到这种帖子 /t/1032543 ,你不小心点了个诈骗网站说不定优先级比上了被墙网站都高

    至于说为什么要去开诈骗网站,我觉得经常搜东西的应该都见过他们那种黑帽 SEO ,真的很难保证自己永远一个都不点到。。
    bluaze
        54
    bluaze  
       248 天前
    @i571 有 v2rayA
    Internet0User
        55
    Internet0User  
       248 天前 via Android   ❤️ 1
    @wzhpro 终于看见有人提 IPv6 泄漏 DNS 了
    HackerTerry
        56
    HackerTerry  
       248 天前
    借楼问一下,openwrt 软路由的 passwall2 插件怎么避免 dns 泄露啊?用了 mosdns 作为上游 dns 服务器,劫持了软路由的 dns 请求并分流
    Fish1024
        57
    Fish1024  
       248 天前
    的确是这样。
    我只在需要代理的时候在应用中设置代理,不用系统代理和 tun 模式。
    xclrr
        58
    xclrr  
       248 天前 via Android   ❤️ 1
    之前专门研究过这个问题,很简单,泄漏的原因就是你本地运行 clash 的机器向你配置的 nameserver 发起了查询,默认是本地和远程同时去查,dns 泄漏就是在你本地去查的时候发生的,clash meta 可以配置这个查询只由远程去做,nameserver 后面加#group 就可以了
    yyysuo
        59
    yyysuo  
       248 天前   ❤️ 1
    说得很好,研究也挺有意思的,不过你这种结论,完全可以通过阅读文档或看看不良林的视频就解决了。
    sapphire
        60
    sapphire  
       248 天前   ❤️ 1
    Sukka (@isukkaw) 最近写了一篇 blog 更全面的论述了这个问题,用的 Surge ,Clash 很类似的。
    https://blog.skk.moe/post/i-have-my-unique-surge-setup/
    superht
        61
    superht  
       248 天前   ❤️ 1
    按道理,nameserver 设为非加密 dns ,并不会导致 dns 泄露,可能是有其他地方导致的泄露。而且建议 namesever 设为国内 dns ,同时用尽量完善的规则覆盖国外访问,这样你才能获得最佳体验,避免访问国内网站不顺畅、且无法获得 cnd 优势。

    fallback 的作用是对比,当出现和 nameserver 不同时,采用 fallback 的结果。如果你用 fakeip 模式的话,建议删掉 fallback 。因为 fakeip 模式下,不需要拿到真实 ip 才能发起访问,且域名发到代理服务器进行 dns 解析了,本地的 fallback 解析对比失去了意义。

    fakeip-direct 是指未命中缓存、且规则为“直连”的域名或 ip 。

    要保障 dns 不泄露,应该完善规则----把经常访问的域名或 ip 放到规则中( ip 加上 no-resolve )----尽量实现远程 dns 解析。官方文档中有一套推荐配置,防漏效果已经很不错了,可以参考一下。
    xwhxbg
        62
    xwhxbg  
       248 天前
    @RageBubble 并不会,tun 模式下是会自动把 53 端口的流量导入 clash 的 dns ,这个是通过软路由实现的( windows ),如果 enable 了的话,但是 http 和 https 代理下并不会做这个,之所以你用 doh+全局就让 dns 能走 clash 单纯是因为 doh=https ,https 会走 http 和 https 代理
    isukkaw
        63
    isukkaw  
       248 天前   ❤️ 1
    @sapphire #58 整篇文章其实就下面一段话和这个问题有关,我直接 quote 出来好了:

    > **避免 DNS 污染和 DNS 泄漏最有效的办法就是(让这个域名)永远不在本地进行 DNS 解析**,而 Surge 和 Clash **能且只能通过 Fake IP 和域名规则匹配**的方式 可以实现非直连域名 **一定不在本地本机进行任何 DNS 解析**。在 Surge 和 Clash 中,规则自上而下匹配,**只有当遇到 IP 类规则(如 IP-CIDR 、IP-CIDR6 、GEOIP 和 IP-ASN )时才会发起 DNS 解析**。因此,在 Surge 中,**将会触发 DNS 解析的规则放在域名和 URL 匹配规则后面非常重要**。
    >
    > ---------------------
    > 本文著作权归作者 Sukka 所有。本文采用 CC BY-NC-SA 4.0 许可协议,商业转载请联系作者获得授权,非商业转载请注明出处。
    > 作者:Sukka
    > 来源:我有特别的 Surge 配置和使用技巧
    > 链接: https://blog.skk.moe/post/i-have-my-unique-surge-setup/
    sapphire
        64
    sapphire  
       248 天前
    @isukkaw Sukka 之前写过几篇来解释 DNS 相关问题,这也是我为何要把文章链接发出来,原文开头就 DNS 说明如下:

    如果没有相关的知识储备,你在阅读本文时可能会难以理解分流规则和配置。你可以阅读我之前写过的 数篇关于 DNS 的文章,本文不会再做详细赘述。
    sapphire
        65
    sapphire  
       248 天前
    @isukkaw 抱歉,原来 Sukka 本尊
    heganyuliang
        66
    heganyuliang  
       248 天前
    @Puteulanus #53 诈骗网站确实需要另当别论,所以我最开始也说了单纯隐藏翻墙的话检查 dns 泄露意义不大
    RageBubble
        67
    RageBubble  
    OP
       248 天前
    @isukkaw 哈哈,今天正好在都你网站上写的“浅谈在代理环境中的 DNS 解析行为”
    RageBubble
        68
    RageBubble  
    OP
       248 天前
    @isukkaw 我刚好有个问题想请教一下您。在 tun 模式下,wireshark 捕获 tun 网卡可以直接看到发起的 dns 请求与返回的 fakeip ( 198.18.0.1/16 ),但是在系统代理下,为什么我在 loopback traffic capture 接口上却看不到发起的 dns 请求或者任何返回的 fakeip 呢,是因为 clash 的 fakeip 只会在 tun 模式下生效吗还是因为某种原因不经过 loopback 接口?
    Knights
        69
    Knights  
       248 天前
    我这样配置后上 V2EX 就没有本地 dns 查询了:
    nameserver:
    - "tls://8.8.8.8:853#yun"
    - "tls://1.1.1.1:853#yun"
    nameserver-policy:
    geosite:cn,private:
    - 192.168.1.1 //本地的 adguard home
    rules:
    - GEOSITE,CN,DIRECT
    - GEOIP,CN,DIRECT
    - MATCH,yun

    Firefox 里设置 socks5 代理 dns 查询
    BadFox
        70
    BadFox  
       248 天前
    谢谢楼主分享,另外请问一下这个图是用什么画的呀?
    RageBubble
        71
    RageBubble  
    OP
       248 天前
    @BadFox 这是 mihomo 官方 wiki 中的图片,不是我画的
    Nobin
        72
    Nobin  
       248 天前   ❤️ 1
    另外提一嘴,Windows 有个“智能多宿主名称解析”功能,这个功能很坑,**务必关闭**。

    "智能多宿主名称解析"( LLMNR ,Link-Local Multicast Name Resolution )是微软引入 Windows 的加快 DNS 解析速度的功能,通过在所有可用的网络适配器上发送 DNS 请求来实现,并自动选择返回速度最快的信息。

    尽管从性能角度来看,这个功能是有道理的,但它在隐私方面引入了一个问题。

    例如,在 Windows 机器上连接到代理网络时,智能多地址名字解析可能导致 DNS 泄漏。因为请求会同时发送到所有网络适配器,所有配置的 DNS 服务器都会收到这些请求,从而获取你访问的网站信息。
    stone9527
        73
    stone9527  
       248 天前
    @sapphire Sukka 的配置我用了,对我来说不怎么好用
    Holodusk
        74
    Holodusk  
       247 天前
    好多人都忽略了 Clash 有个特点:域名 UDP 流量一定会触发 DNS 解析。
    除了把国外网站都加到 nameserver-policy 里没有很好的解决办法
    RageBubble
        75
    RageBubble  
    OP
       247 天前
    @superht 那张图中的 fakeip 未命中又该怎么理解呢?
    RageBubble
        76
    RageBubble  
    OP
       247 天前
    @RageBubble #50 泄露是因为没有在 clash verge rev 上的 tun 设置中开启“严格路由”,导致 windows 使用了智能多宿主名称解析,让系统 dns 也去解析域名。要避免这一点,一个是开启“严格路由”,另一个就是手动关闭 windows 上的智能多宿主名称解析服务。直接去修改系统 dns 也是一种办法,但没有前两种方法更直接。
    RageBubble
        77
    RageBubble  
    OP
       247 天前
    @xwhxbg #62 以浏览器举例,系统代理下,浏览器发出域名请求,只需要把域名封装到 http 或者 socks5 代理中交给 clash 处理,和 udp 什么的没关系。
    RageBubble
        78
    RageBubble  
    OP
       247 天前
    @isukkaw 我在自己的电脑上测试了一下:

    fakeip 似乎只会在 tun 模式开启后才使用

    tun 规则模式下:
    如果最后是代理连接,clash 中的 fallback 查询 dns (以太网接口),程序用 fakeip 发起 tcp 连接( tun 接口),使用代理服务器发起 tcp 连接(以太网接口)。

    如果是直连,clash 中的 nameserver 查询 dns (以太网接口),程序用 fakeip 发起 tcp 连接( tun 接口),本机对真实 ip 发起的 tcp 请求(以太网接口)。

    代理软件 clash 在 fakeip 模式下还是会进行 DNS 解析,这点和你文章中说的有些不同

    系统代理下:
    程序会直接通过 http 代理与 clash 建立 tcp 连接,然后 clash 去处理域名解析(程序发送 client hello 后到服务器返回 server hello 之间有明显的时间间隔,就是用来处理域名解析的时间)
    superht
        79
    superht  
       247 天前   ❤️ 1
    @RageBubble #75 “FakeIP 未命中,代理域名”这类应该属于既不是直连、又未匹配到规则,也就是最终匹配到 match 或 IP 规则了,这类会通过 nameserver dns 进行解析,解析到国内 ip 就直连,解析到国外 ip 就把 ip 发给代理,要求代理进行连接。如果 clash 有开启域名嗅探功能,解析到国外 ip 情况下,仍然会将域名传递给代理服务器,进行远程 dns 解析,优化连接
    RageBubble
        80
    RageBubble  
    OP
       246 天前
    clash verge rev 未来会移除 fallback-filter 的 geosite ,建议直接使用 nameserver-policy 中的 geosite, nameserver-policy 优先于 nameserver/fallback 查询
    RageBubble
        81
    RageBubble  
    OP
       246 天前
    @superht #79

    那张图想表达的应该是 fakeip 模式下,两种二选一的逻辑,不知道这样理解对不对:
    "fakeip-direct 未命中"是指未命中 fakeip 缓存、且规则为直连的域名 。
    "fakeIP 未命中,代理域名"是指未命中 fakeip 缓存、且规则为代理的域名。
    markchen88
        82
    markchen88  
       245 天前
    开全局么,是不是不怕你的解析记录什么的被运营商或者 DNS 服务提供商查到了
    superht
        83
    superht  
       245 天前
    @RageBubble #81 可能是。不知道作者想表达的意思是什么,自己的理解再结合图考虑吧。原理应该大致差不多。
    vx007
        84
    vx007  
       245 天前
    @RageBubble ip 规则全部设置了 no resolve 后,走代理的网站 dns 解析全由代理服务器负责了,所有本地抓不到 dns 请求
    ky1e
        85
    ky1e  
       237 天前
    @zbowen66 #27 请问是 win 上还是软路由上?如果是 win 求问具体 dns 配置,谢过
    zbowen66
        86
    zbowen66  
       237 天前
    UchihaJay
        87
    UchihaJay  
       177 天前
    根据
    https://gist.github.com/yuzhi535/e8bfe80b8f819550c77de25c027769ae#file-clash-yaml-L42

    fallback 主要的作用还是避免 dns 污染,启用后似乎会并行发给 nameservers

    ```
    # When `fallback` is present, the DNS server will send concurrent requests
    # to the servers in this section along with servers in `nameservers`.
    # The answers from fallback servers are used when the GEOIP country
    # is not `CN`.
    # fallback:
    # - tcp://1.1.1.1
    # - 'tcp://1.1.1.1#en0'
    ```

    不知道各位是怎么配置的
    Earsum
        88
    Earsum  
       172 天前
    我现在用的方案是用 nameserver-policy
    'geosite:cn,apple,private,microsoft,onedrive': '127.0.0.1:10053'
    让国内、苹果、onedrive 、私有域名走自建 adguardhome
    nameserver 只设置国外的 dns 服务器解析境外域名,ipleak 就没有泄露了
    neverbelieveyou
        89
    neverbelieveyou  
       169 天前
    clash_meta 如果直接设置国外 dns 的话,这个 dns 是不会走代理的。比如你设置的 8.8.8.8 ,就不会走代理,然后又因为是发给谷歌 DNS 的解析请求是明文的,就会被运营商劫持,劫持之后跟走 isp 的 dns 效果是一样的,这样自然而然就发生泄露了。
    neverbelieveyou
        90
    neverbelieveyou  
       169 天前   ❤️ 1
    DNS 请求要要经过代理的话,有两个办法,一个是设置 respect-rules: true ,这样 DNS 连接才会跟随 rules 配置选择走代理或者走直连。

    另外一个办法是像下面这样添加 #dns 来指定 DNS 走对应的出口(#dns 是某个出口的标签)
    nameserver:
    - 'tls://dns.google#dns'
    playboy0
        91
    playboy0  
       167 天前
    严格路由和禁用`智能多宿主名称解析`两种方法同时用会出现网页加载缓慢的现象。
    https://github.com/MetaCubeX/mihomo/issues/778
    lin41411
        92
    lin41411  
       133 天前
    我不是很理解。我用的是 Openclash ,fakeip 模式

    在我的 dns 覆写设置里面,只勾选了“自定义上游 DNS 服务器",并且在 nameserver 中,只配置了一组 dns ,就是我本地的 adguardhome ,为了获取更快的解析速度,我在 adg 的上游 dns 设置为运营商的明文 dns 。并没有使用任何国内外的 doh ,dot 加密 dns 。另外,openclash 的 dns 中,fallback 跟 nameserver-default 我均没勾选。注意,是没勾选。

    在我的规则中,除了前面的各类自定义规则外,规则最后是:
    ruleset=🎯 全球直连,[]GEOSITE,CN
    ruleset=🚀 节点选择,[]GEOSITE,geolocation-!cn
    ruleset=🎯 全球直连,[]GEOIP,LAN,no-resolve
    ruleset=🎯 全球直连,[]GEOIP,CN,no-resolve
    ruleset=🐟 漏网之鱼,[]FINAL

    按以上配置,我无论如何测试 dns 泄露,均不会出现国内 dns 。而检测出来的 dns 均为我漏网之鱼所选择的节点。例如我漏网之鱼选择的是 hk ,那 ipleak (包括其它 dns 泄露检测网站)检测出来的就是 hk 。如果是新加坡,那检测出来的就是新加坡。

    这个结论似乎跟 op 的结论相悖。因为我理解 op 要表达的意思是 nameserver 需要使用加密 dns 来防止泄露。但显然的,我的 dns 设置里面不含任何加密设置。

    所以我其实也挺想了解及探讨这个问题。
    RageBubble
        93
    RageBubble  
    OP
       132 天前
    @lin41411

    我说的那些只适用于 mihomo 这个 clash 内核,不同的内核它解析 dns 的规则是不一样的,这个要去看 openclash 的文档。
    另外,之所以检测出来的地区均为漏网之鱼所选择的节点,是因为 ipleak 生成的检测域名最后都命中到了你的 final 规则集(你规则中用了 no-resolve ,就不会触发"匹配到基于 ip 的规则"),你的 final 选择了走代理。那就是用你选择的代理服务器去解析域名。
    sikeer
        94
    sikeer  
       85 天前
    @neverbelieveyou

    请问下面的用法:

    nameserver:
    - 'tls://dns.google#dns'

    clash-meta ( mihomo )支持吗?可以是:
    - "https://8.8.8.8/dns-query#dns"
    neverbelieveyou
        95
    neverbelieveyou  
       2 天前 via Android
    @sikeer clash meta 支持的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5394 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 08:49 · PVG 16:49 · LAX 00:49 · JFK 03:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.