一个不需要管理员权限的网络工具箱——心一网络助手 XinYiNetTool

本系列:把这两年用 Python 写的十几个小项目挨个开源、挨个说清楚。不讲”我做了什么”,讲”做的过程中被什么打脸、最后怎么想明白的”。 第 13 篇 · 心一网络助手 XinYiNetTool(上一篇:奥赛题库) 源码:github.com/ghostgorge/XinYiNetTool 纯 Python 标准库、零第三方依赖,单文件 exe、免安装、不需要管理员权限


一、一条约束牵动了整套技术选型

这个工具箱参考「千月网络助手」的产品骨架重做,但从第一行代码起就定了一条硬约束:

不要管理员权限。

理由很现实:一个每次都要右键”以管理员身份运行”的排障工具,在别人的电脑上就是用不起来——尤其是你去现场、用的是客户那台装了域策略的机器。

而这条约束,直接决定了后面一连串实现方式。

ICMP 用 IcmpSendEcho,不用原始套接字

Windows 上开原始 ICMP 套接字要管理员权限。Iphlpapi.dllIcmpSendEcho 普通用户可用。

而且它反过来更强:能直接设 TTL 和 DF 标志位——路由跟踪和路径 MTU 探测就靠这两样,纯 socket 反而做不到。

这是我很喜欢的一种情况:为了绕开权限限制换的方案,功能上比原方案还好。

ARP 探测用 SendARP

同样不要管理员。而且比 Ping 靠谱:

开了防火墙的 Windows 主机默认丢 ICMP,但它必须回 ARP——否则它自己也上不了网。

所以模块里做了明确分工:同网段点数用 ARP,跨网段探活用 Ping。 拿 Ping 扫同网段,会漏掉一大批开着防火墙的机器,而那正是你要找的那些。

二、另外三个”别去解析人类可读输出”的决定

不用 wmic

Win11 24H2 起 wmic 已从系统移除。

在新机器上,任何依赖 wmic 的信息采集都必然拿不到数据。所以能用 ctypes(kernel32 / iphlpapi)和注册表拿的都那么拿,只有硬盘型号序列号、CPU ID 这类非 WMI 不可的才走 PowerShell Get-CimInstance——并且放后台线程,因为它冷启动要两三秒,同步取会直接卡死界面。

不解析 ipconfig 的输出

那玩意儿的字段名随系统语言变。 中文版和英文版的正则不一样,这是典型的”在我机器上好好的”型缺陷——你自测一百遍都不会发现,直到某台英文系统的机器上整个网卡列表变成空白。

直接调 GetAdaptersAddresses

只要有 API,就不要去解析给人看的输出。 人类可读格式的稳定性从来没有被承诺过。

图标全是 Canvas 画的矢量,命令库存 .py 不存 .json

这两条都是为打包服务的:

  • 单文件 exe 里塞 png 要走 _MEIPASS 取路径,是打包出错的常见来源。而这几个图标用线段和圆弧就够了。
  • .py 会被 PyInstaller 自动收进去.json 得手工写 datas 和运行时路径——多一处会出错的地方。用户自己扩充的库才走外部 JSON。

三、比原版改了什么(挑几条讲透)

九条改动里,有几条背后是具体的排障场景。

掩码滑块要实时联动

原版拖滑块时,下面的网络地址 / 广播地址 / IP 范围几个框是空的,要点「计算」才出结果。

这个页面的全部价值恰恰就在于”边拖边看边界怎么变”——你想知道的是 /26/27 差在哪,而不是分别算两次再对比。

要点一次按钮才出结果,等于把这个页面变成了一个笨版计算器。

多 Ping 要有”翻转”列

丢包率相同的两条链路,通断切换次数多的那条才是真有问题。

同样是 5% 丢包:一条是均匀散落的随机丢包(可能只是链路质量一般),另一条是”通 30 秒、断 2 秒、再通 30 秒”(那是链路在翻转,可能是环路、可能是主备切换抖动)。丢包率这一个数字完全分不出它们。

配套的:响铃只在通断状态变化时响,不是每个包都响。不然挂着监控就是一场噪音酷刑。

路由汇总要同时给两个答案

精确汇总(可能是多条)和单条超网(一条,但会多包含一些地址),并且明确标出单条方案多包含了多少地址

因为那些多出来的地址如果落在别人的网段里,会把别人的流量吸过来——这是个真会出事故的地方,工具不能只给一个”看起来更简洁”的答案。

路径 MTU 探测

VPN / PPPoE / 隧道上”小包能通、网页打不开、大文件传一半卡死“,八成是 MTU 黑洞。

这个症状极具迷惑性:ping 通,说明网络是好的;但凡是稍大的包就无声无息地丢了,因为中间某一跳需要分片而 DF 位被置了、ICMP “需要分片”的报文又被防火墙吃掉了。

探完直接给出 tcp adjust-mss 该配多少。工具应该给出可以直接照着配的那个数字,而不是一堆需要再换算的中间量。

/31 按 RFC3021 算 2 个可用地址

不是 0。点到点互联现在普遍用 /31 省地址,还按老教科书算”减 2″的工具会给出反直觉的结果。

CGNAT 段单独识别(同一个坑,第二次)

没有照搬 ipaddress.is_private——Python 把运营商 CGNAT(100.64.0.0/10)也算私网,排障时会误导你以为那是内网来的流量。

