杂项
路由上的 OpenClash DNS 双栈优先 IPv4 配置

前言

最近 docker 被上头 gank 了,打开 docs.docker.com 发现打不开,用的 openclash(+meta 核) 的 redir-host 一开始还以为是 dns 污染,后面才发现是走了 ipv6。

然后修改了 windows 的 ipv4 优先,发现效果没啥用,后面想着直接在 dns 只返回 ipv4 得了。

配置 IPV4 优先

目前只靠 openclash 是无法实现 dns 优先返回 ipv4 的,这时候就需要国外分流到 mosdns 进行解析了。

方法一 openclashs 国内 + mosdns 国外配置

openclash 的 dns 服务器代理国内流量

dns:
  enable: true
  listen: :1053
  ipv6: true
  enhanced-mode: redir-host
  fake-ip-filter:
    - "*"
    - "+.lan"
    - "+.local"
  default-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  proxy-server-nameserver:
    - https://223.5.5.5/dns-query
  nameserver:
    - https://223.5.5.5/dns-query
    - https://1.12.12.12/dns-query
  nameserver-policy:
    "geosite:cn":
      - 223.5.5.5
      - 119.29.29.29
    "geosite:geolocation-!cn":
      - "udp://127.0.0.1:5335"
    # "+.ipleak.net":
    #   - "udp://127.0.0.1:5335"

mosdns v5 使用自定义配置,全走远程服务器的 DNS,DNS 转发 取消勾选。

log:
  level: info
  file: "/var/log/mosdns.log"
 
# API 入口设置
api:
  http: "0.0.0.0:9091"
 
include: []
 
plugins:
  # 缓存
  - tag: lazy_cache
    type: cache
    args:
      size: 20000
      lazy_cache_ttl: 86400
      dump_file: "/etc/mosdns/cache.dump"
      dump_interval: 600
 
  # 转发至远程服务器
  - tag: forward_remote
    type: forward
    args:
      upstreams:
        - addr: tls://8.8.8.8
          bootstrap: 223.5.5.5
          enable_pipeline: false
        - addr: tls://1.0.0.1
          bootstrap: 223.5.5.5
          enable_pipeline: false
        - addr: tls://9.9.9.9
          bootstrap: 223.5.5.5
          enable_pipeline: false
 
  # 国外解析
  - tag: remote_sequence
    type: sequence
    args:
      - exec: prefer_ipv4
      - exec: $forward_remote
 
  # 有响应终止返回
  # - tag: has_resp_sequence
  #   type: sequence
  #   args:
  #     - matches: has_resp
  #       exec: accept
 
  # fallback 用远程服务器 sequence
  - tag: fallback
    type: fallback
    args:
      primary: remote_sequence
      secondary: remote_sequence
      threshold: 500
      always_standby: true
 
  # 主要的运行逻辑插件
  # sequence 插件中调用的插件 tag 必须在 sequence 前定义,
  # 否则 sequence 找不到对应插件。
  - tag: main_sequence
    type: sequence
    args:
      - exec: $lazy_cache
      - exec: $fallback
 
  # 启动 udp 服务器。
  - tag: udp_server
    type: udp_server
    args:
      entry: main_sequence
      listen: ":5335"
 
  # 启动 tcp 服务器。
  # - tag: tcp_server
  #   type: tcp_server
  #   args:
  #     entry: main_sequence
  #     listen: ":5335"

方法二 mosdns 接手全部 DNS 解析

openclash 的 dns 走本地的 mosdns,记得把 openclash 覆写设置追加上游 DNS 关掉,

然后 mosdns 用内置预设就足够用了,高级设置内把远程 DNS 首选 IPv4防止 dns 泄漏的选项打开即可。

dns:
  enable: true
  listen: :1053
  ipv6: true
  enhanced-mode: redir-host
  fake-ip-filter:
    - "*"
    - "+.lan"
    - "+.local"
  default-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  proxy-server-nameserver:
    - https://223.5.5.5/dns-query
  nameserver:
    - udp://127.0.0.1:5335

测试 DNS 泄漏

https://ipleak.net/ (opens in a new tab)

PS: geosite:geolocation-!cn 内不含 ipleak.net,需要自己添加 "+.ipleak.net" 规则