dsh-real-ip:在 fake-ip 环境下为 DSH 解析真实公网地址

前言

DeepSeek Harness(DSH)桌面端的 web fetch 只接受公网单播地址。本机若开着 Clash 或 sing-box 的 fake-ip 模式,系统或代理 DNS 常把域名解析成 198.18.0.0/15 等保留段;ipaddr.js 2.5.0 不会把这些地址当作公网单播,请求往往在连上目标之前就被 WEB_BLOCKED_URL 拦掉。即便放宽校验,端口 53 被劫持时解析结果仍可能是 fake-ip,连接会钉在错误地址上。

下面介绍社区插件 dsh-real-ip(维护者 NingYuanLee,MIT 许可证)。它不修改 app.asar,在 Cordis 层包装 HTTP fetch 的地址解析,并在必要时用公网 DNS 换回真实公网 IP;同时补丁 Node 的 dns.lookup,让走系统解析的其他请求也能受益。插件归属 DeepSeek Harness 社区生态,目录站点与 DeepSeek / 幻方无官方从属关系。

这是什么

dsh-real-ip 的定位是:当 web fetch 或 Node DNS 解析拿到 Clash / sing-box 的 fake-ip 时,尽量钉住真实公网地址,而不是直接拒绝或连向 fake-ip。包名 dsh-real-ip,显示名 Real IP,当前版本 0.1.0;在 SkillHub 等社区目录中分类为「记忆」。旧包名 @liningyuan/dsh-web-fetch-fake-ip 已弃用。

问题背景

fake-ip 模式用 198.18.0.0/15(RFC 2544)等段应答主机名;sing-box 默认 IPv6 池含 fc00::/18,另有 2001:2::/48 等 benchmarking 段。DSH 的公网校验与这类答案冲突。混合解析结果里若保留 fake-ip,钉住的地址集合仍会出错。 literal IP 主机名(例如直接访问 http://198.18.x.x/)不会走例外逻辑,仍会被拦截。

核心功能

经过上面的背景,插件行为可概括为以下几点(均来自上游 README):

  1. 包装 HTTP fetch 的 resolveAddresses
    原解析器已接受的答案原样返回。若因 fake-ip 被拒且集合里存在公网单播地址,只返回公网地址,同集合中的 fake-ip 丢弃。

  2. 全部为已知 fake-ip 时的恢复
    依次向 223.5.5.5、119.29.29.29、8.8.8.8、1.1.1.1 发 UDP/53 查询;若无公网答案,再按 IP 字面量做 DNS over HTTPS(AliDNS、DNSPod、Cloudflare,避免解析 DoH 域名本身又回到 fake-ip)。

  3. 仍无法恢复公网地址
    保留已知 fake-ip 以便 TUN 映射仍可承载连接。私网、回环、链路本地、CGNAT 等非 fake 保留地址整组拒绝,不会发往公网 DNS。

  4. 全局 DNS 补丁
    对 Node dns.lookup 与 dns.promises.lookup 安装相同恢复逻辑,覆盖 global fetch、undici 等路径;已在加载时单独 import 的 lookup 引用不在补丁范围内,但 web fetch 包装仍覆盖该路径上的请求。配置了 HTTP 代理时,requestVia 原有跳过逻辑不变。

  5. 无配置项
    已知 fake-ip 池包括 IPv4 198.18.0.0/15、sing-box 默认 IPv6 fc00::/18、RFC 5180 2001:2::/48 及 IPv4-mapped 形式;fd00::/8 不视为 fake-ip。

恢复过程可能增加约 1 秒 UDP 等待;UDP 不可用时会再对每个 DoH 端点增加约 2.5 秒。公网解析器仅看到主机名,看不到 URL 路径、头或凭证。

安装与启用

先做安装,再重启 DSH;运行中的进程不会热加载该插件。

推荐从 registry 安装到 web profile:

dsh plugin --profile web add dsh-real-ip

包声明了 dsh.bundle.patch,dsh plugin add 会把 bundle 写入 profile。也可从 GitHub 或本地目录安装:

dsh plugin --profile web add github:NingYuanLee/dsh-real-ip
dsh plugin --profile web add ./dsh-real-ip

兼容性(上游表格):dsh >=0.2.1-rc.2 <0.3.0-0,Node >=22.19.0;在 dsh 0.2.1-rc.3、Windows x64 桌面宿主上验证。依赖 ipaddr.js 2.5.0,peer 为 @deepseek-ai/cordis ~4.0.4 与 @deepseek-ai/dsh-tools >=0.2.1-0 <0.3.0。

卸载并恢复默认公网校验:

dsh plugin --profile web remove dsh-real-ip

卸载后同样需要重启 DSH;插件不写入缓存或凭证文件。

典型用法

插件没有 YAML 或环境变量配置项,安装并重启后即可生效。典型场景是:本机 TUN / fake-ip 代理下,让 DSH 的 web fetch、模型请求等需要公网地址的出站解析不再因 198.18.x.x 一类答案失败。若你使用自定义 fake-ip 段且被 ipaddr.js 判为公网单播,插件无法与真地址区分,不会改写;落在私网范围内的自定义池仍会被整体拒绝,也不会触发公网查询。

适用场景与注意

适合在 Clash / sing-box fake-ip 与 DSH 同机共存、且希望保留 DSH 公网安全策略(私网与 literal 仍 blocked)的开发者。插件以当前 DSH 进程权限运行,会向列出的公网解析器查询你访问的主机名;安装前应阅读 SECURITY.md 与源码,确认符合你的合规要求。

限制摘要:仅包装 http fetch provider;自定义 fake-ip 若像公网或落在私网,行为见上文;NAT64 解析失败原样抛出。

链接

在 fake-ip 与 DSH 公网校验冲突的场景里,dsh-real-ip 用解析层包装和公网 DNS 回退,把「能连上真实站点」和「继续拒绝私网与 literal」放在同一条路径上处理;需要时按 profile 安装、重启即可,无需额外配置。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