Scanopy 如何让你免去手动绘制网络拓扑图的烦恼
任何曾经尝试维护公司或家庭服务器网络最新拓扑图的人都深知其中的痛苦。你坐在 draw.io 或 Visio 前,花半天时间精心排列交换机、服务器和连接线的小方框。一周后,系统管理员更换了几根跳线,DevOps 工程师在 Docker 中部署了一套新服务,你手绘的拓扑图就变成了一份毫无用处的历史文件。
Terraform 或 Ansible 的状态文件也不一定能帮到你。基础设施代码只展示管道中描述的内容,会忽略交换机上的手动更改或临时启动的虚拟机。
我最近发现了 Scanopy 项目。他们构建了一个工具,可以定期扫描网络并自动生成多层次抽象的交互式拓扑图。
L2(物理层) |
L3(逻辑层) |
工作负载 |
应用程序 |
底层工作原理
该项目没有在每台虚拟机上安装笨重的代理,而是使用轻量级守护进程扫描器。守护进程通过 SNMP 查询网络设备,解析 LLDP 和 ARP 表,并扫描开放端口。在需要时,扫描器直接连接 Docker socket 来清点容器信息。
在底层,Scanopy 使用 Rust 编写。这使得扫描器和服务器具有快速性能,同时不会占用过多内存。
每次扫描器运行后,系统会构建一个基础设施模型,并从中生成四个独立的切片:
- L2 物理层。包括交换机、物理链路和特定设备的连接端口。
- L3 逻辑层。展示路由、子网以及 IP 地址在主机间的分布。
- 工作负载。展示从裸金属服务器和虚拟化平台到虚拟机和单个容器的链路。
- 应用程序。将服务分组并构建数据库、Web 服务器和后台 worker 之间的依赖图。
该项目已内置超过两百个预构建的服务签名。扫描器能立即识别 PostgreSQL、Redis、Nginx、Kubernetes 以及许多其他软件,无需额外的手动标注。
扫描器功能
这种方法的主要优势是自主性。你只需设置一个计划任务,扫描器就会在后台定期更新拓扑图。
以下是一些实用功能:
- 分布式数据采集。对于多个办公室或隔离的 VLAN,你可以部署独立的守护进程,将数据发送到中央服务器。
- 拓扑图导出。完成的拓扑图可以导出为 SVG、以 Mermaid 代码形式嵌入文档,或直接上传到 Confluence。
- 交互式 Web 界面。你可以放大查看地图,点击各个节点,查看活跃端口和相邻连接。
- 基于角色的访问控制模型。内置了组织和用户之间的隔离功能,这对服务公司和外包团队很有用。
实验室快速上手
试用该系统的最简单方法是在可访问目标子网的主机上通过 Docker Compose 启动容器。
curl -O https://raw.githubusercontent.com/scanopy/scanopy/refs/heads/main/docker-compose.yml
docker compose up -d
启动后,Web 界面监听在 60072 端口。访问 http://localhost:60072,创建本地管理员账户,然后启动第一次扫描周期。
如果你在 Proxmox VE 上运行家庭实验室,作者提供了一个现成的脚本,可部署在 LXC 容器中。Scanopy 也收录在 Unraid 应用目录中。
如果你不想本地安装,创作者在 demo.scanopy.net 提供了公共演示沙箱,内含预填充的测试数据。
谁将从这个项目中节省时间
对于运维工程师和 DevOps 团队,Scanopy 解决了"这个流量去哪里了,这个容器在哪里运行"这个永恒的问题。你可以看到物理和逻辑硬件的绑定关系,无需手动收集追踪信息。
对于网络工程师,这个工具有助于维护最新的交换拓扑图,而无需在图形编辑器中花费大量时间。当迁移服务或切换端口时,拓扑图会在下次扫描时自动更新。
对于家庭服务器和家庭实验室爱好者,这个工具提供了一种组织服务蔓延的方法,无需在周末花时间手动编写文档。
总结
Scanopy 以直接简单的方式解决了文档过时的经典问题。拓扑图是根据网络的实际状态生成的,而不是基于六个月前开发者的理解。
代码以 AGPL-3.0 许可证分发,支持自托管。如果你一直在推迟更新基础设施拓扑图,或者厌倦了每次发布后都要重绘拓扑图,可以将守护进程部署到测试网络,看看首次运行的效果。
相关项目