本机图形化网络工具,技术栈为 Tauri 2 + React + Rust,可打包为 macOS 与 Windows 桌面应用。
面向个人和运维自用:扫描自己有权限的网络,发现局域网设备、探测指定 IP 的端口、经跳板建立 SSH 本地转发。不做 Linux 安装包,不捆绑 nmap,不采用 Electron 或 Flutter。
界面以 NetScanTools_UI_Prototype.md 为准,实现以 开发设计书.md 为准;与代码不一致时以代码为准。
请只在自己有权限的网络上使用。
四个入口共用同一个桌面壳。
手动指定网段,列出在线设备。支持 CIDR(如 192.168.1.0/24)或起止 IP。可看进度、可中途取消。
在线判断固定用 ICMP Ping。关 ICMP 的设备不会出现在列表里;端口开没开请用「端口扫描」。
同网段在 ping 通后再读本机 ARP 表拿 MAC,并用 MAC 前缀对照厂商库。主机名按顺序尝试:反向 DNS → ARP 缓存里的名字 → 局域网组播 DNS(mDNS,如 .local)。很多摄像头、电视仍可能没有名字。
换网络后点「刷新网卡」,顶栏 IP 和扫描网段会跟上当前网卡。结果表可点 IP / MAC 复制,也可「复制结果」或「导出」成表格文件。
对单个 IP 做 TCP 全连接探测,不限局域网。预设:常用端口、1–1024、1–65535,或自定义。
结果区分开放、关闭、超时,三种状态都会进表,可按状态筛选(默认看开放)。关闭是对端拒绝连接;防火墙丢包通常记为超时。开放端口会读前若干字节作横幅:SSH、HTTP 等文本协议直接显示;MySQL 等二进制握手只抽出可读 ASCII(例如版本号)。扫描 1–65535 时行数很多,页面可能较慢。当前筛选结果可复制或导出。
对应:
ssh -NfL 9999:192.168.100.50:8080 root@jump.example.com -p 2222图形表单填写本地端口、目标主机与端口、跳板地址/端口/用户。认证支持密码和私钥。自己实现 SSH 协议,不调用系统 ssh。一期只做本地转发(-L),可多条、可启停;密码不写进磁盘。
在本机选定网卡 IP 上监听入口端口,把进来的 TCP 连接转到目标 IP 和端口。类似 socat,不经过 SSH、不加密。
入口可选:本机回环 127.0.0.1、某块局域网网卡、或 0.0.0.0(全部网卡)。可同时开多条,能看当前连接数并启停。
SSH 隧道和本机端口映射不是同一件事:前者经跳板加密转发,后者是本机明文转发。
界面是 React,本机能力在 Rust 里,两边用 Tauri 命令和事件通信。扫描引擎自研,不捆绑 nmap,也不调用系统 ssh。
| 环节 | 做法 |
|---|---|
| 网段 | 用 ipnetwork 解析 CIDR,或把起止 IPv4 展开成地址列表 |
| 调度 | Tokio 多任务并发探测,可取消 |
| 是否在线 | 调用系统 ping 发 1 个探测包(macOS/Linux:ping -c 1,Windows:ping -n 1)。不自己发 ICMP 原始套接字,普通权限即可 |
| MAC | 扫描前读本机 arp -a;ping 通后再按 IP 查一次 ARP |
| 厂商 | 用 MAC 前 3 段对照内置 OUI 表(常见厂商;未知则显示 Unknown) |
| 主机名 | 先反向 DNS(dns-lookup),再 ARP 缓存里的名字,再向 224.0.0.251:5353 发 mDNS PTR 查询 |
| 上报 | Rust 推 scan:host / scan:progress,界面填表 |
关 ICMP 的设备不会进列表。跨网段通常没有 ARP,因此没有 MAC。
| 环节 | 做法 |
|---|---|
| 探测 | TCP 全连接:TcpStream::connect_timeout。不是 SYN 半开扫描,不需要管理员权限 |
| 状态 | 连上为开放;连接超时为超时;被拒绝等其它错误为关闭 |
| 横幅 | 开放后再连一次,最多读 256 字节。HTTP 常见端口会先发 HEAD;二进制握手只抽出连续可读 ASCII(例如 MySQL 版本号) |
| 服务名 | 常见端口号对照表(22→SSH、3306→MySQL 等) |
| 上报 | Rust 推 scan:port,界面按开放/关闭/超时筛选;可复制或导出当前表 |
| 环节 | 做法 |
|---|---|
| 协议 | 用 Rust 库 russh 当 SSH 客户端,不调用系统 ssh |
| 认证 | 密码(只在内存里用一次,不写磁盘)或 OpenSSH 私钥文件 |
| 主机密钥 | 校验并记在应用数据目录的 known_hosts.json |
| 转发 | 本机 127.0.0.1:本地端口 监听;有连接后走 SSH direct-tcpip 转到目标主机:端口,双向拷贝数据 |
| 配置 | 隧道列表存在 tunnels.json,不含密码 |
| 环节 | 做法 |
|---|---|
| 监听 | 本机 TcpListener 绑在所选 IP:入口端口 |
| 转发 | 每个进来的连接再 TcpStream 连目标,双向拷贝字节,不加密、不经 SSH |
| 连接数 | 运行中统计当前已建立的转发条数 |
| 配置 | 存在 forwards.json |
| 功能 | 做法 |
|---|---|
| 网卡列表 | if-addrs 读取本机 IPv4 地址和掩码,算出建议网段 |
| 设置 | JSON 文件,存在系统应用数据目录 |
| 关于页 | 用系统命令打开作者网站(macOS open,Windows start) |
- Node.js(建议当前 LTS)
- Rust(
rustup默认工具链) - macOS: Xcode 命令行工具(
xcode-select --install) - Windows: Visual Studio Build Tools,勾选「使用 C++ 的桌面开发」
npm install
npm run tauri dev配置里会打出 macOS .dmg 和 Windows NSIS 安装程序(*-setup.exe)。在哪个系统上打包,就打哪个系统的安装包;macOS 不能直接打出可靠的 Windows 安装包(交叉编译仅作备选)。
先安装依赖:
npm installnpm run tauri build -- --target aarch64-apple-darwin产物:src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/
rustup target add x86_64-apple-darwin
npm run tauri build -- --target x86_64-apple-darwin产物:src-tauri/target/x86_64-apple-darwin/release/bundle/dmg/
体积大约是单架构的两倍:
rustup target add aarch64-apple-darwin x86_64-apple-darwin
npm run tauri build -- --target universal-apple-darwin产物:src-tauri/target/universal-apple-darwin/release/bundle/dmg/
在 Windows 上:
npm run tauri build产物:src-tauri/target/release/bundle/nsis/
没有 Windows 机器时,可在 macOS 上交叉编译 NSIS 包(官方当备选,不能签名):
brew install nsis llvm
export PATH="/opt/homebrew/opt/llvm/bin:$PATH"
rustup target add x86_64-pc-windows-msvc
cargo install --locked cargo-xwin
npm run tauri build -- --runner cargo-xwin --target x86_64-pc-windows-msvc产物:src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/
发给别人之前:macOS 未公证会提示无法验证开发者,需要 Apple 开发者账号做签名和公证。Windows 未签名时 SmartScreen / 杀毒软件可能拦截。
| 层 | 技术 | 职责 |
|---|---|---|
| 界面 | Tauri 2 + React | 功能页、进度、结果表、表单 |
| 本机 | Rust(src-tauri) |
主机发现、端口探测、SSH 隧道、本地存储 |
| 通信 | Tauri IPC | 界面发「开始 / 取消」,Rust 推送进度和结果 |
| 打包 | Tauri 2 | macOS .dmg / .app,Windows NSIS setup.exe |
src/ React 界面
src-tauri/ Rust 本机层
src/
lib.rs Tauri 入口与 IPC 注册
scanner.rs 局域网扫描、端口扫描、主机名
ssh.rs SSH 本地转发
forward.rs 本机端口映射
nic.rs 网卡列表
store.rs 设置与隧道配置
不把 nmap 打进安装包。SSH 不调用系统 ssh。密码不落盘。
| 信息 | 典型来源 | 说明 |
|---|---|---|
| 是否在线 | ICMP Ping | 关 ping 的设备会漏 |
| IP / 主机名 | 反向 DNS、ARP 名称、mDNS | 看设备是否报名字 |
| MAC / 网卡厂商 | 同网段 ARP + 厂商库 | 跨网段没有 MAC |
| 开放端口与服务横幅 | TCP 连接 + 可读 ASCII | 全连接,不需要管理员权限 |
跨网段拿不到 MAC。IPv6 不做。UPnP / SNMP 型号、扫描历史存档、钥匙串存密码等见后续计划。
- UPnP / SNMP 等型号信息
- 扫描历史(多次扫描存档,而不只是导出当前表)
- 系统钥匙串存 SSH 密码
- SSH
-R/-D、断线重连
- macOS: 不要开 App Store 沙盒,否则局域网探测会被挡住。监听 1024 以下端口通常需要提权。
- Windows: 首次运行可能弹出防火墙询问。部分杀毒软件会把端口扫描报成风险软件。
- 工具有并发上限,扫描可取消,避免把网扫死。
符元学 · 更多开源产品
本软件仅供个人学习、网络运维,以及在已获授权的网络中进行检测。切勿用于网络攻击、未经授权的扫描、入侵、窃取数据或其他违法违规行为。因使用或滥用造成的后果由使用者自行承担,作者不承担法律责任。