pandora0667/netlab
GitHub: pandora0667/netlab
一个基于 Express 和 React 的自托管网络工具箱,集成 DNS 查询、端口扫描、Ping、WHOIS 等多种诊断功能,支持实时进度显示和 API 调用。
Stars: 2 | Forks: 1
# Netlab
Netlab 是一个基于单个 Express 服务器构建的 TypeScript 全栈网络实用工具应用。
在开发环境中,服务器以中间件模式运行 Vite,并在同一进程中提供 React 客户端服务。
在生产环境中,服务器从 `dist/public` 提供已构建的客户端。
## 当前技术栈
- Frontend: React 18, Wouter, SWR, React Hook Form, Zod, Tailwind CSS, shadcn/ui
- Backend: Express, `ws`, SSE, Node DNS/socket APIs
- 工具链: Vite, TypeScript, tsx, esbuild, pnpm
## 已实现的工具
- IP 检查器
- 具有可选公共解析器和自定义解析器验证的 DNS 查询
- 具有请求级 WebSocket 更新的 DNS 传播检查器
- 子网计算器
- 具有 WebSocket 进度显示的 Ping 工具
- WHOIS 查询
- 具有 SSE 进度显示和 JSON/CSV 导出的端口扫描器
## 仓库结构
```
.
├── client/
│ ├── public/
│ └── src/
│ ├── components/
│ ├── domains/
│ └── lib/
├── server/
│ ├── common/
│ ├── config/
│ ├── data/
│ ├── lib/
│ ├── middleware/
│ ├── modules/
│ └── src/lib/
├── dist/
├── package.json
├── pnpm-lock.yaml
├── .nvmrc
├── tsconfig.json
└── vite.config.ts
```
## 前置条件
- Node.js 24.x LTS
- pnpm 10.x
以下示例使用 `pnpm`。
你可以使用 `.nvmrc` 固定本地 Node 运行时。
## 安装
```
pnpm install
```
对于本地开发,`.env` 文件是可选的。对于生产环境,请将 `.env.example` 复制到 `.env`,并根据你的部署调整运行时限制。
## 开发
```
pnpm run dev
```
Express 服务器在 `http://localhost:8080` 上启动。
## 测试
```
pnpm run test
pnpm run typecheck
```
当前的自动化测试涵盖验证工具,以及针对旧版 `/api/*` 端点和新版基于 envelope 的 `/api/v1/*` 端点的 HTTP 路由回归测试。浏览器流程尚未覆盖。
## 构建
```
pnpm run build
pnpm run start
```
## Docker
生产容器现在遵循与本地开发相同的运行时标准:
- `node:24-bookworm-slim`
- 通过 Corepack 安装的 `pnpm`
- 多阶段构建
- 最终镜像中仅包含生产环境依赖
构建并运行:
```
docker build -t netlab:latest .
docker run --rm -p 8080:8080 --env-file .env netlab:latest
```
## API 版本控制
- 旧版端点仍保留在 `/api/*` 下以保持兼容性。
- 新的后端工作应面向 `/api/v1/*`。
- 前端 HTTP 调用现在通过 `client/src/domains/*` 路由,并默认指向 `/api/v1/*`。
- `/api/v1/*` 响应使用统一的 envelope:
```
{
"success": true,
"data": {},
"error": null,
"requestId": "req_..."
}
```
```
{
"success": false,
"data": null,
"error": {
"code": "SOME_ERROR_CODE",
"message": "Human-readable message"
},
"requestId": "req_..."
}
```
当前的 v1 模块:
- `/api/v1/network`
- `/api/v1/dns`
- `/api/v1/dns-propagation`
- `/api/v1/port-scans`
传输层例外:
- WebSocket 端点仍为 `/ws/ping` 和 `/ws/dns-propagation`
- 端口扫描进度流使用 `/api/v1/port-scans/stream`
## 运行时说明
- DNS 传播使用 WebSocket 流式传输结果、进度和完成事件。
- Ping 使用 WebSocket,并在执行前在服务器端验证输入。
- 端口扫描目前使用 Server-Sent Events,而非 worker threads。
- 应用在 `logs/` 下写入结构化日志。
- 每个 HTTP 响应都包含一个 `X-Request-Id` 标头。相同的请求 ID 会被写入应用日志以便追溯。
- 与滥用相关的事件,如触发速率限制和被阻止的非公共目标,会写入 `logs/abuse.log`。
- DNS 传播服务器元数据在本地和容器运行时路径中均从 `server/data/dns-servers.csv` 加载。
## 生产环境说明
### 反向代理
`trust proxy` 可通过 `TRUST_PROXY` 配置。
- `TRUST_PROXY=1`
当 Express 位于单个受信任的反向代理(如 Nginx 或平台 ingress)之后时使用此设置。
- `TRUST_PROXY=true`
信任所有代理。这很方便,但应仅在上游标头受到严格控制时使用。
- `TRUST_PROXY=loopback,linklocal,uniquelocal`
当你需要更精细的控制时,使用与 Express 兼容的代理信任列表。
如果此设置错误,`req.ip`、速率限制和滥用日志可能会使用错误的客户端 IP。
### 请求追踪
- 如果 `X-Request-Id` 符合格式要求,服务器将接受该标头,否则服务器会生成一个新 ID。
- 生成的请求 ID 会在响应标头中返回,并包含在结构化日志中。
- `healthz` 和 `readyz` 也会返回活动的请求 ID,以便快速诊断。
### 出站安全策略
- `ping`、自定义 DNS 服务器验证和端口扫描仅允许公共目标。
- 私有、环回、链路本地、多播和保留地址范围将被阻止。
- 主机名会先进行解析,如果任何解析出的地址是非公共的,则会被拒绝。
### 运行时限制
默认值旨在适用于公共工具,但仍然是有界的。
- 全局 API 限制:每个 IP 每 `15` 分钟 `300` 次请求
- Ping:每 `15` 分钟 `90` 次请求,全局 `20` 个并发,每个 IP `2` 个并发
- DNS 查询和验证:每个 IP 每 `15` 分钟 `60` 次请求
- DNS 传播:每 `15` 分钟 `30` 次请求,全局 `8` 个并发,每个 IP `2` 个并发
- 端口扫描:每 `15` 分钟 `20` 次请求,每次请求最多 `256` 个端口,最大超时 `2000ms`,全局 `4` 个并发,每个 IP `1` 个并发
所有这些值都可以通过 `.env.example` 中的环境变量进行配置。
### 依赖项卫生
- `pnpm run audit:deps`
审计已安装的包是否存在已知漏洞
- `pnpm run deps:outdated`
在升级工作之前检查依赖项版本滞后情况
### 运维日志
- `logs/info.log`
正常的生产活动
- `logs/error.log`
应用程序错误
- `logs/debug.log`
仅用于开发的详细日志
- `logs/abuse.log`
速率限制触发、被阻止的公共目标违规以及其他与滥用相关的事件
## 已知的维护优先级
- 将大型前端包拆分为路由级块
- 继续移除遗留的重复文件和死代码
- 扩展服务端和集成测试覆盖率
- 为你的实际反向代理和托管设置添加特定部署文档
标签:CDN识别, DNS传播检查, DNS枚举, DNS查询, DNS解析, DNS解析器, Docker 部署, Express, GNU通用公共许可证, IP查询, MITM代理, Node.js, Ping工具, React, shadcn/ui, SSE, SSL检查, Syscalls, Tailwind CSS, Traceroute, TypeScript, Vite, WebSocket, WHOIS查询, 依赖分析, 协议探测, 单页应用, 子网计算器, 安全插件, 开源项目, 情报分析, 数据统计, 端口扫描, 系统分析, 网络分析, 网络安全工具, 网络工具, 网络诊断, 网络运维, 自动化攻击, 请求拦截, 通信测试