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
2026-04-12 18:36:45 +08:00

Lemon IPW

ipw.cn 替代品,提供 IP 查询、网站检测、SSL 检查、DNS 解析、TCPing 测速、Whois、DNSSEC、ASN 查询、网站截图等功能。

预览站点 · 文档

快速开始

curl -fsSL https://raw.githubusercontent.com/nomdn/ipw-cn/main/install.sh -o install.sh && sudo bash install.sh

完整部署(后端节点 / 独立中间件 / 前端)与配置说明见 文档:

贡献节点

把一台闲置的 Linux 机器(VPS、软路由、小主机)贡献为公共拨测节点:

curl -fsSL https://raw.githubusercontent.com/nomdn/ipw-cn/main/contribute.sh -o contribute.sh && sudo bash contribute.sh

脚本静默完成全部步骤,中途无需任何交互:

  • 自动挑选一个空闲高位端口(20000-65000),节点标识(节点 id / 注册 key / access-token)随机生成
  • 默认以 WS 方式同时接入官方两个中间件(多活,节点主动出站连接,无需公网放行端口)
  • 安装到 /opt/lemon-ipw,注册为 systemd 服务 lemon-ipw 并设置开机自启
  • 结束时打印节点信息(同时备份在 /opt/lemon-ipw/node-info.txt)

把打印出来的信息发给管理员登记,节点即可上线(联系方式见文末)。

选项 说明
--ipdb 启用 IP 数据库(首次启动后台下载约 450MB,默认关闭)
--port <n> 指定监听端口(默认随机空闲端口)
--ws-url <url> 改为接入自建中间件,逗号分隔可填多个(默认官方两个)
--version <tag> 指定版本(默认取 GitHub 最新 release)
--gh-proxy <p> GitHub 下载加速前缀,如 https://ghfast.top/
--dry-run 只检查环境并打印信息,不下载、不写 systemd

日常运维:

systemctl status lemon-ipw     # 查看状态
journalctl -u lemon-ipw -f     # 跟踪日志

项目结构

ipw-cn/
├── src/               # Go 后端
├── middleware-go/     # 独立组件 转发中间件(Fiber v3,多节点候选)
├── serverless/        # 独立组件 边缘/Serverless(edgeone、edgeone-getip、lemon-getip)
├── frontend-ssr/      # Nuxt 4 SSR 前端
├── docs/              # 文档站
├── install.sh         # 一键安装脚本(自建完整部署)
└── contribute.sh      # 贡献节点脚本(一台闲置机器接为公共节点)

友情链接

来自社区的IPW版本

ZAKOFLARE/ipw-cn-php 一个基于PHP的IPW节点
ZAKOFLARE/ipw-cn-rust 一个生锈的IPW节点[开发成本过高,已存档]
KFCV50TK/ipw-cn 一个有许多扩展功能的IPW分支

技术栈

组件 技术
后端(自托管) Go + Gin + Resty
独立中间件 Go + Fiber v3(WS 通道:coder/websocket)
边缘后端(EdgeOne) Go 边缘函数
SSR 前端 Nuxt 4 + Vue 3 + Element Plus
DNS 查询 miekg/dns(DoH / UDP 双通道 + 主从 failover)
部署 Docker、Cloudflare Workers、EdgeOne Pages、systemd

联系方式

许可证

GPL-3.0

S
Description
ipw.cn替代品,用于ipw.cn宕机等情况
https://nipw.cn
Readme GPL-3.0
15 MiB
0 Stars 1 Watchers 0 Forks
Languages
Go 55.5%
Vue 26.1%
TypeScript 12%
Shell 4.1%
CSS 1.7%
Other 0.6%