<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Dns on Tsic&#39;s Blog</title>
    <link>https://tsic.top/tags/dns/</link>
    <description>Recent content in Dns on Tsic&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Fri, 18 Sep 2026 19:00:00 +0800</lastBuildDate>
    <atom:link href="https://tsic.top/tags/dns/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>oxidns &#43; mihomo 做家庭 DNS 分流：配置文件详解</title>
      <link>https://tsic.top/post/dns-split/</link>
      <pubDate>Fri, 18 Sep 2026 19:00:00 +0800</pubDate>
      <guid>https://tsic.top/post/dns-split/</guid>
      <description>&lt;h1 id=&#34;oxidns--mihomo-做家庭-dns-分流配置文件详解&#34;&gt;oxidns + mihomo 做家庭 DNS 分流：配置文件详解&lt;/h1&gt;
&lt;h2 id=&#34;这套方案解决什么问题&#34;&gt;这套方案解决什么问题&lt;/h2&gt;
&lt;p&gt;设备一多，代理就难管。每台设备各挂各的客户端，配置分散，电视和 IoT 设备没法配。把决策集中到一台机器：设备只认一个 DNS、一个默认网关，该直连的直连，该翻墙的翻墙。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h1 id="oxidns--mihomo-做家庭-dns-分流配置文件详解">oxidns + mihomo 做家庭 DNS 分流：配置文件详解</h1>
<h2 id="这套方案解决什么问题">这套方案解决什么问题</h2>
<p>设备一多，代理就难管。每台设备各挂各的客户端，配置分散，电视和 IoT 设备没法配。把决策集中到一台机器：设备只认一个 DNS、一个默认网关，该直连的直连，该翻墙的翻墙。</p>
<p>方案里两个角色跑在同一台机器上：oxidns 管 DNS 分流，mihomo（clash 核心）管流量出口。oxidns 是 mosdns 的重构版，配置是 YAML。下面按实际运行配置逐段拆解，照抄改改就能跑。</p>
<h2 id="角色分工">角色分工</h2>
<p>oxidns 监听 53 端口收全家的 DNS 查询，按 geosite 名单判断域名归属：geosite cn 和直连名单里的域名，交给国内 ISP 的 DNS 解析，返回真实 IP；geolocation-!cn 的域名，转发给 mihomo 拿 fake-ip。mihomo 应答 fake-ip，接收 fake-ip 段流量，按规则出去。</p>
<h2 id="oxidns-配置">oxidns 配置</h2>
<h3 id="判定名单">判定名单</h3>
<p>geoip 和 geosite 数据来自 Loyalsoldier 的 v2ray-rules-dat，启动时缺了自动下载，之后每 12 小时刷新：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">plugins</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">geoip_private</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">geoip</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">file: ./data/geoip.dat, selectors</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">private] }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">geoip_cn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">geoip</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">file: ./data/geoip.dat, selectors</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">cn] }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">geosite_cn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">geosite</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">file: ./data/geosite.dat, selectors</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">cn, china-list, apple-cn, google-cn] }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">geosite_noncn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">geosite</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">file: ./data/geosite.dat, selectors</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">geolocation-!cn] }</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">data_download</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">download</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l">60s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">startup_if_missing</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">downloads</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">dir</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;./data&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">filename</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;geoip.dat&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">dir</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;./data&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">filename</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;geosite.dat&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://cdn.jsdelivr.net/gh/asterwyx/direct@main/direct-list.txt&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">dir</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;./data&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">filename</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;asterwyx.txt&#34;</span><span class="w">
</span></span></span></code></pre></div><h3 id="直连名单和代理名单">直连名单和代理名单</h3>
<p>直连名单由三部分拼成：geosite cn 打底，加上社区直连列表和自己按需补充的域名。代理名单同理，geosite noncn 打底，再补自己需要的：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">domain_direct</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">domain_set</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">exps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">za.group              </span><span class="w"> </span><span class="c"># 自补充的直连域名</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">argotunnel.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">openrouter.ai</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">integrate.api.nvidia.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">files</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">./data/asterwyx.txt   </span><span class="w"> </span><span class="c"># 社区直连列表</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">sets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">geosite_cn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">domain_proxy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">domain_set</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">exps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">kubevirt.io           </span><span class="w"> </span><span class="c"># 自补充的代理域名</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">regexp:^[^.]+-docker\.pkg\.dev$</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">b.ai</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">sets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">geosite_noncn</span><span class="w">
</span></span></span></code></pre></div><h3 id="特殊域名">特殊域名</h3>
<p>内网域名直答，不走任何上游。公司域名转发给公司内网 DNS。来自 Tailscale 网段（100.64.0.0/10）的查询，把内网域名解析成 tailnet 入口地址，保证从外面访问家里服务时走隧道：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">hosts_home</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">hosts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">entries</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">regexp:.+\.example\.home 192.168.18.31  </span><span class="w"> </span><span class="c"># 内网服务统一入口</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">hosts_tailscale</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">hosts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">entries</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">regexp:.+\.example\.home 100.111.89.100 </span><span class="w"> </span><span class="c"># tailnet 入口</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">domain_deepin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">domain_set</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">exps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">regexp:.+\.example-corp\.com            </span><span class="w"> </span><span class="c"># 公司内网域名</span><span class="w">
</span></span></span></code></pre></div><h3 id="上游">上游</h3>
<p>国外通道全部是 IP 型 DoT/DoH。为什么必须是 IP 型，后面单独讲：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">forward_foreign</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">forward</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">concurrent</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">upstreams</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="l">https://1.1.1.1/dns-query</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">dial_addr</span><span class="p">:</span><span class="w"> </span><span class="m">1.1.1.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">enable_http3</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="l">tls://1.1.1.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">enable_pipeline</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="l">tls://8.8.8.8</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">enable_pipeline</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="l">https://45.11.104.186</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">insecure_skip_verify</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="l">tls://208.67.222.2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">enable_pipeline</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="l">tls://208.67.222.222</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">enable_pipeline</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div><p>国内通道按运营商分两组，环境变量 WH_TELECOM / WH_UNICOM 切换：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">forward_wh-telecom</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">forward</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">concurrent</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">upstreams</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="m">202.103.24.68</span><span class="w">      </span><span class="c"># 武汉电信</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="m">202.103.44.150</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">forward_wh-unicom</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">forward</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">concurrent</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">upstreams</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="m">218.104.111.114</span><span class="w">    </span><span class="c"># 武汉联通</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="m">218.104.111.122</span><span class="w">
</span></span></span></code></pre></div><p>三个特殊上游，是方案对接的关键：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">forward_local       </span><span class="w"> </span><span class="c"># 本地域名，交给路由器</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">forward</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">upstreams</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span>{<span class="w"> </span><span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="m">192.168.18.1</span><span class="p">:</span><span class="m">5353</span><span class="w"> </span>}<span class="w"> </span><span class="p">]</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">forward_clash       </span><span class="w"> </span><span class="c"># 国外域名，转 mihomo 拿 fake-ip</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">forward</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">upstreams</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span>{<span class="w"> </span><span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="m">127.0.0.1</span><span class="p">:</span><span class="m">7874</span><span class="w"> </span>}<span class="w"> </span><span class="p">]</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">forward_deepin      </span><span class="w"> </span><span class="c"># 公司域名</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">forward</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">upstreams</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span>{<span class="w"> </span><span class="nt">addr</span><span class="p">:</span><span class="w"> </span><span class="m">10.20.0.10</span><span class="w"> </span>}<span class="w"> </span><span class="p">]</span><span class="w"> </span>}<span class="w">
</span></span></span></code></pre></div><p>公网查询带缓存，13 万条，懒加载 TTL 一天：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">cache_wan</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">size: 131072, lazy_cache_ttl</span><span class="p">:</span><span class="w"> </span><span class="m">86400</span><span class="w"> </span>}<span class="w">
</span></span></span></code></pre></div><h3 id="查询处理链">查询处理链</h3>
<p>先看五个查询序列，处理链引用的就是它们：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">query_foreign      </span><span class="w"> </span><span class="c"># 国外：缓存优先，然后 DoT/DoH</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">query_summary foreign, $cache_wan, jump has_resp_seq, $forward_foreign, jump has_resp_seq]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">query_isp          </span><span class="w"> </span><span class="c"># 国内：缓存优先，然后按运营商</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">query_summary isp, $cache_wan, jump has_resp_seq, env WH_TELECOM -&gt; $forward_wh-telecom, env WH_UNICOM -&gt; $forward_wh-unicom, jump has_resp_seq]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">query_clash        </span><span class="w"> </span><span class="c"># 转 mihomo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">query_summary clash, $forward_clash, jump has_resp_seq]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">query_lan          </span><span class="w"> </span><span class="c"># 本地，转路由器</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">query_summary lan, $forward_local, jump has_resp_seq]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">query_deepin       </span><span class="w"> </span><span class="c"># 公司</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">query_summary company, $forward_deepin, jump has_resp_seq]</span><span class="w">
</span></span></span></code></pre></div><p>三段处理链，顺序执行：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">pre_sequence</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">client_ip 100.64.0.0/10       </span><span class="w"> </span><span class="c"># Tailscale 来源的查询</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>-<span class="l">&gt; jump query_tailscale</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">qtype 65 / qname 含关键字      </span><span class="w"> </span><span class="c"># HTTPS 记录和关键字查询直接拒</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>-<span class="l">&gt; $reject_3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">qtype 12 / qtype 255 / .lan .local .arpa</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>-<span class="l">&gt; jump query_lan</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">_vlmcs._tcp.lan. SRV          </span><span class="w"> </span><span class="c"># 局域网 KMS 发现</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>-<span class="l">&gt; $kms_srv</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$hosts_home                   </span><span class="w"> </span><span class="c"># 内网域名直答</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">qname $domain_deepin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>-<span class="l">&gt; jump query_deepin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">main_sequence</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">qname $domain_direct 且非 $domain_proxy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>-<span class="l">&gt; jump query_isp             </span><span class="w"> </span><span class="c"># 直连名单 → 国内 ISP → 真实 IP</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">qname $domain_proxy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>-<span class="l">&gt; jump query_clash           </span><span class="w"> </span><span class="c"># 代理名单 → mihomo → fake-ip</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">fallback_sequence</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">$query_foreign                </span><span class="w"> </span><span class="c"># 兜底：先国外解析</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">结果 private -&gt; query_lan</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">结果 geoip cn -&gt; query_isp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">其他 -&gt; query_clash</span><span class="w">
</span></span></span></code></pre></div><p>监听端口，三种身份：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">udp_server_main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">udp_server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">entry: sequence, listen</span><span class="p">:</span><span class="w"> </span><span class="p">:</span><span class="m">53</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">tcp_server_main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">tcp_server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">entry: sequence, listen</span><span class="p">:</span><span class="w"> </span><span class="p">:</span><span class="m">53</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">udp_server_foreign</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">udp_server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">entry: query_foreign, listen</span><span class="p">:</span><span class="w"> </span><span class="p">:</span><span class="m">5353</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">tcp_server_foreign</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">tcp_server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">entry: query_foreign, listen</span><span class="p">:</span><span class="w"> </span><span class="p">:</span><span class="m">5353</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">udp_server_isp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">udp_server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">entry: query_isp, listen</span><span class="p">:</span><span class="w"> </span><span class="p">:</span><span class="m">5354</span><span class="w"> </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">tcp_server_isp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">tcp_server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span>{<span class="w"> </span><span class="nt">entry: query_isp, listen</span><span class="p">:</span><span class="w"> </span><span class="p">:</span><span class="m">5354</span><span class="w"> </span>}<span class="w">
</span></span></span></code></pre></div><p>53 是主入口，5353 国外通道，5354 国内通道。后两个端口双重身份：对内是 oxidns 自己的分流通道，对外是 mihomo 的解析上游。</p>
<h2 id="mihomo-怎么配合">mihomo 怎么配合</h2>
<p>mihomo 的完整配置里，和 oxidns 对接的只有 DNS 段：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">dns</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">listen</span><span class="p">:</span><span class="w"> </span><span class="m">0.0.0.0</span><span class="p">:</span><span class="m">7874</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">enhanced-mode</span><span class="p">:</span><span class="w"> </span><span class="l">fake-ip</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">fake-ip-range</span><span class="p">:</span><span class="w"> </span><span class="m">198.18.0.1</span><span class="l">/16</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">fake-ip-ttl</span><span class="p">:</span><span class="w"> </span><span class="m">300</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">nameserver</span><span class="p">:</span><span class="w">             </span><span class="c"># 回查 oxidns 国外通道拿真实 IP</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="m">127.0.0.1</span><span class="p">:</span><span class="m">5353</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">direct-nameserver</span><span class="p">:</span><span class="w">      </span><span class="c"># 回查 oxidns 国内通道拿真实 IP</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="m">127.0.0.1</span><span class="p">:</span><span class="m">5354</span><span class="w">
</span></span></span></code></pre></div><p>对应关系固定：nameserver 指 5353 国外通道，direct-nameserver 指 5354 国内通道，写反会导致代理侧域名被国内 DNS 解析。</p>
<p>fake-ip-filter 里放音乐、时间同步、微软、苹果和游戏这些必须拿真实 IP 的域名，避免 fake-ip 破坏服务：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">  </span><span class="nt">fake-ip-filter</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s1">&#39;*.lan&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s1">&#39;+.pool.ntp.org&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s1">&#39;time.*.com&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s1">&#39;*.msftconnecttest.com&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s1">&#39;mesu.apple.com&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s1">&#39;+.srv.nintendo.net&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s1">&#39;*.music.163.com&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="s1">&#39;y.qq.com&#39;</span><span class="w">
</span></span></span></code></pre></div><p>tun 和基础项：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">tun</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">stack</span><span class="p">:</span><span class="w"> </span><span class="l">system</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">mixed-port</span><span class="p">:</span><span class="w"> </span><span class="m">7893</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">allow-lan</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l">rule</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">external-controller</span><span class="p">:</span><span class="w"> </span><span class="m">192.168.18.5</span><span class="p">:</span><span class="m">9090</span><span class="w">
</span></span></span></code></pre></div><p>规则组织方式和一般 clash 配置没有区别：订阅 provider、应用规则组，GEOIP LAN/CN 直连和 MATCH 兜底，这里不展开。</p>
<h2 id="两者怎么接起来">两者怎么接起来</h2>
<p>oxidns 把国外域名查询转发给 mihomo 的 7874 端口。mihomo 收到后要先判断这个域名该走代理还是直连，用 nameserver（127.0.0.1:5353，oxidns 国外通道）或 direct-nameserver（127.0.0.1:5354，oxidns 国内通道）回查 oxidns 拿真实 IP，做 GEOIP 判断。判为代理的返回 fake-ip 给 oxidns，判为直连的返回真实 IP。fake-ip-filter 里的域名也是这一步拿真实 IP 返回。</p>
<p>设备访问 fake-ip，流量进 mihomo tun，反查回域名，用这次解析好的真实 IP 建连，走代理或直连。</p>
<p>这个环不会死锁，因为域名解析在整个链路里只发生一次。mihomo 回查 oxidns 拿真实 IP 之后，GEOIP 判断和后续建连全部基于 IP，不再需要域名解析，DNS 查询链到此终止。oxidns 的 5353/5354 通道直连 DoH/DoT 和国内 ISP 上游，也不会把查询再转回 mihomo。</p>
<h3 id="dns-请求时序">DNS 请求时序</h3>
<p>国外域名（google.com），以 fake-ip 结尾：</p>
<pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">sequenceDiagram
    participant D as LAN 设备
    participant G as 网关 18.1（ADG）
    participant O as oxidns 18.5
    participant M as mihomo 18.5
    participant U as 上游 DoT/DoH
    D-&gt;&gt;G: 查询 google.com
    G-&gt;&gt;O: 转发到 :53
    O-&gt;&gt;M: 命中 geolocation-!cn，转发 :7874
    M-&gt;&gt;O: 回查真实 IP（nameserver → :5353）
    O-&gt;&gt;U: DoT/DoH 查询（1.1.1.1 / 8.8.8.8）
    U--&gt;&gt;O: 真实 IP
    O--&gt;&gt;M: 真实 IP
    M--&gt;&gt;O: GEOIP 判定为代理，返回 fake-ip
    O--&gt;&gt;G: fake-ip 198.18.x.x
    G--&gt;&gt;D: fake-ip
    D-&gt;&gt;G: 访问 fake-ip
    G-&gt;&gt;M: 静态路由 198.18/16 → 18.5
    M-&gt;&gt;M: tun 反查域名，命中代理组
    M-&gt;&gt;M: 走机场节点出站
