查看: 154|回复: 3

Python全栈网络监控工具:FastAPI+Vue3实现设备探测与离线

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在企业内网、校园网络或小型机房中,管理员常需实时掌握服务器、网关等设备的在线状态与延迟。本文实现一个基于Python的全栈网络监控工具,后端使用FastAPI + SQLAlchemy + SQLite,前端采用Vue 3 + Vite,具备用户认证、设备CRUD、ICMP/TCP探测、指标记录和告警处理功能。项目结构完整,可作为运维监控平台的基础版本。

技术栈
后端:FastAPI、SQLAlchemy、Pydantic、SQLite
前端:Vue 3、Vite、Fetch API、组件化开发
认证:PBKDF2密码哈希、Bearer Token、Token吊销
网络探测:优先ICMP Ping,失败时回退TCP 80端口

数据库模型设计
使用SQLite,核心表包括:
- users:用户表,字段username、email、hashed_password
- access_tokens:登录令牌表,字段token、user_id、revoked
- devices:监控设备表,字段name、ip_address、last_status、owner_id
- metrics:检测指标表,字段device_id、status、latency_ms、checked_at
- alerts:告警表,字段device_id、level、message、resolved

User与Device为一对多关系,Device与Metric、Alert也是一对多,实现用户数据隔离。

核心模型示例(SQLAlchemy ORM):
  1. from sqlalchemy import Column, Integer, String, Text, Boolean, Float, DateTime, ForeignKey
  2. from sqlalchemy.ext.declarative import declarative_base
  3. Base = declarative_base()
  4. class Device(Base):
  5.     __tablename__ = "devices"
  6.     id = Column(Integer, primary_key=True, index=True)
  7.     name = Column(String(80), nullable=False)
  8.     ip_address = Column(String(64), nullable=False)
  9.     description = Column(Text, default="")
  10.     check_interval = Column(Integer, default=60)
  11.     is_active = Column(Boolean, default=True)
  12.     last_status = Column(String(20), default="unknown")
  13.     last_latency_ms = Column(Float, nullable=True)
  14.     last_checked_at = Column(DateTime, nullable=True)
  15.     owner_id = Column(Integer, ForeignKey("users.id"), nullable=False)
复制代码

后端API设计
所有接口以/api开头,注册、登录、健康检查无需认证,其他接口需携带Bearer Token。关键接口:
- GET /api/health
- POST /api/auth/register
- POST /api/auth/login
- POST /api/auth/logout(需登录)
- GET /api/users/me(需登录)
- GET /api/dashboard(需登录)
- GET/POST /api/devices(需登录)
- PUT/DELETE /api/devices/{device_id}(需登录)
- POST /api/devices/{device_id}/check(需登录)
- GET /api/devices/{device_id}/metrics(需登录)
- GET /api/alerts(需登录)
- POST /api/alerts/{alert_id}/resolve(需登录)

认证依赖通过FastAPI Depends实现,自动从请求头解析Authorization: Bearer <token>,无效或吊销时返回401。

核心代码解析
1. 密码哈希与Token生成
不存储明文密码,使用PBKDF2加盐哈希:
  1. import os
  2. import hashlib
  3. def hash_password(password: str) -> str:
  4.     salt = os.urandom(16).hex()
  5.     digest = hashlib.pbkdf2_hmac("sha256", password.encode(), salt.encode(), 120_000).hex()
  6.     return f"pbkdf2_sha256$120000${salt}${digest}"
复制代码
登录成功后生成随机Token写入access_tokens表,退出时将Token标记为revoked=True。

2. 受保护接口的依赖注入
FastAPI依赖从Token中获取当前用户:
  1. def get_current_user(token: str = Depends(extract_token), db: Session = Depends(get_db)):
  2.     user = crud.get_user_by_token(db, token)
  3.     if not user:
  4.         raise HTTPException(status_code=401, detail="Token 无效或已过期")
  5.     return user
复制代码
接口只需添加current_user: models.User = Depends(get_current_user)即可鉴权。

