Files
nomdn 8b094bcb36 feat(node): 拨测支持请求级 DNS 与强制解析,前后端与中间件全链路透传
背景:排查解析差异(污染、区域 DNS、预发布域名)时需要「临时换解析服务器」或
「把某域名指到指定 IP」再拨测,此前只能改节点全局配置或 hosts。

节点 src
- webtest 新增 ReqResolve:dns / dns4 / dns6 + resolve / resolve4 / resolve6 九参数,
  ParseReqResolve 统一解析;Servers(stack) 按「栈内覆盖 → dns 回落」取服务器,
  Override(host, wantV6) 取强制解析目标(map 键经 canonicalHost 归一化)
- 解析层补 ResolveXRecordWith(domain, servers) 与 ResolveByType,ctx 传参走
  WithDNSServers / DNSServersFromContext
- 拨号:initHTTPClients 的 DialContext 从 ctx 取参数——命中 Override 时改写 addr,
  IP 直连、域名当作新 host 再解析一跳;未命中则用请求级服务器解析
- tcping:ResolveHostWith 同样支持 Override 与自定义 DNS;字面 IP 也做私网拦截
- SSRF:解析器改为可注入(ssrf.SetResolveFunc + webtest.InstallSSRFResolver),
  预检与实际拨号同源,新增 src/webtest/ssrfresolver.go
- 缓存:ReqResolve.CacheKey() 把参数按固定字段顺序拼进键,替代「有参数即跳过共享
  缓存」;零值返回空串,旧缓存键逐字节不变,升级不失效
- ws:wsProbe 接收 query,与 HTTP 侧同口径

middleware
- middleware-go:query 透传从 tcping/speed 分支提升到所有分支(detail/ssl/dns/whois
  也带 dns 系参数),WS 侧以 map 传给 RequestProbe
- frontend-ssr 内置中间件路由([...slug].get.ts)同步透传 query

frontend-ssr
- 新增 AdvancedOptions 组件:dns 通用 + 按栈 dns4/dns6、resolve 三档;单栈页只渲染
  本栈一列,dns/whois 页隐藏 resolve
- 8 个工具页接线;utils/tools.ts 新增 withQuery(空对象原样返回,不填参数时 URL 不变)
- dev 下注入本地调试节点并排在首位,中间件指向 127.0.0.1:8091

docs
- node-api 补 resolve 参数表、IP / 域名两种目标的语义、缓存键片段与 TTL 修正

验证:本地链路(前端 3010 → 中间件 8091 → 节点 18081)tcping/ssl/detail 带
dns= / resolve= 实测生效;SSRF 开启时私网目标被拦、关闭时放行。
2026-10-17 21:01:38 +08:00
..