</code></pre><p>国内域名（baidu.com），全程不碰 clash：</p>
<pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">sequenceDiagram
    participant D as LAN 设备
    participant G as 网关 18.1（ADG）
    participant O as oxidns 18.5
    participant U as 国内 ISP DNS
    D-&gt;&gt;G: 查询 baidu.com
    G-&gt;&gt;O: 转发到 :53
    O-&gt;&gt;U: 命中直连名单，走 :5354 国内通道
    U--&gt;&gt;O: 真实 IP
    O--&gt;&gt;G: 真实 IP
    G--&gt;&gt;D: 真实 IP
    D-&gt;&gt;G: 直连目标
    G-&gt;&gt;G: NAT 出网（不经 clash）
</code></pre><h2 id="为什么必须住同一台机器">为什么必须住同一台机器</h2>
<p>oxidns 的国外上游是 8.8.8.8、1.1.1.1 这类 DoT/DoH，目标 IP 都在国外。这些连接从 oxidns 发出，被同网络栈里 mihomo 的 tun 接住，GEOIP 一查是国外 IP，走机场出去。DNS 查询本身翻墙了，防污染、防阻断，不用配任何额外路由。</p>
<p>这个设计带出一个硬约束：上游只能配 IP 型 DoT/DoH，不能配域名型的。dns.google 这种域名要先解析才能连，解析又要查 DNS，查询又回到自己手里，死锁。要么 hosts 里写死它的 IP，要么全用 IP 型。上面配置里全是 IP 型，dial_addr 显式写出目标地址。oxidns 单独部署的话这些裸 DoT 连接出不去，方案不成立。</p>
<h2 id="流量路径分三种">流量路径分三种</h2>
<p>真实 IP 直连。DNS 阶段判了直连，返回真实 IP。设备直接和目标建连，网关 NAT，全程不经过 clash。</p>
<p>fake-ip 走代理。拿到 fake-ip 后设备访问它，网关把 fake-ip 段路由到 mihomo，tun 接住，反查域名，规则命中代理组，从机场出站。</p>
<p>fake-ip 判直连。域名先拿了 fake-ip 进了 clash，但规则判了 DIRECT（Direct 规则集、GEOIP CN，或解析出的真实 IP 属于中国段），mihomo 自己向真实目标建连再原路回给设备。这类场景常见于挂了国内 CDN 的境外站点：域名不在 geosite cn，但 IP 归属在国内。域名名单判断不了 IP 归属，所以先发 fake-ip，把按 IP 裁决的权力留给 mihomo。域名层粗筛、IP 层精筛，这是这套方案的核心。</p>
<h3 id="三种连接流程">三种连接流程</h3>
<pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">flowchart TD
    A[&#34;设备访问某域名&#34;] --&gt; B[&#34;DNS 查询&lt;br/&gt;ADG → oxidns :53&#34;]
    B --&gt; C{&#34;oxidns 判定&#34;}
    C -- &#34;直连名单 / geosite cn&#34; --&gt; D[&#34;国内 ISP 解析 :5354&lt;br/&gt;返回真实 IP&#34;]
    D --&gt; E[&#34;设备直连目标&lt;br/&gt;网关 NAT 出网&lt;br/&gt;全程不经 clash&#34;]
    C -- &#34;geolocation-!cn&#34; --&gt; F[&#34;mihomo :7874&lt;br/&gt;返回 fake-ip&#34;]
    F --&gt; G[&#34;设备访问 fake-ip&lt;br/&gt;网关路由 198.18/16 → 18.5&#34;]
    G --&gt; H[&#34;mihomo tun 反查域名&lt;br/&gt;回查真实 IP 做 GEOIP&#34;]
    H --&gt; I{&#34;规则判定&#34;}
    I -- &#34;代理组&#34; --&gt; J[&#34;机场节点出站&#34;]
    I -- &#34;DIRECT / GEOIP CN&#34; --&gt; K[&#34;mihomo 代连真实目标&lt;br/&gt;网关 NAT 出网&#34;]
</code></pre><h2 id="复刻时最容易踩的坑">复刻时最容易踩的坑</h2>
<p>DoH 用域名型。写了 dns.google 这种上游，启动即死锁。全部用 IP 型，或者 hosts 写死。</p>
<p>fake-ip 段和内网段冲突。198.18.0.0/16 是文档保留段，拿来当 fake-ip 不会撞任何真实内网。别换成 10.x 或 172.16。</p>
<p>网关漏配路由。只配好 oxidns、静态路由没加，fake-ip 流量会烂在网关。先 dig @oxidns-ip 确认 DNS 通，再 curl 验证流量路径。</p>
<p>nameserver 和 direct-nameserver 写反。对应关系是 nameserver=5353 国外通道、direct-nameserver=5354 国内通道。</p>
<p>geosite 数据过期。靠 12 小时 cron 拉新，启动时拉不到会用旧文件。日志里看到下载失败先排查 oxidns 的出网。</p>
<p>oxidns 的 API 面板默认口令很弱，暴露公网前必须改。</p>
<h2 id="收尾">收尾</h2>
<p>整套方案两个配置文件，加上一套端口对应关系和一条静态路由。跑起来之后家里所有设备零配置，调整规则只动一处。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