3. 网络检测逻辑
检测设备时优先执行ICMP Ping,失败后尝试TCP 80端口探测:
  1. import subprocess
  2. def probe_device(ip_address: str):
  3.     # ICMP Ping,超时2秒
  4.     result = subprocess.run(["ping", "-c", "1", "-W", "2", ip_address], capture_output=True, timeout=3)
  5.     if result.returncode == 0:
  6.         # 解析延迟(需要从输出提取,此处省略细节)
  7.         return ("online", latency, "ICMP Ping 成功")
  8.     # 失败后TCP探测
  9.     ok, latency, message = _tcp_probe(ip_address)  # 尝试连接TCP 80
  10.     return ("online", latency, message) if ok else ("offline", None, message)
复制代码
检测完成后更新设备状态,写入metrics表;设备离线时自动生成critical级别告警。

4. 前端鉴权请求封装
前端src/api.js统一管理API调用,自动携带Token:
  1. async function request(path, options = {}) {
  2.     const headers = { 'Content-Type': 'application/json', ...(options.headers || {}) }
  3.     const token = getToken()
  4.     if (token) headers.Authorization = `Bearer ${token}`
  5.     const response = await fetch(`${API_BASE}${path}`, { ...options, headers })
  6.     if (!response.ok) throw new Error('请求失败')
  7.     return response.json()
  8. }
复制代码
所有业务接口通过request调用,无需重复处理认证。

部署与运行
后端启动(假设项目目录为project/):
  1. cd backend
  2. python3 -m venv .venv
  3. source .venv/bin/activate
  4. pip install -r requirements.txt
  5. uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
复制代码
前端启动:
  1. cd frontend
  2. npm install
  3. npm run dev
复制代码
使用流程:打开前端页面注册登录 → 添加设备(如8.8.8.8) → 点击“立即检测”查看状态 → 在告警中心处理离线告警。

可扩展方向:定时巡检、邮件/企业微信告警、SNMP采集、Prometheus指标导出、Grafana可视化等。该项目适合学习Python全栈开发、FastAPI接口设计、Vue 3前端交互及运维监控系统原型设计。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python全栈网络监控工具:FastAPI+Vue3实现设备探测与离线

这个项目结构很完整,从数据库设计到前后端交互都考虑得比较周到,作为运维监控的基础版确实够用了。ICMP优先+TCP回退的思路也很实用,很多环境里ICMP会被防火墙拦截,TCP 80做兜底能提高可用性。 有一点想请教:在生产环境下,ICMP ping可能需要root权限,这个脚本在低权限用户下运行会直接跳过还是返回异常?另外TCP探测的端口如果能做成可配置的(比如新增字段),对不同场景会更灵活。整体来说很值得参考,收藏了。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python全栈网络监控工具:FastAPI+Vue3实现设备探测与离线

感谢分享这么完整的技术实现方案!整个项目结构清晰,从后端FastAPI到前端Vue3的链路很完整,尤其是PBKDF2密码哈希和Token吊销机制体现了安全性方面的考虑。想请教一下,ICMP探测部分在跨平台(比如Windows和Linux)运行时,ping命令的参数差异是否有做适配处理?另外,异步后台定时检测任务(比如后台巡检所有活跃设备)目前是采用什么方式实现的呢?期待后续的继续分享。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python全栈网络监控工具:FastAPI+Vue3实现设备探测与离线

感谢分享,这套架构很清晰,FastAPI + Vue 3 的组合也很现代。代码里优先 ICMP 再回退 TCP 的探测策略挺实用的,能覆盖常见网络环境。有个问题想请教一下:如果监控设备数量较多(比如上千台),SQLite 在高并发写入大量检测指标时性能表现如何?有没有考虑过替换为 PostgreSQL 或者做批处理写入?另外告警部分目前只是入库标记,未来是否有计划集成邮件/钉钉/Webhook 之类的通知方式?期待后续的持续更新。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-10 11:06 , Processed in 0.029746 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部