这个坑我在烽燧那篇里已经写过一次。同一个标准库语义,在安全审计里会把攻击者洗白,在网络排障里会让你找错方向——它本身没错,错的是把它当成”是不是自己人”的判据。

端口串写错当场报错

不是扫完一无所获。1-1024,3389 写成 1—1024(中文破折号)这种事天天发生,扫描跑了三分钟然后告诉你”未发现开放端口”是最坏的反馈

四、135 项自测里,最值钱的是最后一组

自测分 11 组:地址掩码转换 / IP 信息 / 子网计算 / VLSM / 汇总与重叠 / 排序与范围 / 扫描参数 / MAC 识别 / 命令库 / Ping 统计 / 界面真构建

最后一组会把主窗口和全部 7 个页面真的建一遍

语法没错、导入也过,但某个页面 grid 写错、或者引用了一个不存在的属性——只有真构造才会暴露。 而这正是”打包后双击没反应”最常见的成因。

(没有显示器时自动跳过,不算失败。)

另外:自测里刻意不写墙钟时间断言——别人机器上慢一倍不代表功能坏了。这条是胶囊医生那次留下的疤:一条”集成测试要在 120 秒内跑完”的断言,在用户机器上跑出 171.9 秒,把整个构建卡死在了一个与正确性完全无关的地方。

五、七个模块

模块能干什么
Ping连续探测 + 延迟折线图(带时间轴,超时画成红色竖条)+ 十项统计 + 历史记录 + 通断变化响铃;可设包大小/间隔/超时/TTL/次数/DF 位
多Ping最多 64 个目标并发监控,各自独立计时;表内嵌迷你走势条;翻转列
IP计算8 个子页:IP信息(滑块实时联动)、子网计算、地址规划(VLSM)、路由汇总、路由重叠检查、排序去重、掩码转换、加前后缀
命令查询内置 131+ 条华为/思科命令,按厂商/设备类型/分类过滤,多关键字空格分隔 AND 检索
网络扫描ARP / Ping / 仅端口 三种模式,端口串 1-1024,3389,可反查主机名,线程数可调,出 MAC 厂商
电脑信息主机与域、操作系统、CPU 与内存、主板 BIOS、硬盘型号序列号、分区容量条、全部网卡(MAC/IPv4/IPv6/网关/MTU/速率)
工具箱路由跟踪、路径 MTU 探测、DNS 正反解析、端口速查+连通测试、MAC 厂商+ARP 查询、本机连接(netstat)、网络唤醒(WOL)

Ctrl+1 ~ Ctrl+7 切模块,F5 刷新当前页。

两个可选扩展文件放在 exe 同目录即可自动加载:oui.txt(扩充 MAC 厂商库,内置只收了网络设备/服务器/虚拟化/常见终端的常用前缀)、commands_user.json(扩充命令库,可以把本单位的配置规范塞进去)。

python main.py --selftest    # 135 项
双击 build.bat               # 出 XinYiNetTool.exe(窗口版)和 xinyi-cli.exe(控制台版)

exe 秒退怎么查:先跑 xinyi-cli.exe,控制台版会直接把 traceback 打出来。窗口版异常也会弹 MessageBox,不会静默消失。

六、已知限制(照实写)

  • ARP 只在同一个二层广播域内有效,跨网段查不到 MAC——这是协议决定的,不是 bug。
  • 网络唤醒发包成功只代表包送出去了,不代表对方会醒——UDP 没有回执。魔术包默认跨不了网段。
  • 反查主机名在没有 PTR 记录的内网里每台都要等 DNS 超时,默认关闭
  • 内置 OUI 库不全(完整 IEEE 库三万多条)。
  • 非 Windows 平台 ICMP 退回调用系统 ping 命令,功能受限。

尾巴

这个项目的方法论其实只有一条,但它贯穿了每一个技术决定:

先把约束定死,再选实现。

“不要管理员权限”这条定死之后,IcmpSendEchoSendARP 就是唯一解——而它们恰好比原本的方案更强。 “不解析给人看的输出”这条定死之后,wmic 被移除、ipconfig 字段名随语言变这两个雷就自动躲过去了。

排障工具的另一条:给出可以直接照着配的那个数字。 MTU 探测的价值不在于告诉你”路径 MTU 是 1400″,而在于直接说 tcp adjust-mss 配多少。

📦 源码https://github.com/ghostgorge/XinYiNetTool


系列到这里,最初那份清单写完了

十三篇,从游戏到工具。回头看,反复出现的其实就那么几条:

  • 先写求解器/验收器,再写内容。(离阵、方寸、回响回廊、纯粹数独)
  • 难度做在决策面上,不做在流程长度上。(离阵、方寸、纯粹数独)
  • 笨办法机器人要削信息,不要削能力。(回响回廊)
  • 不崩溃、不报错的 bug 最危险,必须有专门的测试守着。(弈局的 perft、立方之蛇的方向映射、核痕的排序不变量)
  • 筛子的顺序值十倍时间,便宜的排前面。(砂漏、弈局)
  • 标准库的语义是按 RFC 写的,不是按你的场景写的。(烽燧、心一)
  • 测试框架自己也要被怀疑;别写墙钟时间断言。(立方之蛇、胶囊医生)

下一篇写什么,看你想看哪个:糖泡堂 SugarBubble(QQ堂复刻,README 里有 8 个实机 bug 的根因表),或者一篇把上面这些教训单独展开的总结篇。回复告诉我就行。