版本:v3.0 | 协议:MIT License
一个面向 IT 运维人员的轻量网络诊断工具,支持 PC 端网页访问与 Android APK 安装使用两种形态,后端为 Python Flask,前端为原生 HTML/CSS/JS(无框架依赖),移动端通过 Apache Cordova 打包。
- Ping 检测 - ICMP 连通性测试,返回丢包率与最小/平均/最大延迟
- 路由跟踪 - Traceroute 路径追踪,SSE 流式逐跳实时输出
- MTR 诊断 - 网络质量综合分析(丢包率、平均/最好/最差延迟、标准差)
- DNS 查询 - 域名解析检测,支持自定义 DNS 服务器与 8 种记录类型(A/AAAA/NS/MX/TXT/CNAME/SOA/PTR)
- 端口扫描 - TCP 端口状态检测,支持范围扫描(如
1-1000)与服务名识别 - HTTP 检测 - 网站可达性测试,返回状态码与响应时间
- 批量检测 - 多主机批量 Ping,一次最多 100 台主机
- Whois 查询 - 域名注册信息(终端本地 RDAP 优先,失败降级服务器 whois)
- TCP Ping - 前端本地 fetch 测量 TCP 连通延迟,多轮统计 min/avg/max
- CIDR 计算器 - 纯前端子网计算(网络/广播地址、掩码、可用主机数、私网判断)
- SSL 证书 - 证书主体、签发机构、有效期、剩余天数、SAN(后端 openssl)
- 本机信息 - 公网 IP、运营商、User Agent、屏幕分辨率、设备像素比
- 双源标识 - 所有接口区分「服务器视角」与「终端本地」源,结果首行显示源 IP 或「本地」
- 检测历史 - 本地存储最近 20 条检测记录
- 任务可中止 - 每个 Tab 均支持「开始 / 停止」按钮,基于
AbortController取消请求 - 安全防护 - 请求限流、并发限制、域名白名单
| 层 | 技术 | 说明 |
|---|---|---|
| 后端 | Python 3.8+ / Flask | 单文件 server.py,集成限流、并发控制、SSE |
| 依赖 | flask-cors、requests | 跨域与 HTTP 探测 |
| PC 前端 | 原生 HTML/CSS/JS | 单文件 index.html,PWA 可安装 |
| 移动端 | Apache Cordova 12+ / cordova-android 15 | 打包为 Android APK |
| Android | minSdk 22 / targetSdk 36 | 允许明文流量以兼容自建 HTTP 后端 |
network-tool/
├── server.py # Python Flask 后端服务(API + 静态托管)
├── index.html # PC 端前端页面(含全部样式与脚本)
├── manifest.json # PWA 配置(PC 端可安装)
├── network-tool-app/ # Cordova 移动端项目
│ ├── config.xml # Cordova 应用配置(权限、SDK 版本、状态栏等)
│ ├── package.json # Node.js 依赖(cordova-android)
│ ├── network_security_config.xml → res/xml/
│ ├── www/ # 移动端前端源码(打包进 APK)
│ │ ├── index.html # 与 PC 端基本一致的前端页面
│ │ ├── manifest.json # PWA 配置
│ │ ├── css/index.css # Cordova 默认样式(实际未启用)
│ │ ├── js/index.js # Cordova deviceready 钩子
│ │ └── img/logo.png # 应用图标
│ ├── res/xml/ # 网络安全配置(允许明文流量到 localhost / tencent.markli.cn)
│ └── platforms/android/ # Android 平台代码(构建后生成)
└── docs/ # 文档目录
├── BUILD.md # APK 构建与签名说明
└── DEPLOY.md # 部署、迁移、Nginx、systemd、Docker 说明
- 接口:
POST /api/ping - 描述: ICMP Ping连通性检测
- 参数:
{ "host": "baidu.com", // 目标主机(域名或IP) "count": 4, // 发送包数量 "timeout": 10 // 超时时间(秒) } - 响应:
{ "success": true, "ip": "220.181.38.148", "packets_sent": 4, "packets_received": 4, "packet_loss": 0, "min_rtt": 12.5, "avg_rtt": 15.2, "max_rtt": 18.3 }
- 接口:
POST /api/dns - 描述: DNS域名解析查询
- 参数:
{ "domain": "google.com", // 域名 "dns_server": "114.114.114.114", // DNS服务器(纯 IP 走后端;DoH 地址如 https://223.5.5.5/resolve 由终端本地解析) "type": "A" // 记录类型:A/AAAA/NS/MX/TXT/CNAME/SOA/PTR } - 响应:
{ "success": true, "domain": "google.com", "type": "A", "records": ["142.250.190.78"], "source": "server", // 后端解析时为 server "source_ip": "172.18.0.1" // 执行解析的服务器 IP(DoH 本地解析时不返回此字段,前端显示「源:本机」) } - 双源说明: 若
dns_server以https://开头,前端直接 fetch DoH JSON 接口(终端本地解析,5 秒超时);纯 IP 地址则调后端/api/dns。前端 badge 会根据选中 DNS 服务器动态切换「终端本地」/「服务器」标签。
- 接口:
POST /api/traceroute - 描述: Traceroute路由路径跟踪(Server-Sent Events流式输出)
- 参数:
{ "host": "baidu.com", "max_hops": 30, // 最大跳数 "timeout": 30 // 超时时间(秒) } - 响应: SSE事件流
start- 开始事件hop- 每跳数据{hop, ip, hostname, rtt}done- 完成事件
- 接口:
POST /api/mtr - 描述: MTR(My Traceroute)网络质量诊断
- 参数:
{ "host": "baidu.com", "count": 10, // 检测次数 "timeout": 60 // 超时时间(秒) } - 响应:
{ "success": true, "host": "baidu.com", "count": 10, "total_hops": 12, "hops": [ { "hop": 1, "ip": "192.168.1.1", "hostname": "gateway", "sent": 10, "lost": 0, "lost_percent": 0, "avg": 2.5, "best": 1.2, "worst": 5.3, "stdev": 1.1 } ] }
- 接口:
POST /api/port - 描述: TCP端口状态检测
- 参数:
{ "host": "baidu.com", "port": 80, // 端口号(1-65535) "timeout": 5 // 超时时间(秒) } - 响应:
{ "success": true, "host": "baidu.com", "port": 80, "open": true, "latency_ms": 15.5 }
- 接口:
POST /api/http - 描述: HTTP/HTTPS网站可达性检测
- 参数:
{ "url": "https://www.baidu.com", "timeout": 10 // 超时时间(秒) } - 响应:
{ "success": true, "url": "https://www.baidu.com", "status_code": 200, "latency_ms": 156.3, "final_url": "https://www.baidu.com/" }
- 接口:
POST /api/batch_ping - 描述: 批量主机连通性检测
- 参数:
{ "hosts": ["baidu.com", "google.com", "github.com"], "count": 2, // 每个主机发送包数量 "timeout": 5 // 超时时间(秒) } - 响应:
{ "success": true, "total": 3, "online": 2, "results": [...] }
- 接口:
GET /api/ip - 描述: 获取公网IP和运营商信息
- 参数: 无
- 响应:
{ "success": true, "ip": "123.45.67.89", "country": "中国", "region": "广东省", "city": "深圳市", "isp": "中国电信" }
- 接口:
POST /api/whois - 描述: 域名注册信息查询(前端优先走终端本地 RDAP
https://rdap.org/domain/<host>,失败或输入 IP 时降级调后端 whois) - 参数:
{ "host": "baidu.com" } - 响应:
{ "success": true, "host": "baidu.com", "registrar": "MarkMonitor Inc.", "creation_date": "1999-10-11", "expiry_date": "2026-10-11", "status": "ok", "source": "server", "source_ip": "172.18.0.1" } - 降级: 服务器需安装
whois命令;前端 RDAP 走终端本地,不消耗后端资源
- 接口:
POST /api/cert - 描述: SSL 证书信息查询(后端 openssl 获取,服务器视角)
- 参数:
{ "host": "baidu.com", "port": 443 // 默认 443 } - 响应:
{ "success": true, "host": "baidu.com", "port": 443, "subject": "C=CN, ST=...", "issuer": "C=US, O=DigiCert...", "not_before": "Mar 3 00:00:00 2024 GMT", "not_after": "Mar 3 23:59:59 2027 GMT", "san": "DNS:baidu.com, DNS:www.baidu.com", "days_left": 189, "source": "server", "source_ip": "172.18.0.1" } - 依赖: 服务器需安装
openssl(与bash用于管道)
- 接口:
GET /health - 描述: 服务健康状态检查
- 响应:
{"status": "ok", "version": "2.0"}
官方镜像已发布到 Docker Hub,拉取即可运行(内部已内置 pip 依赖与所有系统命令工具):
# 拉取镜像并启动(默认监听 0.0.0.0:8080)
docker run -d --name network-tool --restart unless-stopped -p 8080:8080 jacknotes/network-tool:v3.0.0启动成功后浏览器访问:
本机访问: http://localhost:8080
手机访问: http://192.168.x.x:8080
如需用 docker compose,可参考 docs/DEPLOY.md 中的示例配置。
# 1. 安装依赖
pip install flask flask-cors requests
# 2. (可选)系统工具,提供原生 ping/traceroute/mtr/dig/whois/openssl 能力
# Ubuntu/Debian
sudo apt install mtr traceroute iputils-ping dnsutils whois openssl
# CentOS/RHEL
sudo yum install mtr traceroute iputils bind-utils whois openssl
# 3. 启动服务(默认监听 0.0.0.0:8080)
python3 server.py启动成功后终端会打印本机与局域网访问地址:
本机访问: http://localhost:8080
手机访问: http://192.168.x.x:8080
⚠️ Linux 上 MTR / Traceroute 需要mtr、traceroute系统命令,未安装时对应接口会回退到 Python 原生实现或返回错误。
- 启动后端服务(见上)
- 浏览器访问:
- 本机:
http://localhost:8080 - 局域网:
http://服务器IP:8080
- 本机:
- 可作为 PWA 安装(
manifest.json已配置)
- 安装 APK 文件到手机(构建方法见
docs/BUILD.md) - 打开应用,点击右上角 ⚙️ 图标
- 配置 API 服务器地址:
- 局域网:
http://服务器IP:8080 - 公网/Nginx:
https://your-domain.com/networks
- 局域网:
- 保存后自动检测协议(优先 HTTPS,不可用时回退 HTTP)
前端 getApiBase() 会自动判断运行环境:
- PC 网页:取当前页面
origin + pathname前缀,例如部署到https://tencent.markli.cn/network/时自动以https://tencent.markli.cn/network作为 API 基址 - APK(file 协议):使用用户配置的
localStorage['apiServer'],未配置时回退到内置默认地址 - 健康检查:设置服务器时会调用
/health探测协议可用性
- 纯 HTML / CSS / JavaScript,无框架依赖
- 单文件
index.html(约 2055 行),样式与脚本内联 - 响应式布局,深色主题,触摸优化
- 快速操作区 - 12 个功能入口按钮,按测试源分组:服务器视角(Ping / 批量 / 路由 / MTR / 端口 / DNS / 证书 / Whois)、终端本地(TCP / HTTP / 本机 / CIDR)
- 标签页切换 - 每个功能均为独立标签页,可实时切换(Ping / 批量 / 路由 / MTR / 端口 / DNS / 证书 / Whois / TCP / HTTP / 本机 / CIDR)
- 结果展示 - 等宽字体,支持
success/error/info/warning四种样式 - 任务控制 - 每个功能 Tab 配备「开始 / 停止」按钮,基于
AbortController取消 - 历史记录 -
localStorage存储最近 20 条检测记录,可清空 - API 设置 - ⚙️ 图标,支持自动协议探测
- 响应式布局
- 触摸优化(
-webkit-tap-highlight-color: transparent) - 深色主题(
#1a1a2e渐变背景)
| 特性 | 配置项 | 默认值 | 说明 |
|---|---|---|---|
| 请求限流 | RATE_LIMIT_REQUESTS / RATE_LIMIT_WINDOW |
30 次 / 60 秒 | 每 IP 独立计数,超限返回 429 |
| 并发限制 | MAX_CONCURRENT_TASKS |
5 | 信号量控制,超限返回 503 |
| 域名白名单 | DOMAIN_WHITELIST |
[](不限制) |
支持通配符 *.example.com |
| 主机校验 | validate_host() |
正则 ^[a-zA-Z0-9._-]+$ |
防止命令注入 |
| 端口校验 | port_check() |
1-65535 | 拒绝非法端口 |
| 批量上限 | batch_ping() |
100 台主机 | 防止滥用 |
| 端口扫描上限 | 前端 parsePorts() |
1000 个 | 防止大范围扫描 |
配置位置:
server.py顶部安全配置区块。
- Python 3.8+
- Flask
- flask-cors
- requests
- 系统命令(可选但推荐):
ping、traceroute/tracert、mtr、dig/nslookup
- Node.js 16+
- Cordova CLI 12+
- cordova-android 15+(
package.json已锁定) - JDK 11+(推荐 17)
- Android SDK API 34+ / build-tools 34.0.0
- Gradle 8.x(Cordova 自动管理)
详见 docs/BUILD.md。
# 健康检查
curl http://localhost:8080/health
# 预期: {"status":"ok","version":"2.0"}
# 测试 Ping 接口
curl -X POST http://localhost:8080/api/ping \
-H "Content-Type: application/json" \
-d '{"host": "baidu.com", "count": 2}'
# 测试 IP 信息接口
curl http://localhost:8080/api/ip| 文档 | 说明 |
|---|---|
| docs/BUILD.md | APK 构建环境、构建命令、签名、常见问题 |
| docs/DEPLOY.md | 后端部署、systemd、Nginx 反代、Docker、迁移、防火墙 |
| AGENTS.md | 面向 AI 编程代理的项目指令文件(构建/测试/约定) |
MIT License
