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

Mihomo(Clash.Meta) 匹配路由规则的 DNS 配置

  •  
  •   Rabbit52 · 19 天前 · 1710 次点击

    参考资料:

    先贴我的的 dns 配置

    dns:
      enable: true
      listen: 0.0.0.0:7874
      ipv6: false
      enhanced-mode: redir-host
      respect-rules: true
      # 附加参数 #RULES 为遵守路由规则进行连接,等同于 respect-rules
      nameserver:
      # 指定使用 dns 路由规则进行连接
      # nameserver-policy 未匹配的域名将使用以下 dns 解析
        - tls://8.8.8.8#dns
        - tls://1.1.1.1#dns
      proxy-server-nameserver:
        - https://120.53.53.53/dns-query
        - https://223.5.5.5/dns-query
      nameserver-policy:
        # 白名单分组使用运营商 dns 解析
        "geosite:private,onedrive,microsoft@cn,apple,apple-cn,category-games@cn,cn":
          - 运营商 dns
        # 自定义白名单分组同样使用 运营商 dns 解析
        "rule-set:custom-direct":
          - 运营商 dns
    

    解释一下我的场景,路由器上使用 mihomo 插件,白名单模式,未开启 ipv6 ,使用 geosite 规则,路由规则如下:

    rules:
      - GEOIP,lan,DIRECT,no-resolve
      - GEOSITE,private,DIRECT
      # 高优先级标注需要代理的规则防止被后面的直连规则影响
      - GEOSITE,google,其他
      - GEOSITE,google-cn,其他
      - RULE-SET,openai,OpenAI
      # 以下为直连
      - GEOSITE,onedrive,DIRECT
      - GEOSITE,microsoft@cn,DIRECT
      - GEOSITE,apple,DIRECT
      - GEOSITE,apple-cn,DIRECT
      - GEOSITE,steam@cn,DIRECT
      - GEOSITE,category-games@cn,DIRECT
      - GEOSITE,cn,DIRECT
      - GEOIP,CN,DIRECT
      - RULE-SET,custom-direct,DIRECT
      # 剩余全代理
      - MATCH,其他
    

    配置思路如下:

    1. 将我认为直连能获得更佳体验的分组打上 DIRECT 规则并且使用运营商 dns 进行解析,获得国内 CDN 加成,比如 apple, ms, dji, steam 等。
    2. 未使用 fallback 配置,避免直连解析耗时较长。
    3. 使用 rule-providers 自定义直连规则降低 nameserver-policy 配置复杂度。
    第 1 条附言  ·  2 天前

    根据网友对 no-resolve 的解释和我最近的实践,dns 和 rules 部分更新如下:

    dns:
      enable: true
      listen: 0.0.0.0:7874
      ipv6: false
      enhanced-mode: redir-host
      respect-rules: true
      # 和代理规则一致, 没有匹配 nameserver-policy 规则的统一走国外 dns
      nameserver:
        - tls://8.8.4.4
        - tls://1.1.1.1
      proxy-server-nameserver:
        - https://120.53.53.53/dns-query
        - https://223.5.5.5/dns-query
      nameserver-policy:
        # google 优先使用国外 dns 和下面的代理规则一致,可以解决 play 无法下载问题, 否则会被下面的 cn list 匹配使用国内 dns 解析到错误 ip
        "geosite:google":
          - tls://8.8.4.4
          - tls://1.1.1.1
        "geosite:private,onedrive,microsoft@cn,apple,category-games@cn,cn":
          - 119.29.29.29
          - 223.5.5.5.5
        # 自定义直连域名使用国内 dns
        "rule-set:custom-direct-domain":
          - 119.29.29.29
          - 223.5.5.5.5
    
    rules:
      # 禁用 quic 后部分国内服务访问缓慢只能关闭
      #- AND,(AND,(DST-PORT,443),(NETWORK,UDP)),(NOT,((GEOSITE,cn))),REJECT # quic
      - GEOIP,lan,DIRECT,no-resolve
      - GEOSITE,private,DIRECT
      # 禁用 quic 后部分国内服务访问缓慢只能关闭
      #- AND,(AND,(DST-PORT,443),(NETWORK,UDP)),(NOT,((GEOIP,CN))),REJECT # quic
    
      # 高优先级分组, 保证 Google 所有域名走代理
      - GEOSITE,google,其他
    
      - GEOSITE,onedrive,DIRECT
      - GEOSITE,microsoft@cn,DIRECT
      - GEOSITE,apple,DIRECT
      - GEOSITE,steam@cn,DIRECT
      - GEOSITE,category-games@cn,DIRECT
      - GEOSITE,cn,DIRECT
    
      - GEOIP,CN,DIRECT,no-resolve
    
      # 自定义, 将 ipset 和 domain list 分开有匹配性能更好
      - RULE-SET,custom-direct-domain,DIRECT
      - RULE-SET,custom-direct-ip,DIRECT,no-resolve
    
      - MATCH,其他
    
    12 条回复    2024-09-29 12:56:00 +08:00
    vvhy
        1
    vvhy  
       19 天前
    geoip 没加 no-resolve
    可以用 wireshark 抓包确认一下
    Rabbit52
        2
    Rabbit52  
    OP
       19 天前 via iPhone
    @vvhy 查了下确实很多人都像你说的这样配置,但是不理解为什么已经匹配到 ip 规则,说明已经解析过了,还需要指定不解析呢
    Rebron1900
        3
    Rebron1900  
       19 天前
    大佬,openclash 的 meta 内核能用吗?
    Rabbit52
        4
    Rabbit52  
    OP
       19 天前
    @Rebron1900 能用,但是注意根据自己的实际情况调整
    vvhy
        5
    vvhy  
       19 天前 via Android
    @Rabbit52 比如浏览器发出一个域名的请求,如果不加 no-resolve ,clash 就会先把域名解析成 ip ,再判断 ip 规则是否满足
    Rabbit52
        6
    Rabbit52  
    OP
       18 天前 via iPhone
    @vvhy 文档的意思好像 no-resolve 的参数只适用于 ip 集,不是域名,我就没搞懂了

    https://wiki.metacubex.one/config/rules/#no-resolve
    JohnSmith
        7
    JohnSmith  
       18 天前
    @Rabbit52 #2 mihomo 的实现,不会去依赖 rules 之间的顺序的,也就是不会带上下文
    Rabbit52
        8
    Rabbit52  
    OP
       18 天前
    @JohnSmith 我的意思是 ip 集的规则它为什么需要 no-resolve 参数呢,本来就有 ip 了呀
    remidre
        9
    remidre  
       14 天前   ❤️ 1
    @Rabbit52 解析是从上至下的,假如有个域名[www.google.com]要走你的规则,一上来碰到的是 ip 集,clash 会先把域名解析成 ip 去匹配你的 ip 集,如果命中了就走你的 ip 规则,没命中就走后面的域名规则,但它已经被解析成 ip 了,后续就不会走你的域名规则了。所以一般 ip 类规则的放后面,或者加 no-resolve ,强制不解析
    Rabbit52
        10
    Rabbit52  
    OP
       14 天前 via iPhone
    @remidre 感谢 解释的很清楚,那看来 match 前加 no-resolve 的可能会代理上一些没在列表内的 cn ip ,不过这本来就是预期内的。
    1014982466
        11
    1014982466  
       12 天前
    问一下大佬, listen: 0.0.0.0:7874 后面端口号是随便写?要不要写 DNS 的 53 端口?我看有的教程随便写,有的写 53 ,有的写 5353
    Rabbit52
        12
    Rabbit52  
    OP
       12 天前
    @1014982466 随便写,只要不被占用就行,如果在路由器上运行 53 肯定已经被占用了,如果是提供 dns 服务可以用 53
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6008 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:25 · PVG 14:25 · LAX 23:25 · JFK 02:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.