michael-borck/netsim
GitHub: michael-borck/netsim
一款纯浏览器运行、零安装的网络教学模拟器,支持真实 Linux 语法、引导式实验和实时数据包动画。
Stars: 0 | Forks: 0
# NetSim
**一款完全在浏览器中运行的网络模拟器 —— 真实的 Linux 语法,拖拽式
拓扑,零安装,无需后端。**
### ▶ 在线体验:
在画布上使用主机、交换机和路由器构建网络;在任何设备上打开终端,
并使用真实的 `iproute2` 命令(`ip addr`、`ip route`、`ping`、`traceroute`)进行配置;
观察 ARP 和 ICMP 数据包在连线上动态传输。首先将其作为教学工具构建,并将网络
设计和防火墙配置测试作为首要目标。

## 文档
- **[用户指南](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网络, 教学工具, 网络模拟器, 自动化攻击, 防火墙配置