dsh-web-fetch-fakeip:在 fake-ip 代理環境下恢復 DSH 的 web_fetch

前言

DeepSeek Harness(DSH)裏,智能體通過 web_fetch 拉取網頁內容。內核自帶的 @deepseek-ai/dsh-web-fetch-http 會在發起請求前檢查解析結果:只要主機名對應到非公網單播地址,就直接拒絕,錯誤碼爲 WEB_BLOCKED_URL。

本機若使用 Clash、sing-box、Surge 等工具的 fake-ip DNS,域名往往被映射到保留段(常見默認 198.18.0.0/15)。此時連 github.com 也會被判爲非公網 IP,例如:

URL hostname "github.com" resolves to a non-public IP address   (WEB_BLOCKED_URL)

代理本身能上網,但 DSH 側的 web_fetch 會全部失敗。下面介紹社區插件 dsh-web-fetch-fakeip(維護者 vaspike,分類:聯網工具),它註冊替代的 fetch provider,在可配置的 CIDR 白名單內接受 fake-ip 地址,其餘規則仍與內置 provider 一致。

這是什麼

dsh-web-fetch-fakeip 是一個 DSH bundle 插件:在 profile 中插入 web-fetch-fakeip 配置,並把 @deepseek-ai/dsh-web 的 fetchProvider 固定爲 http-fakeip。檢索契約與內置 HTTP fetch 相同,僅改變「哪些解析地址算合法」——allowCidrs 內的地址可接受,其它地址仍須爲公網單播;環回、RFC 1918、鏈路本地、CGNAT 等保留段繼續攔截。

  • 目錄頁:https://www.skillhub.cn/plugins/vaspike/dsh-web-fetch-fakeip
  • 源碼與說明:https://github.com/vaspike/dsh-web-fetch-fakeip
  • 許可證:MIT(見倉庫 package.json)

社區插件目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係;安裝前請自行審閱源碼與許可證。插件隨當前 DSH 進程權限運行。

核心功能

  1. http-fakeip provider
    與 @deepseek-ai/dsh-web-fetch-http 相同的抓取約束下,允許解析結果落在 allowCidrs(如 198.18.0.0/15)內的請求通過地址校驗。

  2. bundle 自動打補丁
    package.json 聲明 dsh.bundle.patch,選中 bundle 後對 profile 應用 cordis.patch.yml:插入 web-fetch-fakeip 行,並設置 fetchProvider: http-fakeip。因補償性 override 會替換完整的 web 配置,補丁會重複寫入內置的 searchProvider;若你在別處自定義了 searchProvider 或 fetchProvider,需在應生效的層(例如用戶層 cordis.patch.yml,其晚於 bundle 應用)保留兩個鍵。

  3. 可配置限額
    支持 maxResponseBytes、maxBodyChars、timeoutMs、maxRedirects 等,與 README 示例一致。

  4. 無依賴的分類器
    倉庫提供 test/classify.test.js,覆蓋 CIDR 解析、匹配及公網/保留地址判定(含 ::ffff: 映射地址)。

安裝與啓用

在目標 profile 下從 GitHub URL 安裝(命令來自官方 README):

dsh plugin --profile <your-profile> add https://github.com/vaspike/dsh-web-fetch-fakeip

若已有本地目錄,也可讓 plugin_manager 指向該路徑:

plugin_manager action=install_bundle target=/path/to/dsh-web-fetch-fakeip

安裝後 bundle 會應用補丁並 pin @deepseek-ai/dsh-web 使用 http-fakeip。

配置

在插件條目 web-fetch-fakeip 下配置 provider(示例來自 README):

- id: web-fetch-fakeip
  name: 'dsh-web-fetch-fakeip'
  config:
    allowCidrs:
      - 198.18.0.0/15   # Clash / sing-box / Surge fake-ip default
    maxResponseBytes: 5000000
    maxBodyChars: 100000
    timeoutMs: 30000
    maxRedirects: 5

allowCidrs 默認爲 [],此時行爲與內置 provider 相同。CIDR 在激活時解析,拼寫錯誤會直接報錯。

驗證

在插件源碼目錄運行單元測試:

node --test test/classify.test.js

適用場景與限制

適合: 本機 DNS 走 fake-ip(198.18.0.0/15 或你自定義的映射段),且需要在 DSH 里正常使用 web_fetch 的開發者。

需注意:

  • 先校驗再抓取,無 DNS 固定。 校驗通過後實際請求仍走全局 fetch 並可能再次解析;不存在 DNS pinning,理論上存在 rebinding 通過校驗後連到別處的風險。內置 provider 會 pin 連接;本插件爲在 profile 安裝的 bundle 內保持無額外 import,放棄了 pinning。
  • 與內置相同的響應契約: 僅同源重定向;僅 text/* 與 JSON/XML;字符集取自 Content-Type。
  • 錯誤類型: 運行時 WebError 類無法從 profile bundle 導入,錯誤仍帶 name = 'WebError' 與 WEB_* 碼,但 instanceof WebError 不成立;Harness 對外以錯誤碼爲準。
  • 長期維護: 若未來內核在 dsh-web-fetch-http 中提供 ssrfAllowCidrs,可移除本 bundle 改用內核能力。

結尾

dsh-web-fetch-fakeip 針對 fake-ip 代理與 DSH 默認 SSRF 校驗之間的衝突,用可配置的 allowCidrs 恢復 web_fetch,同時保留對非公網保留段的攔截。需要時可從社區目錄或 GitHub 安裝並覈對配置。

  • 目錄:https://www.skillhub.cn/plugins/vaspike/dsh-web-fetch-fakeip
  • GitHub:https://github.com/vaspike/dsh-web-fetch-fakeip
羽毛球分组比赛记分
小程序二维码

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

小夜