解析
规则要先看见名字,或看见地址。两套 DNS 会给出两套答案。
域名条件吃主机名。IP / GEOIP 条件吃目的地址。名字从哪来、地址由谁解析,决定这一条连接打在名单的哪一段。解析没有异常时,不必同时改系统 DNS 和应用内 DNS。
01
系统一份,应用内可以再有一份
设备本身已有系统 DNS(运营商、路由器、或你在系统设置里写的服务器)。Shadowrocket 还可以在配置里指定自己的 DNS,包括加密查询。两套同时存在时,某一次查询走哪一套,以当前配置为准,不是「两个结果取平均」。
系统 DNS 与应用内 DNS 指向不同的递归、且对同一名字给出不同地址时,规则里的 GEOIP 会跟着变:同一主机名,一次命中 CN,一次落到 FINAL。这不是规则文件被改了,是目的地址换了。
对照时一次只改一处。先让 Direct 下的系统解析能工作(门户页、本机访问),再打开隧道。应用内 DNS 填错、填成不可达的地址,表现为所有依赖解析的请求失败,开关却可以是亮的。用 读数 看有没有字节,比反复换记录快。
02
有的请求带名字,有的只剩地址
浏览器通常既有主机名(Host / SNI)又有解析出的地址,域名行和地址行都有机会命中——仍然是自上而下先中的那一行。
应用若直接连接 IP、或不带 SNI,域名行全部落空,只能打在 IP-CIDR、GEOIP 或 FINAL 上。于是「同一个站点,Safari 走代理、某客户端走直连」:两个程序送给引擎的信息不一样。见规则页「主机名从哪来」。
SNI 写的是 example.com,实际连的是 CDN 的另一个地址:域名行按 example.com 匹配,GEOIP 按 CDN 地址归类。若域名行写在 GEOIP 前面并已命中,GEOIP 根本不会被问到;若域名行没命中,你看到的就是 CDN 所在库,不是你对这个名字的印象。
03
只写了 IPv4 网段时,IPv6 目的地址看不见这行
IP-CIDR,10.0.0.0/8,DIRECT 不管 IPv6。设备若用 fd00:: 或全球 IPv6 去访问同一台服务,这一行不命中,请求继续往下掉,直到 GEOIP 或 FINAL。Wi-Fi 给了 IPv6、蜂窝没给,同一规则会在两种网络下表现不同。
需要管两种地址族时,补 IP-CIDR6,或在设置里关掉不使用的那一种。不要用「再加一条相同的域名 DIRECT」去修地址族问题——域名行在「只有地址、没有名字」的请求上帮不上忙。
04
本地映射:规则可能看见一张不是公网的地址
部分配置会把域名先解析到一组本地或虚假地址,再在隧道里换成真实目的。这时 IP-CIDR / GEOIP 看到的是映射后的地址,不是网站在公网上的地址。GEOIP,CN 对这样的地址没有意义,结果会全部落到其它行。
若名单大量依赖 GEOIP,而解析策略改成了虚假地址,分流会整体偏移。改解析模式等于换了一套规则在吃的输入,不是小选项。改之前先用固定记录、Proxy 策略确认出口本身可用,见 读数。
本机 hosts 式的映射只影响被写出的那些名字。没写到的名字仍走当前 DNS。不要指望映射表代替规则文件。