thozoz/GoMap
GitHub: thozoz/GoMap
基于 Go 和 React 构建的轻量级桌面端口扫描与网络发现工具,通过友好的图形界面实现实时扫描结果展示。
Stars: 0 | Forks: 0
# GoMap
一个轻量级的端口扫描器桌面应用,通过 [Wails](https://wails.io) 使用 **Go** 后端和 **React** 前端构建。扫描 TCP 端口,抓取服务 Banner,检测网络中的存活主机,并通过暗色主题 UI 实时显示结果。
本项目作为一个学习项目,旨在探索 Go 的网络原语、goroutine 工作池以及 Wails 桌面应用框架。

## 下载
Linux 和 Windows 的预编译二进制文件可在 [Releases](../../releases) 页面获取:
| 平台 | 文件 |
|---|---|
| Linux (x64) | `GoMap-linux-amd64` |
| Windows (x64) | `GoMap-windows-amd64.exe` |
每次向 `main` 分支推送代码时,都会自动更新一个 **latest** 预发布版本。
## 功能特性
- **端口范围扫描** — 扫描任意 TCP 端口范围,支持自定义超时时间和 Worker 数量
- **常用端口预设** — 一键扫描约 80 个知名端口(SSH、HTTP、数据库、DevOps 工具等)
- **网络发现** — 扫描 CIDR 范围(例如 `192.168.1.0/24`),通过 TCP 探测发现存活主机
- **Banner 抓取** — 读取开放端口的服务 Banner(SSH 版本、HTTP 头等)
- **服务检测** — 将端口号映射到已知服务名(超过 100 条记录)
- **实时结果** — 端口一经发现即刻显示,无需等待整个扫描完成
- **结果过滤** — 显示所有结果、仅开放端口或仅被过滤(有防火墙)的端口
- **进度跟踪** — 实时进度条、已扫描/总数计数器以及扫描速度(端口/秒)
- **取消操作** — 可在扫描中途优雅地停止
## 技术栈
| 层级 | 技术 |
| -------- | -------------------------------------------------------------------------- |
| 后端 | [Go](https://go.dev) — `net` 包、goroutine 工作池、context 取消机制 |
| 前端 | [React](https://react.dev) + [Tailwind CSS](https://tailwindcss.com) |
| 桌面 | [Wails v2](https://wails.io) — 将应用封装在原生 webview 窗口中 |
## 项目结构
```
GoMap/
├── app.go # Core logic — StartScan, StartScanList, ScanNetwork, CancelScan
├── main.go # Wails app entry point
├── wails.json # Wails project config
├── go.mod
├── go.sum
└── frontend/
├── src/
│ ├── App.jsx # Main React UI — scan form, results table, event listeners
│ └── main.jsx
├── index.html
├── package.json
├── tailwind.config.js
└── vite.config.js
```
## 快速开始
### 前置条件
- [Go](https://go.dev/dl/) 1.21+
- [Node.js](https://nodejs.org/) 18+
- [Wails CLI](https://wails.io/docs/gettingstarted/installation) — `go install github.com/wailsapp/wails/v2/cmd/wails@latest`
- 在 Linux 上:`webkit2gtk` — 例如在 Fedora 上执行 `sudo dnf install webkit2gtk4.1-devel`
验证你的设置:
```
wails doctor
```
### 开发
```
wails dev
```
在支持热重载的窗口中打开应用。Go 代码的更改会重启后端;React 代码的更改会即时热重载。
### 构建
```
wails build
```
在 `build/bin/` 目录下生成单个原生二进制文件。
### 针对现代 Linux 用户的注意事项
现代 Linux 发行版(Fedora 40+、Ubuntu 24.04+、Debian 13+ 等)已弃用 `webkit2gtk-4.0` 包,转而使用 `webkit2gtk-4.1`。如果在尝试运行应用时遇到 **`libwebkit Not Found`** 错误,你需要:
1. 为你的发行版安装 **4.1** 开发包。例如:
# Fedora
sudo dnf install webkit2gtk4.1-devel
# Ubuntu / Debian
sudo apt install libwebkit2gtk-4.1-dev
2. 使用 `webkit2_41` 构建标签运行项目:
wails dev -tags webkit2_41
对于生产构建,请使用相同的标签:
wails build -tags webkit2_41
## 工作原理
1. **端口扫描** 通过 TCP 使用 `net.DialTimeout` 进行。对每个端口尝试完整的连接——如果成功则端口状态为 `OPEN`,如果超时则为 `FILTERED`(可能被防火墙拦截),如果被拒绝则为 `CLOSED`(默认情况下会静默跳过)。
2. **工作池** — 可配置数量的 goroutine 从 channel 中并发拉取端口,使大规模扫描比顺序扫描快得多。
3. **取消机制** — 每次扫描都在 `context.WithCancel` 下运行。`CancelScan` 方法触发取消函数(由互斥锁保护以避免数据竞争),所有 Worker 通过其循环顶部的 `select` 检查干净地退出。
4. **实时 UI** — Go 在确定端口状态后立即发出 `port_result` Wails 事件。React 前端缓冲传入的事件,并每 300 毫秒将它们刷新到状态中,以避免过度重绘。
5. **Banner 抓取** — 在确认端口开放后,对连接设置 500 毫秒的读取截止时间。接收到的任何字节都会作为单独的 `port_banner` 事件发出,并注入到匹配的表格行中。
6. **网络发现** — `ScanNetwork` 使用 `net.ParseCIDR` 解析 CIDR,遍历所有主机地址,并在端口 `22, 80, 443, 8080, 3389, 8443` 上探测每一个地址。首次成功的连接即将该主机标记为存活。
## 许可证
本项目基于 [MIT License](LICENSE) 授权。
标签:Banner抓取, CIDR扫描, Go, Goroutine, Maven构建, React, Ruby工具, Syscalls, Tailwind CSS, TCP扫描, URL发现, URL短链接分析, Wails, 二进制发布, 内网扫描, 安全检测, 实时显示, 并发扫描, 开源工具, 恶意行为检测, 批量查询, 插件系统, 数据统计, 日志审计, 服务器安全, 服务探测, 桌面应用, 端口扫描, 网络发现, 网络安全, 网络工具, 自定义脚本, 资产探测, 轻量级工具, 隐私保护