micahp2/NetworkScanner
GitHub: micahp2/NetworkScanner
一款 Windows 原生网络扫描工具,支持子网扫描、端口探测、多层级 MAC 解析和厂商识别,提供现代化图形界面和便捷的资产发现能力。
Stars: 0 | Forks: 0
# 网络扫描器
一款快速、开源的 Windows 网络扫描器,基于 WPF 和 .NET 8 构建。
**[https://github.com/micahp2/NetworkScanner](https://github.com/micahp2/NetworkScanner)**
## 功能特性
| | |
|---|---|
| 🔍 **全子网扫描** | 枚举 CIDR 范围内的每一台主机(例如 `192.168.1.0/24`)以及来自 OS 连接表的其他设备 |
| 🖥 **主机名解析** | 对每个存活主机进行反向 DNS 查询 |
| 🔌 **MAC 地址查找** | 三层解析:现代邻居表 (GetIpNetTable2) → 旧版 ARP 缓存 → 主动 SendARP 探测 |
| 🌐 **IPv6 / NDP** | 读取 Windows IPv6 邻居表,以获取那些静默丢弃 IPv4 ARP 的设备的 MAC(常见于受管 Wi-Fi 网络) |
| 🏭 **厂商识别** | 通过 macvendors.com 进行 OUI 查找,支持前缀缓存和频率限制处理 |
| 🔓 **端口扫描** | 可配置端口列表,支持逗号和范围语法(`22,80,443,8080-8090`) |
| 🌑 **深色模式** | 遵循 Windows 系统主题;通过 DWM 实现深色标题栏 |
| 📋 **上下文菜单** | 复制任意字段 · 在浏览器中浏览开放端口 · 从任意行打开 SSH/RDP/终端 |
| 🔎 **查找 / 搜索** | 弹出式搜索栏 (Ctrl+F),支持实时高亮和跨所有列的 ↑/↓ 导航 |
| ↕ **可排序列** | 所有列均支持;IP 地址按数值排序 |
| 📁 **CSV 导出** | 导出包含 IPv6 在内的所有字段 |
| 🔔 **声音事件** | 扫描完成时播放 Windows 通知音;取消时播放关键停止音 |
## 截图
## 使用说明
1. **启动** — 应用程序会自动检测您的子网并预填 IP 范围字段
2. **设置端口** — 默认为 `80`;支持任意组合:
- 单个:`22`
- 多个:`22,80,443`
- 范围:`8080-8090`
- 混合:`22,80,443,8080-8090`
3. **点击扫描** — 结果随主机响应流入;再次点击以停止
4. **右键单击任意行** 打开上下文菜单:
- **复制 →** 将任意单个字段复制到剪贴板
- **浏览 →** 在默认浏览器中为每个开放端口打开 `http(s)://ip:port`
- **Shell →** SSH 会打开 Windows Terminal/PowerShell 并执行 `ssh user@ip`;RDP 会打开 `mstsc`
5. **查找** (或 Ctrl+F) — 弹出搜索栏;匹配的文本在每个单元格中以琥珀色高亮显示
6. **导出** — 将所有结果保存为 CSV,包含 IPv6 地址
### IP 范围格式
```
192.168.1.0/24 CIDR (scans .1 through .254)
192.168.1.1-254 last-octet range
192.168.1.1-192.168.1.254 full range
192.168.1.100 single host
```
## MAC 解析原理
MAC 地址分三轮解析,从最快到最激进:
1. **OS 邻居表快照** — 在 ping 扫描前后读取 `GetIpNetTable2`(现代)和 `GetIpNetTable`(旧版)以及 `netsh interface ipv4/ipv6 show neighbors`。这能捕获 Windows 已知的所有内容。
2. **IPv6 NDP 表** — `netsh interface ipv6 show neighbors` 揭示了那些静默丢弃 IPv4 ARP 的设备的 MAC(常见于受管 UniFi AP、交换机以及 Wi-Fi 上的 iOS/Android 设备)。EUI-64 IPv6 地址在数学上编码了 MAC,因此即使从 `Unreachable`(不可达)的 NDP 条目中也能提取 MAC。
3. **主动 SendARP 探测** — 对于经过上述步骤后仍缺少 MAC 的主机,`SendARP()` 发出定向 ARP 请求,并直接从其输出缓冲区读取 MAC(而不是从 OS 表读取,因为 OS 表在此用途上不可靠)。
### 为什么某些设备仍然不显示 MAC
如果设备位于**启用了客户端隔离的 Wi-Fi 网络**(UniFi 和许多企业级 AP 的默认设置)上,AP 会在无线客户端之间过滤 ARP。您机器的 ARP/NDP 请求在到达设备之前就会被丢弃。OS 将这些标记为 `00-00-00-00-00-00 Unreachable`。这是一种有意的网络策略——没有用户模式的 Windows 应用程序可以在不使用原始数据包捕获(需要内核驱动程序)的情况下绕过它。
从**同一交换机上的有线连接**运行扫描器将解析所有设备的 MAC。
### Tailscale / VPN 说明
当 Tailscale(或类似的 VPN 软件)运行时,它会注册一个带有 `169.254.x.x` (APIPA) 地址和 `Ethernet` 接口类型的虚拟 TAP 适配器。这可能导致 Windows 报告错误的本地子网。扫描器会过滤掉 `169.254.x.x` 地址,并在检测本地子网时优先选择可路由的私有范围地址(`10.x`、`172.16-31.x`、`192.168.x`)。由于路由表的修改,Tailscale 也可能阻止发现某些设备。
## 构建
**要求:**
- Windows 10 或 11
- .NET 8.0 SDK 或更高版本
```
git clone https://github.com/micahp2/NetworkScanner
cd NetworkScanner
dotnet build
dotnet run
```
或者在 Visual Studio 2022+ 中打开 `NetworkScanner.sln`。
**发布版本构建:**
```
dotnet publish -c Release -r win-x64 --self-contained false
```
## 架构
```
NetworkScanner/
├── models/
│ ├── ScanResult.cs # Result model with INotifyPropertyChanged
│ └── ScanOptions.cs # Scan configuration
├── services/
│ ├── IPHelperAPI.cs # P/Invoke: GetIpNetTable2, GetIpNetTable,
│ │ # SendARP, GetExtendedTcpTable/UdpTable,
│ │ # DWM, winmm (sounds)
│ └── NetworkScannerService.cs # 6-phase scan engine
├── App.xaml / App.xaml.cs # Theme (dark/light), DWM title bar, sounds
├── MainWindow.xaml # UI layout, column definitions
└── MainWindow.xaml.cs # All UI logic: scan, search, sort,
# context menu, highlight text block
```
### 扫描阶段
| 阶段 | 发生什么 |
|---|---|
| 1 | 根据用户范围 + OS 连接表构建候选 IP 列表 |
| 2 | 扫描前 MAC 快照(ARP 缓存、NDP 表、netsh) |
| 3 | 以并发量 50 ping 所有候选者 — 先 ICMP,然后并行 10 个 TCP 端口 |
| 4 | 800ms 稳定延迟,等待 ARP/NDP 缓存完成写入 |
| 5 | Ping 后 MAC 快照 — 与扫描前数据合并,运行 NDP EUI-64 提取 |
| 6 | 丰富每个存活主机的信息(DNS、MAC、厂商、端口)并将结果流式传输到 UI |
### 关键使用的 API
| API | 用途 |
|---|---|
| `GetIpNetTable2` (iphlpapi) | 现代 IPv4/IPv6 邻居表 |
| `GetIpNetTable` (iphlpapi) | 旧版 ARP 缓存 |
| `SendARP` (iphlpapi) | 主动定向 ARP 探测 |
| `GetExtendedTcpTable` (iphlpapi) | 用于设备发现的活跃 TCP 连接 |
| `GetExtendedUdpTable` (iphlpapi) | 用于设备发现的活跃 UDP 监听器 |
| `DwmSetWindowAttribute` (dwmapi) | 深色标题栏 (attr 20 / 19) |
| `PlaySound` (winmm) | Windows 声音事件 |
| `netsh interface ipv4/ipv6 show neighbors` | API 无法看到的陈旧 ARP + NDP 条目 |
| macvendors.com API | OUI → 厂商名称查找 |
## 故障排除
**未发现设备**
- 确认 IP 范围与您的网络匹配(自动检测的值应该是正确的)
- 尝试以管理员身份运行 — 某些 ARP 操作在提升权限后更可靠
- 如果正在使用 VPN,请断开并重新扫描
**缺少 MAC 地址**
- 开启了客户端隔离的 Wi-Fi:连接以太网以获得完整的 MAC 可见性
- 运行第二次扫描 — 第一次 ping 扫描会填充 ARP 缓存,以便后续查找
- 某些设备(受管交换机、具有加固固件的 IoT)主动拒绝 ARP
**扫描缓慢**
- 减少端口列表 — 每个端口会为每台主机增加一次 TCP 探测
- 将 IP 范围缩小到更小的子网
**自动检测到错误的子网**
- 断开 VPN/Tailscale 或手动输入正确的范围
## 更新日志
### v1.0.0
- 初始公开发布
- 完整 /24 子网扫描(不仅仅是 OS 表中已知的设备)
- 三层 MAC 解析,包含 IPv6 NDP EUI-64 提取
- Tailscale/VPN 接口检测修复(169.254.x.x 过滤)
- 深色模式,带有主题化标题栏、滚动条和输入字段 (DynamicResource)
- 单元格搜索高亮 (HighlightTextBlock)
- 上下文菜单:复制 / 浏览 / Shell
- 扫描完成和扫描停止时的声音事件
- 一致的全手动排序(无 DataGrid ICollectionView 冲突)
- OUI 厂商查找,带缓存和频率限制退避
- IPv6 地址列
## 许可证
MIT — 查看 [LICENSE](LICENSE)
标签:ARP探测, CIDR, Dark Mode, Enumeration, IPv4扫描, IP扫描, IT运维, MAC地址解析, .NET 8, NetAdmin, OUI查询, Socks5代理, Windows桌面应用, WPF, 二进制发布, 企业安全, 厂商识别, 反向DNS, 子网扫描, 开源工具, 插件系统, 数据统计, 无线安全, 端口扫描, 端点可见性, 网络安全, 网络安全审计, 网络扫描器, 网络故障排查, 网络资产管理, 隐私保护