# tool-webipscan **Repository Path**: apnode/webipscan ## Basic Information - **Project Name**: tool-webipscan - **Description**: web 查看当前局域网 IP占用 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-14 - **Last Updated**: 2026-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 局域网 IP 占用查询工具 Go 编写的局域网 IP 扫描工具,**纯标准库零依赖**,编译为单个 exe(约 6.6 MB)。前端页面由 `//go:embed` 打包进二进制,运行时不依赖任何外部文件。 ## 快速开始 ```bash # 编译(单文件 exe) go build -ldflags="-s -w" -o ipscan.exe . # 启动 ./ipscan.exe # 默认尝试 8080 ./ipscan.exe 9000 # 指定端口 ``` 启动后**自动用默认浏览器打开页面**,控制台同时打印本机全部 IP。按 `Ctrl+C` 停止。 **端口被占用时自动避让**:若指定端口(或默认 8080)不可用,程序会在 **10000–65535** 内随机挑选一个可用端口,并在控制台提示实际使用的端口: ``` 访问地址: http://127.0.0.1:10474 (端口 8080 不可用,已自动改用 10474) ``` ## 功能 | 功能 | 说明 | |---|---| | 本机 IP 列表 | 页面顶部列出本机**全部** IPv4 地址(含网卡名、掩码、网段、MAC),按 有线→无线→虚拟→回环 排序;点击任一 IP 即把对应网段填入输入框 | | 网格视图 | 32 列紧凑矩阵(窄屏自动降为 24/16/8 列),实时着色:绿色=已占用、白色=空闲、虚线=未扫描 | | 列表视图 | 表格展示 IP/状态/主机名/MAC/厂商/开放端口/响应时间 | | 实时推送 | 基于 SSE,扫到一个推一个,无需等待全部完成 | | MAC 与厂商 | 读取系统 ARP 表获取 MAC,按 OUI 前缀识别厂商 | | 主机名 | 反向 DNS 查询(带超时保护) | | 开放端口 | 并发 TCP 连接探测,记录响应最快端口的耗时 | | ICMP Ping | 可选,调用系统 ping 命令 | | 导出 CSV | 导出结果(含 BOM,Excel 直接打开不乱码) | | 仅看占用 | 列表视图可过滤空闲地址 | ## 参数 | 参数 | 默认值 | 说明 | |---|---|---| | 网段 (CIDR) | 本机推荐网段 | 如 `192.168.1.0/24`,自动跳过网络号与广播地址;上限 4096 个地址 | | 探测端口 | `22,80,135,139,443,445,3389,8080` | 逗号分隔,任一端口开放即判定占用 | | 超时 | 400 ms | 单个端口连接超时,网络差可调大 | | 并发数 | **20** | 同时探测的主机数 | | ICMP Ping | 关闭 | 勾选后对未探到端口的主机补充 ping | > 并发数指"同时探测的主机数"。同一主机的多个端口内部再并行(上限 8), > 因此并发 20 实际最多约 `20 × 端口数` 个 socket 在途,不会因为串行探测端口而拖慢。 ## 探测原理 1. **TCP 端口探测**(主):对目标 IP 的每个端口并发发起 `DialTimeout`,任一成功即标记占用,记录最快 RTT。 2. **ICMP Ping**(辅):调用系统 `ping` 命令,依据输出中的 `TTL=` 判断(各语言环境下 TTL 均不翻译,跨语言可靠)。 3. **ARP 补全**:探测结束后重新读取系统 ARP 表,为在线主机补全 MAC 与厂商——探测当时表里往往还没有新主机的记录。 4. **厂商识别**:MAC 前 3 字节(OUI)查内置厂商库,未收录时显示"未识别"。 ## API | 接口 | 说明 | |---|---| | `GET /` | 前端页面(嵌入二进制) | | `GET /api/interfaces` | 本机全部 IPv4 地址、掩码、网段、MAC、网卡类型 | | `GET /api/localnet` | 推荐的本机网段 + IP 列表 | | `GET /api/scan?cidr=&ports=&timeout=&concurrency=&ping=` | SSE 流式扫描;事件 `result` / `done` / `error` | ## 精度说明 - 已用对照测试验证:**不存在的网段(10.55.66.0/29)全部判为空闲,无误报**。 - 判定为"占用"的主机若 ARP 表中无 MAC,说明它可能不在同一二层网络(例如经路由器可达),MAC 会显示为空。 - 若主机**禁用 ICMP 且无开放端口**,任何扫描工具都无法发现它,这属于网络固有限制。 - 掩码长于 /24 的网卡(如 `/32` VPN 虚拟网卡),推荐网段会自动放宽到 `/24` 以便整段扫描;接口列表里仍显示真实掩码。 - OUI 厂商库内置常见设备(华为/华三/TP-Link/海康/大华/Apple/Intel/VMware 等),未识别属正常,可按需在 `scanner.go` 的 `ouiDB` 中补充。 ## 文件结构 ``` ipscan/ ├── main.go HTTP 服务、SSE 推送、端口避让、本机网段探测 ├── scanner.go CIDR 展开、TCP/ICMP 探测、ARP、OUI 厂商库、本机网卡枚举 ├── browser.go 调用系统默认浏览器(Windows 用 rundll32,不闪黑框) ├── exec_windows.go 隐藏子进程窗口(Windows) ├── exec_other.go 非 Windows 平台占位 ├── static/index.html 前端页面(网格 + 列表 + 统计 + 导出) └── go.mod ``` ## 实测 ``` 192.168.1.0/24(默认并发 20 + Ping)→ 254 个地址,55 在线,199 空闲,耗时 19.3s ``` 关闭 Ping 可显著提速(Ping 需为每个离线主机派生进程,是主要耗时项)。