benballs32-max/Netscan
GitHub: benballs32-max/Netscan
Sonar 是一款 Windows 本地网络扫描器,通过多种协议信号对局域网设备进行指纹识别并实时监控其在线状态。
Stars: 0 | Forks: 0
# Sonar 网络扫描器
一款适用于 Windows 的本地网络扫描器。它能发现子网中的每一台设备,通过多重信号源对其进行指纹识别,实时监控它们的在线状态,并在有新设备接入时向您发送通知。
基于 Electron + Node.js 构建。所有操作均在本地运行——唯一的可选外部请求是 Claude AI 的重新分析。
## 快速开始
```
git clone https://github.com/benballs32-max/Netscan.git
cd Netscan
npm install
npm start
```
按下 **扫描**。设备会在被发现时源源不断地显示出来。点击任意设备即可查看其完整证据。如果对某些设备不确定,可以点击 **使用 Claude 重新分析**。
构建可分发的 Windows 安装程序:
```
npm run dist # outputs to dist/ (NSIS installer via electron-builder)
```
## 功能说明
### 主机发现
- 自动检测您的主子网(例如 `192.168.1.0/24`)
- 读取 ARP 表 + 并行 ICMP ping 扫描以查找活动主机
- 捕获 TTL 以推测操作系统类别(Windows ≈ 128,Linux/macOS ≈ 64,网络设备 ≈ 255)
- 4 个并发的指纹识别 worker —— 扫描 /24 子网时不会因为单台主机的请求超时而造成阻塞
### 端口扫描
通过精心整理的常用端口列表进行 TCP connect 探测,以识别开放的服务:
SMB、RDP、HTTP/S、SSH、FTP、Telnet、RTSP、IPP、JetDirect、SNMP、IPMI、Sonos、Plex、DSM 等。
### SNMP
从启用了 SNMP(community 为 `public`)的设备上查询 `sysDescr` 和运行时间。
### 主机名解析
反向 DNS(PTR 记录查询)+ 通过 `nbtstat` 获取 NetBIOS 名称 —— 当 DNS 没有 PTR 记录时,优先使用 mDNS 的 `.local` 名称。
### HTTP / TLS Banner 抓取
从常用的 HTTP/HTTPS 端口获取 Web UI 标题、`Server` 标头以及 TLS 证书字段(CN、Org、SAN)。用于通过其品牌化 UI 识别路由器、NAS 设备、摄像头和其他硬件设备。
### SSDP / UPnP 发现
通过多播扫描获取 UPnP 设备描述 —— 从设备的 XML 描述文件中提取结构化的 `deviceType`、`friendlyName`、`manufacturer` 和 `modelName` 字段。
### mDNS / Bonjour 发现
针对 14 种服务类型进行 UDP 多播查询,包括:
`_airplay`、`_raop`、`_googlecast`、`_homekit`、`_hap`、`_spotify-connect`、`_ipp`、`_pdl-datastream`、`_smb`、`_afpovertcp`、`_ssh`、`_http`、`_https`、`_device-info`
解析 DNS 响应数据包(支持带有压缩指针的 PTR、SRV、A、TXT 记录),并构建 IP 到 `{ services, hostname, txt }` 的映射。
### 设备指纹识别
所有信号都由 `scanner/inference.js` 综合计算出设备的标签、型号、类别、图标、置信度评级和一句话原因。信号优先级(从高到低):
| 信号 | 示例 |
|---|---|
| mDNS 服务记录 | AirPlay+RAOP → Apple Speaker;`_googlecast` → Chromecast;`_hap` → HomeKit |
| 端口 + 厂商组合 | 5000/5001 + Synology → NAS;9100 → 打印机;554 → IP Camera |
| UPnP 设备类型 | `InternetGatewayDevice` → 路由器;`MediaRenderer` → 扬声器 |
| HTTP / TLS banner | FRITZ!Box、Proxmox、Synology DSM、Hikvision、Home Assistant、Pi-hole… |
| 仅厂商 (OUI) | Raspberry Pi、Amazon (Echo)、Signify/Philips (Hue)、TP-Link |
| TTL 提示 | 最后手段的 OS 类别推测 |
可识别的设备类型包括:路由器(UniFi、FRITZ!Box、OpenWrt、MikroTik、EdgeRouter)、NAS(Synology、QNAP、TrueNAS)、IP 摄像头(Axis、Hikvision、Dahua、Reolink)、打印机(HP、Brother、Epson、Canon + IPP/JetDirect)、智能音箱(Sonos、HomePod、Echo、Spotify Connect、Chromecast、Apple TV)、HomeKit 配件、Hypervisor(Proxmox、ESXi)、Plex、Home Assistant、Pi-hole、Grafana、Raspberry Pi、ESP32/IoT 微控制器、Windows/Linux/Mac 主机等。
### AI 重新分析
任何被规则引擎评为 `low`(低)置信度的设备都可以发送给 **Claude claude-sonnet-4-6** 以获得更精确的识别。发送内容包含完整的证据对象(IP、MAC、厂商、端口、SNMP、主机名、Banner、UPnP、mDNS)。这是唯一离开本机的数据,且仅在明确点击后发送。
需要 Anthropic API 密钥 —— 请在“设置”面板中配置(右上角的齿轮图标)。
### 实时在线状态监控
每次完成扫描后,Sonar 会每 **2.5 分钟** 监控一次所有已发现的设备:
- 通过 TCP 连接到已知的开放端口(最快,1.5 秒超时)
- 如果设备没有开放端口,则回退使用 `ping`
- 掉线的设备在 UI 中会变暗,并带有“· offline”的标记
- 重新上线的设备会自动恢复显示状态
### 扫描历史与差异对比
- 每次完成扫描后,都会在 `userData` 中保存一份 JSON 快照
- 自动与上一次扫描进行对比
- 右下角会显示差异提示横幅:**+N new · −N gone · ~N changed**
- 当有新设备加入网络时,会弹出 Windows 系统通知(无声 Toast)
### 设置面板
可通过齿轮按钮访问(右上角,最小化旁边):
- **Anthropic API 密钥** —— 保存在本地,除发送至 Anthropic 外绝不发往别处
- **扫描方法开关** —— 针对每次扫描启用/禁用各个扫描阶段:
- 端口扫描
- SNMP 查询
- 主机名解析
- HTTP / TLS Banner
- SSDP / UPnP 发现
- mDNS / Bonjour
## 架构
```
renderer/index.html ← bundled UI (design-tool output, demo + real mode)
│ window.sonar.* (safe contextBridge, preload.js)
▼
electron/main.js ← scan orchestration, IPC, presence monitor
├── scanner/discovery.js ARP + ping sweep
├── scanner/ports.js TCP connect scan (worker-pool, 4 concurrent)
├── scanner/snmp.js SNMP sysDescr / uptime
├── scanner/hostname.js reverse DNS + nbtstat (spawn-safe)
├── scanner/banner.js HTTP / TLS banner grabber
├── scanner/ssdp.js SSDP / UPnP multicast discovery
├── scanner/mdns.js mDNS / Bonjour (built-in DNS parser, no deps)
├── scanner/oui.js MAC → vendor (IEEE OUI database, 39,000+ entries)
├── scanner/inference.js rule-based device classifier
├── scanner/claude.js Anthropic API call (optional, on-demand)
└── history.js scan snapshot save / load / diff
```
渲染进程**仅**通过 `window.sonar` 的 contextBridge 与主进程通信。未启用 `nodeIntegration`。无需管理员权限 —— 所有扫描均使用 TCP 连接、标准 shell 命令(`ping`、`arp`、`nbtstat`)和 UDP 多播。
## IPC 契约(`window.sonar`)
| 调用 | 方向 | 载荷 | 返回值 |
|---|---|---|---|
| `sonar.scan(subnet)` | renderer → main | `"192.168.1.0/24"` | 启动扫描 |
| `sonar.stop()` | renderer → main | — | 取消扫描 |
| `sonar.reanalyze(evidence)` | renderer → main | 设备证据对象 | `{label,model,confidence,reason}` |
| `sonar.getSubnet()` | renderer → main | — | 检测到的 CIDR 字符串 |
| `sonar.getSettings()` | renderer → main | — | 设置对象 |
| `sonar.saveSettings(patch)` | renderer → main | 部分设置内容 | 已保存 |
| `sonar.onDevice(cb)` | main → renderer | 每个主机对应一个设备对象 | — |
| `sonar.onProgress(cb)` | main → renderer | `{phase, done, total}` | — |
| `sonar.onDone(cb)` | main → renderer | — | 扫描完成 |
| `sonar.onPresence(cb)` | main → renderer | `{ip, online}` | — |
## OUI 数据库
本仓库附带了完整的 IEEE OUI 注册表(超过 39,000 条记录)。若要更新数据库:
```
npm run update-oui
```
该脚本会从 `standards-oui.ieee.org` 下载最新的 CSV 文件(需要浏览器 User-Agent 标头——脚本已处理此要求),并覆盖 `electron/oui.csv`。
## Windows 注意事项
- **防火墙**:首次运行应用程序打开套接字时可能会出现提示 —— 请允许在专用网络中访问。
- **SNMP**:只有在设备启用了 SNMP 且 community 为 `public` 时才会响应;大多数消费级设备并不会开启,这完全没问题。
- **杀毒软件**:局域网端口扫描器可能会触发启发式杀毒软件。对构建好的 `.exe` 进行代码签名(`package.json → build.win.certificateFile`)可避免 SmartScreen 警告。
- **无需管理员权限**:使用 TCP connect 扫描,而非 SYN 扫描;仅使用标准的 Windows shell 命令。
## 许可证
MIT
标签:Electron, Facebook API, GNU通用公共许可证, MITM代理, Node.js, 人工智能, 后端开发, 局域网发现, 插件系统, 数据可视化, 数据统计, 用户模式Hook绕过, 端口扫描, 网络扫描器, 设备指纹识别