michael-borck/netsim

GitHub: michael-borck/netsim

一款纯浏览器运行、零安装的网络教学模拟器,支持真实 Linux 语法、引导式实验和实时数据包动画。

Stars: 0 | Forks: 0

# NetSim **一款完全在浏览器中运行的网络模拟器 —— 真实的 Linux 语法,拖拽式 拓扑,零安装,无需后端。** ### ▶ 在线体验: 在画布上使用主机、交换机和路由器构建网络;在任何设备上打开终端, 并使用真实的 `iproute2` 命令(`ip addr`、`ip route`、`ping`、`traceroute`)进行配置; 观察 ARP 和 ICMP 数据包在连线上动态传输。首先将其作为教学工具构建,并将网络 设计和防火墙配置测试作为首要目标。 ![NetSim 运行“强化脆弱网络”实验](https://static.pigsec.cn/wp-content/uploads/repos/cas/11/11ea65b0361401981b313441a3964b571178c34478027136d201027027b87900.jpg) ## 文档 - **[用户指南](docs/USER_GUIDE.md)** — 界面、工作流以及已模拟和未模拟的内容 - **[实验与示例目录](docs/LABS.md)** — 五个内置实验和两个示例网络 - **[实验编写指南](docs/LAB_AUTHORING.md)** — 编写和评估你自己的实验(面向教育工作者) - **[设计文档](docs/DESIGN.md)** · **[架构决策](docs/adr/)** · **[贡献](CONTRIBUTING.md)** ## 灵感来源 NetSim 是 **iNetwork Simulator** 的现代、开源继任者。后者是一款基于 GUI 的教学工具, 于 21 世纪初在悉尼科技大学(University of Technology Sydney)开发(C#/.NET,仅限 Windows)。其 防火墙组件描述于: iNetwork 允许学生将工作站、交换机、路由器和服务器拖放到画布上,通过 对话框进行配置,并从模拟的 DOS 提示符测试连通性 —— 同时提供从 IP 寻址到 DHCP、DNS、路由和防火墙的 引导式实验活动。这是一个正确的理念; NetSim 消除了当今的限制并对其进行了重新构想:它可以在任何带有浏览器的设备上运行,使用 **真实的 Linux 命令语法而非虚构的 CLI**,并且是开源的。 ## 填补的空白 纵观该领域(Packet Tracer / PT Anywhere、Boson NetSim、GNS3、EVE-NG、Containerlab、 Kathará、Filius、NetPilot),所有现有工具至少在以下某一项中表现不佳: | 需求 | 表现不佳者 | |---|---| | 完全客户端 —— 静态托管,适用于锁定的实验室机器和 Chromebook | PT Anywhere, Boson, NetPilot (服务端); GNS3/EVE-NG/Containerlab (需要服务器或 Docker); Filius (Java 桌面端) | | 真正的开源 Linux 语法(`iproute2`,以及未来的 nftables/iptables) | Packet Tracer & Boson (Cisco IOS); Filius & iNetwork (虚构的 CLI) | | 拖拽式多设备拓扑构建 | 单主机防火墙练习工具 | | 免费开源 | Packet Tracer, Boson, NetPilot | 据我们所知,**没有基于浏览器的工具教授 nftables** —— 这一空白是 第二阶段的核心目标。 ## 设计原则 1. **模拟 Linux;绝不弄虚作假。** 该引擎是一个纯粹的 TypeScript 离散事件模拟器。 命令接受经过筛选的*真实*语法子集,并**对任何 不支持的操作大声报错** —— 学生永远不会学到在真实机器上无法运行的语法。 2. **每个数据包都是可解释的。** 确定性模拟意味着该工具始终能说明 *为什么*数据包被丢弃或它去了哪里 —— 这是真实内核(或 WASM VM)无法提供的教学优势。 3. **永远没有后端(核心部分)。** 拓扑自动保存到 localStorage,以 JSON 文件导出/导入,并以压缩 URL 的形式共享。讲师发布文件或链接;学生加载它 并导出他们的尝试结果以供提交。 有关完整的设计文档,请参见 [docs/DESIGN.md](docs/DESIGN.md),有关 这些选择背后的架构决策记录,请参见 [docs/adr/](docs/adr/)。 ## 状态 —— 路线图的全部六个阶段均已完成 当前可用功能: - 拖拽式拓扑编辑器(主机、L2 学习交换机、路由器、防火墙),支持线缆 连接 - 每个设备专属的 xterm.js 终端:`ip address|link|route|neigh`、`ping`、`traceroute`、`arp`、 `sysctl net.ipv4.ip_forward`、`hostname`、`help` - 完整的 ARP + IPv4 + ICMP 模拟:最长前缀路由、TTL/超时、 目标不可达、MAC 学习 —— 支持实时数据包动画、暂停和速度控制 - **防火墙(第二阶段):** `nft` 和 `iptables` 前端编译为共享的规则模型 — 在任何一种方言中添加的规则都会在两者中列出(`nft list ruleset`、`iptables -S`);包含 input/forward/ output 链,支持 accept/drop/reject 和策略;针对 `ct state new,established,related` 的连接跟踪(状态防火墙);NAT — masquerade、SNAT、DNAT 端口 转发;每个设备的防火墙日志会指出每个裁决背后的确切规则;在扼杀数据包的设备上 显示红色的丢弃闪烁动画 - **Sockets(第二阶段):** 最小化的 TCP 握手 + UDP,`nc` 端口测试 (开放 / 拒绝 / 过滤),`nc -l` 监听器,每个设备的“监听服务”(实验 目标),`ss` 和 `conntrack -L` - **服务(第三阶段):** DHCP — `dhclient` 以广播数据包的形式针对可配置的 DHCP 服务器(地址池、网关、DNS 选项,可见的 租约)运行真实的 DISCOVER/OFFER/REQUEST/ACK 交换,并安装地址、默认路由和域名服务器;DNS — 一个 A 记录服务器 (hosts 文件风格的记录),通过真实的 udp/53 流量由 `dig [@server] [+short]` 查询, 主机名解析接入到了 `ping`、`traceroute`、`nc` 和 `curl` 中;HTTP — 一个 可配置的 Web 服务器,通过模拟的 TCP 握手使用 `curl [-v]` 获取, 对于拒绝/过滤/无法解析的情况会返回真实的 curl 错误代码。所有服务流量都是普通的 数据包:它在连线上产生动画(按协议显示不同颜色),并且可以被防火墙拦截 —— 拦截 udp/67 会中断 DHCP,拦截 udp/53 会中断 DNS,拦截 tcp/80 会中断 Web。全新的 Server 设备类型;演示 展示了完整的旅程:在 pc2 上运行 `dhclient`,然后运行 `curl http://web.lan/`。 - 检查器面板:接口状态/地址、DNS 客户端设置、DHCP/DNS/Web 服务 编辑器、实时路由/ARP/MAC/conntrack 表、带有复制为配置功能的 nftables 规则集视图、 防火墙日志 - **引导式实验(第四阶段):** 一种实验文件格式(起始拓扑 + 步骤 + 目标 + 测验),配有一个自动评分器,该评分器使用*真实数据包*探查实时模拟 —— 学生 在被打分的同时,可以观察评分器的 ping、TCP 连接、DNS 查询和 HTTP 获取的动画过程。实验播放器面板支持步骤导航、带有解释的每个目标的通过/失败状态、 进度条、即时反馈测验,以及一键**尝试导出**功能,以便提交至 LMS (尝试结果可重新导入并保留完整进度)。四个内置实验遵循经典的 iNetwork 序列:静态寻址与 ARP → 路由 → 状态防火墙 → DHCP/DNS/Web。讲师 将实验编写为 JSON,并以文件或共享链接的形式分发。 - **导出(第五阶段)** — 该愿景中的设计工具部分。从导出菜单中: **设备配置包 (.zip)** 包含真实的每个设备专属的 `setup.sh`(iproute2 + sysctl)、 `nftables.conf` 和 `dnsmasq.conf` — *已在 CI 中针对真实的 `nft` 和 `dnsmasq` 二进制文件进行了验证*,因此浏览器生成的内容,Linux 均可接受;**containerlab 拓扑** (`.clab.yml`,linux 节点 + 桥接交换机 + 作为执行行的 nft 规则),用于部署具有 真实内核的设计;**docker-compose**(近似的 L2,已编写文档);**SVG/PNG 拓扑 图**(文档级,浅色主题);以及**可打印的 HTML 网络报告** (内联图表、设备清单、布线、路由表、DHCP/DNS 配置、防火墙 规则集)。 - **动态路由、VLAN 和无线(第六阶段):** 路由器/防火墙上的 RIP — 定期的 udp/520 广播通告,具有水平分割、跳数指标、路由超时和可见的 收敛;学习到的路由在 `ip route` 中显示为 `proto rip`,防火墙可以像拦截其他任何东西一样拦截该 协议(丢弃 udp/520)。交换机上的 Access 端口 **VLAN**:每个端口的 VLAN 分配隔离了广播域(不同 VLAN 中同一子网的主机甚至无法进行 ARP), 带有每个 VLAN 的 MAC 表。**无线 AP**:带有 SSID 标签的桥接设备,其客户端链路 呈现为虚线无线关联。 - 自动保存、JSON 导出/导入(包括防火墙规则、服务配置、实验进度、RIP、 VLAN 和 SSID)、可共享的拓扑 URL、演示拓扑 超越最初路线图的未来工作:OSPF、802.1Q trunks、IPv6、v86 真实 VM 节点类型 (ADR 0002),以及更多内置实验 —— 欢迎贡献。 ## 开发 ``` npm install # note: .npmrc sets bin-links=false (repo may live on ExFAT) npm run dev # dev server npm test # engine + command tests (vitest) npm run build # type-check + production bundle ``` 技术栈:TypeScript、React、[React Flow](https://reactflow.dev)、[xterm.js](https://xtermjs.org)、 Zustand、Vite、Vitest。引擎(`src/engine/`)和命令层(`src/commands/`) 独立于框架,并进行了全面的单元测试。 ## 许可证 [MIT](LICENSE) — © 2026 Michael Borck。
标签:Linux网络, 教学工具, 网络模拟器, 自动化攻击, 防火墙配置