crapface/netwatch

GitHub: crapface/netwatch

NetWatch 是一款无需安装的便携式 Windows 局域网扫描与持续监控工具,通过探测 TCP 开放端口发现主机并在设备下线时发送邮件告警。

Stars: 0 | Forks: 0

# NetWatch — 便携式局域网扫描与监控工具 NetWatch 会发现网络中开放了特定 TCP 端口的主机,然后对其进行监控,并在主机下线时通过电子邮件通知您。它是一个单一的便携式 Windows 可执行文件 —— 无需安装程序、无需运行时、无需管理员权限、不写注册表、不占用 `%APPDATA%`。它写入的所有内容(日志、厂商缓存、配置文件、报告)都存放在 `.exe` 所在的同一文件夹中。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/1ae13f1445005912.svg)](https://github.com/crapface/netwatch/actions/workflows/ci.yml) [![Release](https://img.shields.io/github/v/release/crapface/netwatch?sort=semver)](https://github.com/crapface/netwatch/releases/latest) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) **[⬇ 下载最新版 NetWatch.exe](https://github.com/crapface/netwatch/releases/latest)** · English | [Español](README.es.md) ## 1. 系统要求 * Windows 10 或 11 (64 位)。也可在 Windows 7/8.1 上运行。 * 无其他要求。没有类似 .NET 运行时带来的烦恼 —— NetWatch 是一个独立的原生二进制文件。 ## 2. 如何运行 1. 将 `NetWatch.exe` 复制到任何位置 —— U盘、`C:\Tools\NetWatch\` 或您的桌面。 2. **双击 `NetWatch.exe`。** 就这样。 首次启动时,Windows SmartScreen 可能会警告发布者未知(因为该二进制文件未签名)。点击 **更多信息 → 仍要运行**。 ## 3. 首次设置 1. **网络范围。** 在 **Scanner** 选项卡中,会自动检测并填入活动的子网(例如 `192.168.1.0/24`)。您可以随意编辑它 —— 输入任何 CIDR,例如 `10.0.0.0/16` 或 `172.16.5.0/24`。点击 **Detect** 可重新检测。 2. **端口。** 进入 **Settings → Scan ports**。默认值为 `8080` 和 `3000`。您可以随意添加或删除端口(输入数字,点击 **Add**;选中一个并点击 **Remove selected**)。 3. **厂商名称(可选)。** Settings → **Vendor database (IEEE OUI)** → **Update OUI Data**。NetWatch 会下载官方的 IEEE OUI 列表,并将其作为 `oui_cache.json` 缓存在 exe 所在目录下,以便在表格中显示 MAC 厂商信息。这是一次性操作(偶尔刷新即可)。 4. **电子邮件(可选)。** Settings → **Email notifications (SMTP)**。输入您的 SMTP 服务器、端口、加密方式、用户名、密码、发件人和收件人。勾选 **Enable email alerts**,然后点击 **Test Email** 进行确认。 ⚠ SMTP 密码以**纯文本**形式存储在 `.site` 配置文件中 —— NetWatch 会在界面中对此向您发出警告。 5. **语言。** 使用右上角的下拉菜单随时在 English 和 Español 之间切换。整个界面会立即更新。 ## 4. 工作流程:扫描 → 监控 → 保存 → 报告 **扫描。** 在 Scanner 选项卡上,确认范围并点击 **Scan**。NetWatch 会尝试连接子网中每个地址的各个端口,进度条会随之填满。扫描没有时间限制 —— 它的宗旨是详尽无遗 —— 但您可以随时按下 **Cancel**,并保留目前发现的结果。界面永远不会卡死。发现的主机会出现在表格中,包含状态、IP、主机名、厂商、MAC、开放端口和唯一 ID 等信息。 **监控。** 扫描完成后,表格下方会出现一个巨大的**闪烁**的 *START MONITORING* 按钮。点击它。NetWatch 现在会每隔 *N* 秒(默认为 60 秒,在 Settings 中设置)重新检测它刚发现的主机。**Monitor** 选项卡会为每个主机显示实时的 🟢 UP / 🔴 DOWN 指示灯以及持续滚动的事件日志。只有当某台主机在**连续两次**检测中,其**所有**开放端口均连接失败时,才会被标记为 **DOWN**(这可以避免误报)。当这种情况发生时,您会收到一封邮件;在该主机恢复并第二次下线之前,您不会再次收到邮件。 **保存站点。** 进入 Settings → 为该 Site 命名 → **Save Site**。这将生成一个 `.site` 文件,其中包含网络范围、端口列表、邮件配置、完整的主机列表、完整的监控事件日志,以及监控当时是否正在运行的状态。 **生成报告。** Settings → **Generate Report** 会创建一个独立的 `Report__.html`(所有 CSS 均已内嵌 —— 这是一个可以直接通过邮件发送或存档的单一文件),并在您的浏览器中打开它。其中列出了每台主机以及完整的 UP/DOWN 日志。 ## 5. 加载已保存的站点并恢复 Settings → **Load Site** → 选择您的 `.site` 文件。NetWatch 会原封不动地恢复主机列表、事件日志和所有已保存的设置。如果您在保存 Site 时它正处于监控状态,NetWatch 会主动提示您立即 **resume monitoring** —— 这样您就可以关闭应用程序,稍后再打开,并从上次中断的地方继续。 ## 6. 设置参考 | 设置 | 含义 | |---|---| | Scan ports | 扫描期间测试的端口;如果 ≥1 个端口开放,则该主机即被视为“已发现”。 | | Max concurrency | 同时进行的 TCP 拨号连接数(默认为 100)。调高可提升速度,调低则适用于慢速网络。 | | Connect timeout (ms) | 每个连接的等待超时时间(默认为 1000)。 | | Retries on timeout | 连接超时时的额外重试次数(默认为 1)—— 用于确保彻底性。 | | Check interval | 监控轮询之间的间隔秒数(默认为 60)。 | | Email | SMTP 服务器/端口/加密方式/凭证/收件人 + Test Email。 | | Update OUI Data | 下载并缓存 IEEE 厂商数据库。 | | Save / Load Site | 持久化或恢复整个应用程序的状态 (`.site`)。 | | Generate Report | 生成并打开独立的 HTML 报告。 | ## 7. NetWatch 创建的文件(均为便携式,位于 .exe 同级目录下) * `app.log` — 带有时间戳的 INFO/WARN/ERROR 日志。 * `oui_cache.json` — 缓存的 IEEE 厂商数据库(在您点击 Update OUI Data 后生成)。 * `profiles\` — 保存/加载对话框提供的默认文件夹。 * `Report_*.html` — 生成的报告文件。 您可以随意删除其中任何文件;NetWatch 会在需要时重新创建它们。 ## 8. 故障排除 * **扫描不到任何内容。** 确认 CIDR 与您的局域网匹配(检查 `ipconfig`)。确保您扫描的端口上确实有服务在监听。企业网络通常会阻断主机之间的流量(“客户端隔离”)—— 尝试扫描一个您确定已开放的端口。 * **Vendor / MAC 列为空。** MAC 地址来自操作系统的 ARP 缓存,该缓存仅了解您**自身**所在的 layer-2 网段上的设备。对于通过路由或远程子网,MAC(及其对应的厂商)是无法获取的 —— 这是预期行为,程序会平稳处理。同时,请确保您已运行过 **Update OUI Data**。 * **邮件测试失败。** 仔细检查服务器、端口和加密方式。端口 587 → STARTTLS,端口 465 → SSL/TLS,端口 25 → None。对于要求使用应用专用密码的服务商(例如 Gmail/Microsoft 365),请使用应用专用密码,而不是您的常规登录密码。作为针对自签名邮件服务器的最后手段,可以勾选 *Skip TLS certificate verification*。 * **Windows 防火墙。** 用于扫描的出站 TCP 连接和 SMTP 通常都会被默认允许,不会弹出提示。NetWatch 不需要任何入站规则。 * **大型子网。** `/16`(6.5 万个地址)是可以运行的,但需要一些时间;扫描器会流式处理地址,因此不会耗尽内存。大于 `/8` 的范围将被拒绝执行。 ## 9. 从源码构建 需要 **Go toolchain 1.22+** ()。无需其他任何依赖 —— 构建过程是纯 Go (`CGO_ENABLED=0`),并且 Windows manifest 和图标已预先内嵌到 `rsrc_windows_amd64.syso` 中,因此只需简单的 `go build` 即可生成一个具有主题、支持 DPI 感知且非提权的可执行文件。 ``` # 选项 A — 一键 .\build.ps1 # or: build.bat # 选项 B — 手动 $env:GOOS="windows"; $env:GOARCH="amd64"; $env:CGO_ENABLED="0" go build -trimpath -ldflags "-H windowsgui -s -w" -o dist\NetWatch.exe . ``` 便携式程序包会生成在 `.\dist` 目录中。使用 `go test ./internal/...` 运行测试(核心引擎包是跨平台的,可在任何操作系统上进行测试)。 要重新生成内嵌的 manifest/图标(仅当您修改了 `winres\` 时才需要): ``` go install github.com/tc-hib/go-winres@latest go-winres make --in winres\winres.json --arch amd64 --out rsrc ``` ## 10. 技术选型说明 **Go + [lxn/walk](https://github.com/lxn/walk)。** 核心硬性需求是:一个只需双击即可运行的单一 Windows 二进制文件,且**零**运行时安装;一个原生带选项卡的 GUI(包含可编辑字段、带有逐行实时状态的数据网格、一个闪烁的按钮);能够应对繁重的并发网络 I/O,且该过程永远不会阻塞 UI 并可随时取消;以及完全的便携性(无注册表/无 `%APPDATA%`)。 Go 可编译为一个单一的、无依赖的静态 `.exe`(约 10 MB),其 goroutines 和 `context` 机制非常适合实现并发受限的子网扫描器。 `lxn/walk` 封装了原生的 Win32 控件(TabWidget、TableView、ProgressBar)—— 因此该应用程序外观原生、保持轻量,最关键的是它**无需 CGO**,这意味着不需要 C 编译器且能实现干净利落的交叉编译。耗时操作在 goroutines 中运行,并通过 `walk` 的 `Synchronize` 机制将 UI 更新调度回主线程,从而保持窗口响应灵敏且可随时取消。闪烁的按钮是一个 `walk.Composite`,其背景画刷由一个 500 毫秒的 ticker 定时切换;实时状态则是通过 `TableView` 的单元格样式化器,将每一行渲染为绿色/红色。本地化资源是内嵌的 JSON 格式,通过即时重新标记每个控件来应用,因此语言切换瞬间完成,无需重启。(虽然 .NET/WinForms 构建也能满足规格要求,但它会打包成一个体积大得多的独立捆绑包,并引入 C# 工具链;相比之下,Go 能提供更小、更简单的单文件结果。) NetWatch v1.0.0 · 参见 [CHANGELOG.md](CHANGELOG.md)。
标签:Docker 部署, EVTX分析, Go, Linux, Ruby工具, 局域网扫描, 日志审计, 网络运维, 跨平台