DNS 问题 · 故障排查

fake-ip 兼容问题怎么排查与修复

作者:机场a 编辑部 更新: 阅读约 3 分钟

开启 fake-ip 后个别设备或应用异常,即常说的 fake-ip 兼容问题,最常见的原因是本该返回真实地址的域名(局域网、内网、时间服务器、联机打洞服务等)也被分配了 198.18.x.x 的假 IP。最快的办法是把这些域名加入 fake-ip-filter,再清除 DNS 缓存。fake-ip 与 redir-host 两种模式的原理对比见《Fake-IP 与 Redir-Host 的区别》,本文只讲具体故障。

问题表现

现象 典型场景
局域网设备用域名访问失败,用 IP 访问正常 nas.lan、router.local、printer.home.arpa
公司内网系统打不开或跳到错误页面 只有内网 DNS 能解析的域名,如 oa.corp.example.com
游戏联机失败、NAT 类型变差、语音连不上 依赖 STUN 打洞或 P2P 的游戏与通话软件
系统时间同步失败或时间不准 time.windows.com、time.apple.com、pool.ntp.org
酒店、机场、校园 Wi-Fi 的登录页不弹出 系统联网检测域名被代理接管
关闭客户端后部分网站暂时打不开 系统或应用缓存了假 IP(处理方法见《DNS 问题排查》)

可能原因

  1. 内网域名被发往公网 DNS:fake-ip 模式下客户端先返回假 IP,真正解析交给配置里的 nameserver;公网 DNS 不认识 .lan 或公司内网域名,连接自然失败;
  2. 需要真实 IP 的协议拿到假地址:STUN、P2P 联机要把自己看到的地址告诉对方,假 IP 会让协商失败;
  3. UDP 流量走了不支持 UDP 的节点:NTP 使用 UDP 123 端口,假 IP 让这类请求进入客户端并按规则代理,如果节点或规则不支持 UDP,就会超时;
  4. 联网检测被代理:系统靠访问 captive.apple.com、connectivitycheck.gstatic.com、www.msftconnecttest.com 等地址判断是否需要网页登录,被代理后检测“成功”,登录页就不会弹出。

排查方法

  1. 确认拿到的是假 IP:

    nslookup nas.lan
    ping time.apple.com

    如果返回 198.18. 开头的地址,说明该域名走了 fake-ip。

  2. 对比真实解析:用内网或运营商 DNS 直接查询,例如 nslookup oa.corp.example.com 192.168.1.1(改成你路由器或公司 DNS 的地址),能查到说明域名本身没问题。

  3. 查看客户端连接与日志:在 Clash Verge Rev 等客户端的「连接」页找到该域名,确认它匹配了哪条规则、走了哪个出站。

  4. 临时关闭 TUN 或客户端复测:恢复正常即可确认是 fake-ip 或分流导致。

解决步骤

1. 在 mihomo(Clash Meta)中添加 fake-ip-filter

fake-ip-filter 中的域名会返回真实 IP。* 只匹配一级子域名,+ 匹配该域名本身及所有子域名:

dns:
  enable: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - '*.lan'
    - '+.local'
    - '+.home.arpa'
    - '+.corp.example.com'   # 换成你公司的内网域名
    - 'time.*.com'
    - '+.pool.ntp.org'
    - '+.stun.*.*'
    - '+.stun.*.*.*'
    - 'captive.apple.com'
    - 'connectivitycheck.gstatic.com'
    - '+.msftconnecttest.com'
    - '+.msftncsi.com'

内网域名还需要能被正确解析,可以用 nameserver-policy 指定内网 DNS:

dns:
  nameserver-policy:
    '+.corp.example.com': '10.0.0.53'   # 换成公司 DNS 地址

同时在路由规则中让局域网地址直连,例如 IP-CIDR,192.168.0.0/16,DIRECT,no-resolve。很多订阅自带的配置已经包含这些规则,修改前先确认,避免重复。在图形客户端中,这些设置通常位于「DNS 覆写」或「覆写配置」中,详见《Clash Verge Rev 教程》。

2. sing-box 的处理思路

sing-box 没有同名字段,做法是在 DNS 规则里把这些域名交给非 fakeip 的 DNS 服务器,并把这条规则放在 fakeip 规则之前。例如(local 为你配置的本地 DNS 服务器 tag):

{
  "dns": {
    "rules": [
      { "domain_suffix": [".lan", ".local", ".home.arpa"], "server": "local" },
      { "domain_suffix": ["pool.ntp.org", "time.apple.com", "time.windows.com"], "server": "local" }
    ]
  }
}

具体写法随版本变化,请对照《sing-box 教程》和官方文档。

3. 清缓存并重连

修改后重载配置,再清除系统 DNS 缓存,并重启受影响的应用或游戏。

Windows(cmd,以管理员身份运行):

ipconfig /flushdns

Windows(PowerShell):

Clear-DnsClientCache

macOS:

sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

Linux(使用 systemd-resolved 的发行版):

sudo resolvectl flush-caches

4. 酒店 Wi-Fi 登录页

最稳妥的做法是先关闭客户端或 TUN,完成网页登录后再开启代理。

验证结果

  • nslookup nas.lan 等返回真实内网地址,而不是 198.18.x.x;
  • 内网系统、NAS、打印机可以正常用域名访问;
  • 系统时间可以手动同步成功;
  • 游戏或通话软件显示的 NAT 类型恢复,联机正常。

其他方案

  • 改用白名单或规则模式:mihomo 的 fake-ip-filter-mode 可选 blacklist(默认)、whitelist 和 rule。白名单模式下只有匹配的域名才返回假 IP,兼容性更好,但需要自己维护列表;
  • 切换为 redir-host:如果需要排除的域名太多,可以直接换模式,代价见《Fake-IP 与 Redir-Host 的区别》;
  • 不使用 TUN:只设置系统代理时,系统 DNS 不经过客户端,fake-ip 带来的问题会少很多,但可能出现 DNS 泄露(检测方法见《DNS 泄露检测与防护》),参见《TUN 模式教程》和《DNS 设置教程》。

常见问题

只有某一个游戏联机不正常,怎么找要排除的域名?

打开客户端的「连接」或日志页面,启动游戏并尝试联机,记录出现的域名,尤其是带 stun、p2p、relay 字样的,把它们加入 fake-ip-filter 后重启游戏复测。

加了 fake-ip-filter 为什么还是返回 198.18?

常见原因有三个:配置没有重载、写法不匹配(* 只匹配一级子域名,需要时改用 +.),或者系统和应用还缓存着旧结果。重载配置、清除缓存并重启应用即可。

订阅更新后我加的 fake-ip-filter 不见了?

订阅更新会覆盖原配置文件。建议把自定义内容写在客户端的「覆写」或「合并」功能里,而不是直接修改订阅文件。

手机上开了代理,NAS 的域名打不开怎么办?

原理相同。在 Clash Meta for Android 等客户端的 DNS 覆写中加入局域网域名,或直接用 NAS 的内网 IP 访问。

相关阅读

按 ⌘K / Ctrl+K 打开搜索