Wolfi-OwO/network-visualizer

GitHub: Wolfi-OwO/network-visualizer

一款基于浏览器的企业网络可视化与模拟工具,支持拖拽式拓扑构建、实时数据包逐跳追踪及 Wireshark 风格的流量捕获分析。

Stars: 0 | Forks: 0

# NetViz — 网络可视化与模拟器 **在浏览器中设计、可视化并*模拟*真实的企业网络。** 通过拖拽构建拓扑,实时观察数据包逐跳传输,像 Wireshark 一样检查流量,并计算子网——所有功能集于一身。 [![Lint](https://static.pigsec.cn/wp-content/uploads/repos/cas/15/15e9e38379783188cff60c52dc1a4956f07be3c00c7a8bad969dd41a89434ae0.svg)](https://github.com/Wolfi-OwO/network-visualizer/actions/workflows/lint.yml) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/Wolfi-OwO/network-visualizer/actions/workflows/ci.yml) [![Release](https://static.pigsec.cn/wp-content/uploads/repos/cas/42/42ba98a60a0bb3b0ad908f024db145f9c5b831eb7df822f56ac578ee7d7215b3.svg)](https://github.com/Wolfi-OwO/network-visualizer/actions/workflows/release.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](./LICENSE) [![Coverage](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FWolfi-OwO%2Fnetwork-visualizer%2Fbadges%2Fcoverage.json)](https://github.com/Wolfi-OwO/network-visualizer/actions/workflows/ci.yml) ![TypeScript](https://img.shields.io/badge/TypeScript-3178c6?logo=typescript&logoColor=white) ![React](https://img.shields.io/badge/React-19-61dafb?logo=react&logoColor=black) ![Vite](https://img.shields.io/badge/Vite-646cff?logo=vite&logoColor=white) ![Node](https://img.shields.io/badge/Node-%E2%89%A520-339933?logo=node.js&logoColor=white) ![Express](https://img.shields.io/badge/Express-4-000000?logo=express&logoColor=white) ![MongoDB](https://img.shields.io/badge/MongoDB-Mongoose-47A248?logo=mongodb&logoColor=white) ![Docker](https://img.shields.io/badge/Docker-single_image-2496ED?logo=docker&logoColor=white)
![NetViz 仪表板](https://raw.githubusercontent.com/Wolfi-OwO/network-visualizer/main/docs/screenshots/pagedashboard.png) ## 功能 ### 网络构建器 ![网络构建器 — 带有逐跳数据包流的实时拓扑](https://raw.githubusercontent.com/Wolfi-OwO/network-visualizer/main/docs/screenshots/pagenetwork-builder.png) - **拖拽式画布**(由 React Flow 提供支持),包含跨多个类别的 25 种以上设备类型:路由器、L2/L3 交换机、防火墙、IDS/IPS、VPN 网关、负载均衡器、反向代理、API 网关、服务器(DNS、DHCP、邮件、文件、数据库、VM 宿主机)、NAS/存储、终端(PC、笔记本电脑、手机、打印机、IoT)以及 Internet/ISP/云。 - **简洁的线条图标集**(无 emoji),按角色进行颜色编码,并带有每个设备的**硬件/功能**(NIC、Wi-Fi 网卡、CPU/RAM 等)。 - **可从设备的任意一侧连接**;命名并配置链路(标签、带宽、延迟、连接状态)。 - **逐设备电源按钮** — 开启设备后,它会**自动广播 DHCP (DORA)** 并获取地址。关闭设备后,流量将正确地停止穿过它。 - **实时并发流量模拟** — 多个标记的数据包(DNS、HTTPS、SMTP、SQL、DHCP 等)并行且实时地进行动画演示。DNS 查找在服务器请求之前进行,就像现实生活中一样。 - **发送数据包追踪**:带有路由(最长前缀匹配)的逐跳路径、**防火墙 ACL**(入口/出口 + 隐式拒绝)、Internet 边缘的 **NAT**、**TTL**、**VLAN 隔离**和**子网分段**强制执行,以及明确的阻止原因。 - **可调整大小的检查器**、**撤销/重做**(`Ctrl+Z` / `Ctrl+Shift+Z`)以及**自动保存**到本地存储。 - **引导式构建教程**,逐步教授整个工作流程。 ### 数据包捕获(Wireshark 风格) ![数据包捕获 — 实时 SSE 流、协议过滤器、十六进制转储](https://raw.githubusercontent.com/Wolfi-OwO/network-visualizer/main/docs/screenshots/pagepacket-capture.png) - 通过 **Server-Sent Events** 的实时数据包流、协议树、十六进制转储和统计信息。 - 真实生成的 **16 种以上协议**(HTTP、TLS、DNS、mDNS、DHCP、ARP、ICMP、TCP、UDP、STP、NTP、LLDP、SNMP、OSPF、SSDP、SIP),带有**按协议开启/关闭的切换开关**。 ### CIDR 计算器 ![CIDR 计算器 — 子网计算、二进制视图和地址空间映射](https://raw.githubusercontent.com/Wolfi-OwO/network-visualizer/main/docs/screenshots/pagecidr-calculator.png) - 子网 / 网络 / 广播 / 主机计算、二进制视图、子网拆分器,以及带有严格输入验证的超网(路由汇总)。 ### 账户、角色与管理 - **使用 Google 或 Microsoft 登录**(带有 CSRF 保护状态的 OAuth 2.0),或用于本地使用的无密码**开发者登录**。会话是 `httpOnly` cookie 中签名的 JWT。 - **基于角色的访问控制** — `admin` / `editor` / `viewer`;第一个登录的账户成为管理员。每个用户独立、隔离的网络工作区。 - 用于用户和角色管理的**管理控制台**、变更操作的**审计日志**(TTL 过期)以及**系统指标**。 - 详情见 [organizational/](organizational/README.md)。 ## 技术栈 | 层级 | 技术 | | -------- | ----------------------------------------------------------------------------------------------------- | | 前端 | React 19, TypeScript, Vite, Tailwind CSS, React Flow (`@xyflow/react`), Recharts, lucide-react, axios | | 后端 | Node.js, Express, TypeScript, MongoDB + Mongoose, Server-Sent Events, terminus (健康检查) | | 认证 | OAuth 2.0 (Google / Microsoft), JWT 会话 cookies, 基于角色的访问控制, 速率限制 | | 工具链 | ESLint, `tsc`, Mocha + Supertest + c8, GitHub Actions, Docker | HTTP API 是 **RESTful (Richardson 成熟度模型 3 级)** 的:复数资源 URL(`/api/networks`、`/api/packets`、`/api/capture`、`/api/cidr`),正确的动词/状态码(`201 Created` + `Location`、`204 No Content`),以及每个表示上的 **HATEOAS** `_links`。`GET /api` 是超媒体入口点。认证端点位于 **`/auth`** 下(登录是一个浏览器重定向流程,而不是 API 资源)。存活/就绪探针暴露在 `/api/live` 和 `/api/ready`。查看完整的 [API 参考](docs/api.md)。 ## 项目结构 ``` routing-visualizer/ ├─ application/ # Express + TypeScript backend (REST + SSE) │ ├─ src/ │ │ ├─ routes/ # express.Router per resource: auth, users, networks, packets, capture, cidr, audit, metrics │ │ ├─ handlers/ # request handlers (controllers) per route │ │ ├─ services/ # business logic: packet-simulator, packet-sender, cidr, auth, metrics, versions, validation │ │ ├─ db/ # MongoDB: connection, models/, network-service (repository), seed │ │ ├─ middlewares/ # auth (sessions + roles), audit, rate-limit, request-logger, error-handler │ │ ├─ lib/ # logger, HTTP error classes, hateoas links, health-checks, jwt │ │ ├─ config/ # environment-driven configuration │ │ ├─ types/ # shared domain types (packet, network, cidr) │ │ └─ app.ts # express app assembly (CORS, body parsing, routes, SPA serving) │ ├─ server.ts # entrypoint (config validation, DB connect + seed, health checks) │ ├─ tests/ # Mocha + Supertest suite (in-memory MongoDB) │ ├─ Dockerfile · docker-compose.yml · .env.example · README.md │ │ │ └─ client/ # React + Vite frontend (kebab-case, explicit import extensions) │ ├─ src/ │ │ ├─ pages/ # one folder per page (dashboard/, network/, packets/, cidr/, admin/, auth/) │ │ ├─ components/ · layouts/ · hooks/ · context/ │ │ ├─ lib/api/ # axios API client (one module per backend resource) │ │ ├─ config/ · styles/ · types/ │ ├─ vite.config.ts # dev proxy /api and /auth → http://localhost:8080 │ └─ README.md ├─ docs/ # API reference, screenshots ├─ deploy/ # production deployment runbook (Azure Container Apps) ├─ organizational/ # roles, admin guide, access control, account lifecycle ├─ .github/workflows/ # lint.yml · ci.yml (build + test) · package.yml · deploy.yml · release.yml ├─ CONTRIBUTING.md · SECURITY.md · CHANGELOG.md · LICENSE └─ ReadMe.md ``` ## 快速开始 ### 前置条件 - **Node.js ≥ 20**(CI 使用 Node 22)和 **npm** - **MongoDB** — 使用 `docker run -p 27017:27017 mongo:7` 在本地运行一个(或者使用 `application/` 中捆绑的 `docker compose up mongo`)。使用 `MONGODB_CONNECTION_STRING` 覆盖连接(默认为 `mongodb://localhost:27017/netviz`)。后端在首次启动时会植入一个演示性的“企业网络”拓扑。 ### 在开发环境中运行 应用程序分为两部分 — 分别在各自的终端中运行。 **1) 后端**(REST API + 数据包流在 **:8080** 上,需要 MongoDB 正在运行) ``` cd application npm install npm run dev ``` **2) 前端**(Vite 开发服务器在 **:5173** 上,将 `/api` 和 `/auth` 代理到 `:8080`) ``` cd application/client npm install npm run dev ``` 然后打开 ****。 ### 使用 Docker Compose 运行全栈 ``` cd application cp .env.example .env # adjust secrets first docker compose up --build ``` 这会启动 MongoDB 和后端容器(同时提供已构建的 SPA),运行在 **** 上。`docker-compose.yml` 位于 `application/` 中,因此请从那里运行 Compose。 ## 脚本 **后端** (`application/`) | 脚本 | 描述 | | ------------------- | -------------------------------------------------- | | `npm run dev` | 启动并热重载 (nodemon + ts-node) | | `npm run build` | 编译 TypeScript → `dist/` | | `npm start` | 运行已编译的服务器 (`node dist/server.js`) | | `npm run lint` | 运行 ESLint | | `npm run typecheck` | 类型检查而不输出文件 | | `npm test` | Mocha + c8 (内存 MongoDB,行覆盖率 ≥90%) | | `npm run test-ci` | 相同,但带有用于 CI 的 cobertura + JUnit 报告 | **前端** (`application/client/`) | 脚本 | 描述 | | ------------------- | --------------------------------------------------- | | `npm run dev` | 带有 HMR 的 Vite 开发服务器 | | `npm run build` | 类型检查 (`tsc -b`) + 生产环境打包 → `dist/` | | `npm run preview` | 在本地预览生产环境打包 | | `npm run lint` | 运行 ESLint | | `npm run typecheck` | 类型检查而不输出文件 | ## 生产环境构建 ### 后端 ``` cd application npm install npm run build # → application/dist/ npm start # node dist/server.js (set PORT to override 8080) ``` ### 前端 ``` cd application/client npm install npm run build # → application/client/dist/ (static assets) npm run preview # optional local preview ``` 前端**没有自己的 Docker 镜像**。在 CI 中,它被构建并作为 `client-dist` 制品发布;然后后端 Docker 镜像将该打包文件内置(`COPY client/dist ./client/dist`),并以静态文件的形式(带有 SPA 回退)提供服务。要在本地构建后端镜像,请先构建前端,以便 `application/client/dist/` 存在于构建上下文中: ``` cd application/client && npm run build # produces client/dist cd .. && docker build -t netviz . ``` 或者使用任何静态主机(Caddy、CDN 等)提供 `application/client/dist/` 的服务,并将其指向后端。 如需完整的生产环境部署(Azure Container Apps、托管 MongoDB、自定义域名、发布时持续部署),请遵循 [部署手册](deploy/README.md)。 ## 测试与质量 当前的质量门禁(也在 CI 中强制执行): ``` # Frontend cd application/client npm run lint # ESLint npm run typecheck # tsc (no emit) npm run build # type-check + bundle # Backend cd application npm run lint # ESLint npm run typecheck # tsc (no emit) npm run build # compile npm test # Mocha + c8 — unit + integration, fails under 90% line coverage npm run test-ci # same, with cobertura + JUnit reports (for CI) ``` ## CI/CD — GitHub Actions 流水线被拆分为原子工作流,每个都可以独立运行: | 工作流 | 触发条件 | 作用 | | --- | --- | --- | | [`lint.yml`](.github/workflows/lint.yml) | push / PR | 针对服务器和客户端运行 ESLint | | [`ci.yml`](.github/workflows/ci.yml) | push / PR / release | 类型检查 + 构建 + 后端测试(内存 MongoDB,**≥90% 覆盖率门禁**);在 PR 上发布**覆盖率报告评论**,上传 `client-dist` 制品,并在 `main` 分支上发布实时覆盖率徽章。可复用 — 发布流水线将其作为测试阶段运行 | | [`pr-preview.yml`](.github/workflows/pr-preview.yml) | PR 提交到 `main` (打开/更新/关闭) | 构建 PR 镜像,并将其滚动部署到专用的 **`netviz-preview`** 应用程序的新版本上(带有 mongo 边车)— 它拥有自己的公共 URL 和一次性数据库 — 并评论链接。当 PR 关闭时停用它。可选择开启(仓库变量 `PREVIEW_ENABLED=true`);对于 Fork PR 会跳过 | | [`package.yml`](.github/workflows/package.yml) | release / PR preview / manual | 构建客户端 + Docker 镜像,并将其推送到 ACR | | [`deploy.yml`](.github/workflows/deploy.yml) | release(通过 `release.yml`)或手动 | 将生产环境应用滚动部署到指定的镜像标签(单版本 → 100% 流量)— 这也是您的回滚工具 | | [`release.yml`](.github/workflows/release.yml) | 发布 GitHub Release | 分阶段流水线:**测试 → 打包 → 部署生产环境(门禁控制)** — 见 [deploy/](deploy/README.md) | ### Pull-request 生命周期 `main` 受到保护:对其的更改只能通过审查通过的 PR 进行。预览在**独立的 `netviz-preview` 应用**及其专属数据库上运行,因此 PR 永远不会影响生产环境或在线用户。 ``` open PR ─▶ test + coverage comment ─▶ isolated preview (public URL comment) ─▶ review ─▶ merge ─▶ preview destroyed ``` - **测试 / 覆盖率** — `ci.yml` 和 `lint.yml` 会在每个 PR 上运行;这四项检查(`Server (build + test)`、`Client (build)`、`Server (ESLint)`、`Client (ESLint)`)是**必需的**,并且在合并前必须通过。`ci.yml` 还会将覆盖率报告作为置顶评论发布。 - **预览** — 一旦选择开启,`pr-preview.yml` 会在 `netviz-preview` 上创建一个带有自身 URL 的版本(`https://netviz-preview--pr-…azurecontainerapps.io`)并进行评论。该应用程序通过 `localhost` 与 mongo 边车通信(隔离的、短暂的数据);当 PR 被合并或关闭时,该版本会自动停用。 - **审查 + 合并** — 分支规则需要 **1 个批准的审查**并解决所有讨论;禁止直接推送到 `main`。管理员仍然可以合并自己的 PR(这样个人维护者就不会被锁定在外)。 ### Release → 生产环境 只有已发布的 release 才会部署到生产环境。一个镜像经过测试、构建,然后通过手动门禁进行提升: ``` Release v1.2.3 ─▶ test ─▶ package ─▶ [approval] ─▶ deploy: netviz (100% traffic) ``` 生产环境受到 `production` 环境的 **required-reviewers** 规则的控制,因此需要由维护者批准提升。`deploy.yml` 会创建 `netviz` 的新版本(单版本模式会将 100% 的流量路由到它)。所有任务都在 Node 22 上运行,使用 npm 缓存、最小权限令牌,并对被取代的运行进行并发取消。本 README 顶部的覆盖率徽章会读取 shields.io 端点的 JSON,该 JSON 由 CI 在每次 `main` 分支构建时推送到 `badges` 分支。 ## 配置 所有后端配置都是从 `application/src/config/index.ts` 中的环境变量中读取的(记录在 [`application/.env.example`](application/.env.example) 中);前端会读取 `application/client/src/config/index.ts` 中的 `VITE_*` 变量(参见 [`application/client/.env.example`](application/client/.env.example))。 | 变量 | 位置 | 默认值 | 用途 | | --------------------------------------------------- | -------- | ---------------------------------- | --------------------------------------------------- | | `HOST` / `PORT` | 后端 | `0.0.0.0` / `8080` | 绑定地址和端口 | | `NODE_ENV` | 后端 | `development` | 启用生产环境配置验证 | | `MONGODB_CONNECTION_STRING` | 后端 | `mongodb://localhost:27017/netviz` | MongoDB 连接字符串 | | `DB_RECREATE` | 后端 | `false` | 在启动时删除并重新植入数据库 | | `CORS_ORIGINS` | 后端 | `localhost` / `127.0.0.1` | 以逗号分隔的 CORS 允许列表 | | `JSON_BODY_LIMIT` | 后端 | `8mb` | 最大 JSON 请求体 | | `JWT_SECRET` / `JWT_TTL` | 后端 | — / `7d` | 会话签名密钥(生产环境中必需)和 TTL | | `ALLOW_DEV_LOGIN` | 后端 | 在生产环境外为 `true` | 无密码本地登录 | | `REQUIRE_AUTH` | 后端 | `false` | 禁用匿名共享工作区 | | `AUDIT_RETENTION_DAYS` | 后端 | `90` | 审计日志 TTL | | `GOOGLE_CLIENT_ID` / `GOOGLE_CLIENT_SECRET` | 后端 | — | 启用 Google 登录 | | `MICROSOFT_CLIENT_ID` / `..._SECRET` / `..._TENANT` | 后端 | — / — / `common` | 启用 Microsoft 登录 | | `VITE_APP_*` | 前端 | 参见 `.env.example` | 显示在页脚的应用元数据(OCI 样式字段) | ## 文档 | 文档 | 涵盖内容 | | ------------------------------------------------------------ | -------------------------------------------------------------------- | | [docs/api.md](docs/api.md) | 完整的 HTTP API 参考(`/api/*` 资源和 `/auth/*` 端点) | | [docs/use-cases/](docs/use-cases/README.md) | 用例图与描述(参与者、流程、UML)+ 需求 | | [application/README.md](application/README.md) | 后端包:布局、脚本、配置 | | [application/client/README.md](application/client/README.md) | 前端包:布局、脚本、开发代理 | | [deploy/README.md](deploy/README.md) | 生产环境部署(Azure Container Apps 操作手册、CD) | | [organizational/README.md](organizational/README.md) | 身份、角色与权限、管理员指南、账户生命周期 | | [SECURITY.md](SECURITY.md) | 安全模型以及如何报告漏洞 | | [CONTRIBUTING.md](CONTRIBUTING.md) | 开发工作流、质量门禁、PR 约定 | | [CHANGELOG.md](CHANGELOG.md) | 每个版本的重要变更 | ## 安全性 发现漏洞了吗?请遵循[安全策略](SECURITY.md) — 不要创建 公开的 issue。 ## 许可证 基于 **MIT License** 发布 — 见 [LICENSE](./LICENSE)。
标签:MITM代理, React, Syscalls, TypeScript, 子网计算, 安全插件, 流量捕获, 网络拓扑, 网络模拟, 自动化攻击, 请求拦截