一个实用的 IP 监控系统:基于 Flask 的网络设备在线状态可视化工具

49 阅读13分钟

一个实用的 IP 监控系统:基于 Flask 的网络设备在线状态可视化工具

基于 Flask 的 IP 监控系统,自动扫描并统计 IP 使用情况,通过热力图可视化展示,帮助管理员快速了解 IP 使用频率,避免冲突。项目已开源,欢迎 Star!

前言

最近,我们坊在 IP 地址管理上遇到了一个很头疼的问题。

在我们的网络环境中,所有设备接入网络都需要手动配置 IP 地址。每当有新设备需要接入网络时,我们总是面临这样的困扰:

  • 不知道哪些 IP 可用:只能凭经验猜测,或者一个个尝试,效率很低
  • 经常遇到 IP 冲突:好不容易配置好了,却发现 IP 已经被占用,又要重新配置
  • 无法了解 IP 使用情况:不知道哪些 IP 经常使用,哪些很少使用,分配时完全没有数据支持

最让人头疼的是,当有多个新设备需要同时接入时,我们往往需要花费大量时间去测试和排查 IP 冲突问题,严重影响了工作效率。

为了解决这个问题,我们决定开发一个 IP 监控系统,通过持续监控和统计 IP 地址的使用情况,帮助我们做出更明智的 IP 分配决策。于是,AiWorkShop IP 监控系统应运而生。

经过一段时间的开发和实际使用,这个系统已经稳定运行,并且我们已经将其开源,希望能帮助到有类似需求的朋友。项目已开源在 Gitee 上,欢迎大家 Star 和贡献代码!

项目背景

在我们的网络环境中,IP 地址段是 10.0.48.151-250,其中有一部分 IP(我们称之为"坊内 IP")是我们需要重点管理和监控的。当有新设备需要接入网络时,我们希望能够:

  • 了解 IP 使用频率:通过热力图直观显示哪些 IP 经常使用,哪些很少使用
  • 选择可用 IP:优先选择使用频率低的 IP 地址分配给新设备
  • 避免 IP 冲突:通过历史数据判断 IP 的可用性,减少配置冲突
  • 优化 IP 管理:基于数据驱动的 IP 地址分配策略

本项目通过持续监控和统计 IP 地址的使用情况,完美解决了这些问题。现在,我们可以通过可视化的方式,一目了然地看到每个 IP 的使用情况,再也不用盲目猜测了。

项目介绍

AiWorkShop IP 监控系统是一个基于 Flask 的网络 IP 监控系统,用于实时监控和统计指定 IP 范围的在线状态,并提供可视化的 Web 界面展示。

本项目已完全开源,代码托管在 Gitee 上,地址:gitee.com/zheng-enci0…

如果你也遇到了类似的 IP 管理问题,欢迎使用本项目,也欢迎提出改进建议和贡献代码!

核心功能特性

  • 🔍 自动网络扫描:每 60 秒自动扫描指定 IP 范围(10.0.48.151-250)
  • 📊 IP 统计可视化:通过热力图展示 IP 出现次数统计
  • 🎨 交互式颜色筛选:点击颜色横条可筛选特定次数范围的 IP,高亮显示匹配项
  • 🏠 坊内 IP 识别:自动区分坊内 IP 和非坊内 IP,并使用不同样式显示
  • 📈 历史数据统计:统计最近 7 天的扫描次数
  • 🔄 自动数据刷新:页面每分钟自动刷新,无需手动操作
  • 💻 美观的 Web 界面:响应式设计,现代化 UI

技术栈

  • 后端框架:Flask 3.1.2
  • 定时任务:APScheduler 3.11.1
  • 并发处理:Python threading(多线程并发扫描)
  • 前端技术:HTML + CSS + JavaScript(原生,无需额外框架)
  • 数据存储:文本文件(activate_ip.txt)

功能演示

主要功能点

  1. 实时监控

    • 系统每 60 秒自动扫描一次网络
    • 使用多线程并发 ping,提高扫描效率
    • 自动清除 ARP 缓存,确保扫描结果准确
  2. 数据统计

    • 统计每个 IP 的出现次数
    • 计算最近 7 天的扫描次数
    • 支持历史数据查询和分析
  3. 可视化展示

    • 热力图显示 IP 使用频率(颜色越深表示使用越频繁)
    • 交互式颜色筛选器,可按使用频率筛选 IP
    • 区分显示坊内 IP 和非坊内 IP
  4. 自动刷新

    • 页面每分钟自动刷新,获取最新数据
    • 无需手动操作,实时查看监控结果

基本原理

为了更好地理解和使用本项目,这里简要说明一下系统的工作原理:

1. 网络扫描机制

系统通过以下步骤完成一次网络扫描:

  1. 清除 ARP 缓存:执行 arp -d 命令清除系统 ARP 缓存表,确保获取最新的网络状态
  2. 并发 Ping 扫描:使用多线程并发 ping 所有需要监控的 IP 地址(坊内 IP)
  3. 读取 ARP 表:ping 操作后,系统会更新 ARP 表,通过 arp -a 命令读取当前活跃的 IP 地址
  4. 数据记录:将扫描时间戳和检测到的活跃 IP 地址写入 activate_ip.txt 文件

2. 数据存储格式

每次扫描的结果以一行文本的形式存储:

时间戳 IP1 IP2 IP3 ...

例如:

1704067200.123 10.0.48.153 10.0.48.155 10.0.48.160

3. 统计与分析

  • IP 出现次数统计:遍历所有历史记录,统计每个 IP 地址出现的总次数
  • 时间范围统计:根据时间戳筛选最近 7 天的扫描记录
  • 数据可视化:将 IP 出现次数映射为颜色深度,生成热力图

4. 定时任务

系统启动时会在后台线程中启动定时扫描任务:

  • 立即执行一次扫描
  • 然后每隔配置的间隔时间(默认 60 秒)自动执行一次扫描
  • 扫描过程不会阻塞 Web 服务,可以同时处理用户请求

5. Web 界面展示

  • Flask 提供 Web 服务,处理用户请求
  • 每次请求时重新加载数据文件,确保显示最新统计结果
  • 前端通过颜色映射算法将 IP 出现次数转换为可视化热力图
  • 支持交互式筛选,动态高亮显示匹配的 IP

核心优势

  • 轻量级:使用文本文件存储,无需数据库
  • 高效:多线程并发扫描,快速完成网络检测
  • 实时性:定时扫描 + 自动刷新,保持数据最新
  • 可视化:直观的热力图展示,便于理解和使用

快速开始

系统要求

  • Python 版本:3.13(推荐)
  • 操作系统:Windows(已测试)
  • 网络环境:需要能够访问 10.0.48.x 网段
  • 运行权限需要管理员权限(仅清除 ARP 缓存命令需要管理员权限)

安装步骤

1. 克隆项目
git clone https://gitee.com/zheng-enci050704/ai-work-shop-ipmonitor.git
cd ai-work-shop-ipmonitor
2. 安装依赖

运行自动安装脚本:

python install_requirements.py

该脚本会:

  • 自动检查 Python 版本
  • 并行安装所有必需的依赖包
  • 显示美观的安装进度条
3. 启动应用

重要:需要管理员权限!

在 Windows 系统中:

  1. 右键点击命令提示符(CMD)或 PowerShell
  2. 选择"以管理员身份运行"
  3. 切换到项目目录
  4. 运行以下命令:
python app.py

应用将在 http://0.0.0.0:5000 启动,你可以在浏览器中访问该地址查看 IP 监控界面。

为什么需要管理员权限?

本项目需要管理员权限的原因如下:

核心原因:清除 ARP 缓存需要管理员权限

在 Windows 系统中,arp -d 命令用于清除 ARP(Address Resolution Protocol)缓存表。这个操作需要管理员权限才能执行。

为什么需要清除 ARP 缓存?

  1. 确保扫描结果准确:ARP 缓存表会记录之前通信过的 IP 地址和 MAC 地址的映射关系。如果不清除缓存,即使某个 IP 的设备已经离线,ARP 表中可能仍然保留着旧的记录,导致扫描结果不准确。

  2. 获取最新网络状态:每次扫描前清除 ARP 缓存,可以确保我们获取的是当前最新的网络状态,而不是缓存的旧数据。

  3. 提高检测准确性:通过清除缓存后再 ping,可以更准确地检测哪些 IP 地址当前真正在线。

如果没有管理员权限会怎样?

  • arp -d 命令会执行失败(但不会报错,只是静默失败)
  • ⚠️ ARP 缓存无法清除,可能导致扫描结果不准确
  • ⚠️ 可能显示一些已经离线的设备仍然在线(因为使用的是缓存的旧数据)
  • ✅ 其他功能(ping、读取 ARP 表、Web 服务等)仍然可以正常工作

如果无法获取管理员权限怎么办?

如果确实无法以管理员权限运行,可以:

  1. 注释掉清除 ARP 缓存的代码:在 utils/network_scanner.py 文件中,找到 _scan_network 方法中的 arp -d 命令并注释掉
  2. 接受可能的不准确性:虽然扫描结果可能不够准确,但基本功能仍然可用

不过,为了获得最佳的监控效果,强烈建议以管理员权限运行

访问界面

启动成功后,在浏览器中访问 http://localhost:5000,即可看到 IP 监控界面。

界面包含:

  • 热力图:显示每个 IP 的出现次数,颜色越深表示出现次数越多
  • 颜色筛选横条:显示从浅到深的颜色渐变,点击可筛选特定范围的 IP
  • 统计信息:显示最近 7 天的扫描次数
  • 自动刷新:页面每分钟自动刷新,无需手动操作

配置说明

项目采用集中式配置管理,所有配置项都在 config.py 文件中。

IP 范围配置

config.py 中可以修改以下配置:

class Config:
    # 属于自己的IP范围定义(需要监控和管理的IP地址范围)
    FANG_IPS = []
    FANG_IPS.extend(range(153, 175))
    FANG_IPS.extend(range(176, 181))
    FANG_IPS.extend(range(185, 191))
    FANG_IPS.extend(range(226, 250))
    
    # 扫描IP范围(整个需要扫描的IP地址范围)
    IP_RANGE = list(range(151, 251))

扫描间隔配置

class Config:
    # 网络扫描配置
    SCAN_INTERVAL = 60  # 扫描间隔(秒),默认 60 秒

IP 查找正则表达式配置

class Config:
    # 网络扫描配置
    IP_PATTERN = "10.0.48.\\d+"  # IP 查找正则表达式,用于从 ARP 表中匹配 IP 地址

示例

  • "10.0.48.\\d+" - 匹配所有 10.0.48.x 的 IP
  • "10\\.0\\.48\\.(15[1-9]|1[6-9][0-9]|2[0-4][0-9]|250)" - 只匹配 10.0.48.151-250 范围
  • "192\\.168\\.\\d+\\.\\d+" - 匹配所有 192.168.x.x 的 IP

Web 服务配置

class Config:
    # Flask 运行配置
    FLASK_HOST = '0.0.0.0'
    FLASK_PORT = 5000
    FLASK_DEBUG = False

技术亮点

1. 多线程并发扫描

项目使用多线程技术实现并发 ping,大幅提高扫描效率:

# 并发 ping 所有坊内IP
ping_threads = []
for ip in self.ai_workshop_own_ip:
    thread = threading.Thread(target=self._ping_ip, args=(ip,))
    thread.start()
    ping_threads.append(thread)

# 等待所有ping线程完成
for thread in ping_threads:
    thread.join()

2. 线程安全的文件操作

在多线程环境下,文件操作容易出现竞态条件。项目使用线程锁确保文件操作的安全性:

class FileHandler:
    """线程安全的文件操作类"""
    
    def __init__(self, file_path: str) -> None:
        self._file_lock = threading.Lock()
        self._file_path = file_path
    
    def write_file(self, filepath: str, content: str, mode: str = 'a+') -> None:
        with self._file_lock:
            with open(self._file_path, mode, encoding='utf-8') as f:
                f.write(content)
                f.flush()

3. 热力图可视化

前端使用颜色映射算法,将 IP 出现次数转换为颜色深度,直观展示 IP 使用频率:

  • 使用次数少的 IP:浅色显示
  • 使用次数多的 IP:深色显示
  • 支持交互式筛选,点击颜色块可高亮显示匹配的 IP

4. 自动定时任务

使用后台线程实现定时扫描,不影响 Web 服务的响应:

def _periodic_scan(self, seconds: int) -> None:
    """定期执行网络扫描的循环函数"""
    # 立即执行一次扫描
    self._scan_network()
    time.sleep(seconds)
    # 进入无限循环,定期执行扫描
    while True:
        self._scan_network()
        time.sleep(seconds)

项目结构

AiWorkShopIPMonitor/
├── app.py                    # Flask 应用主文件
├── config.py                 # 项目配置文件(IP范围、Flask配置等)
├── install_requirements.py   # 依赖安装脚本
├── activate_ip.txt           # IP 扫描结果数据文件(自动生成)
├── templates/
│   └── index.html            # Web 界面模板
└── utils/
    ├── __init__.py
    ├── network_scanner.py    # 网络扫描器模块
    ├── stats_utils.py        # IP 统计工具模块
    └── file_utils.py         # 线程安全的文件操作模块

核心模块说明

NetworkScanner(网络扫描器)
  • 定期扫描指定 IP 范围
  • 使用多线程并发 ping 提高扫描效率
  • 将扫描结果写入 activate_ip.txt 文件
ActivateIPData(IP 数据统计)
  • 读取并解析扫描数据
  • 统计每个 IP 的出现次数
  • 计算最近 7 天的扫描次数
FileHandler(文件处理器)
  • 提供线程安全的文件读写操作
  • 确保多线程环境下的数据一致性

使用场景

实际应用案例

  1. 企业内网管理

    • 监控企业内部 IP 使用情况
    • 为新员工设备分配可用 IP
    • 优化 IP 地址分配策略
  2. 机房设备管理

    • 监控机房设备在线状态
    • 统计设备 IP 使用频率
    • 辅助设备维护和故障排查
  3. 网络规划优化

    • 分析 IP 使用模式
    • 识别长期未使用的 IP
    • 优化 IP 地址段分配

解决的问题

  • IP 冲突问题:通过历史数据判断 IP 可用性,减少配置冲突
  • IP 分配困难:直观显示 IP 使用频率,优先分配使用频率低的 IP
  • 缺乏数据支持:提供详细的 IP 使用统计,支持数据驱动的决策
  • 监控效率低:自动化扫描和统计,无需手动操作

项目地址

本项目已完全开源,代码托管在 Gitee 上:

🔗 Gitee 仓库地址gitee.com/zheng-enci0…

如果这个项目对你有帮助,欢迎:

  • Star 支持一下
  • 🐛 Issue 报告问题
  • 🔧 Pull Request 贡献代码
  • 📢 分享 给更多需要的朋友

项目采用 MIT 许可证开源,欢迎自由使用、修改和分发。

总结

AiWorkShop IP 监控系统是一个实用的网络管理工具,通过自动化的 IP 监控和统计,帮助管理员更好地管理网络资源。项目具有以下特点:

  • 易用性:一键安装,简单配置即可使用
  • 实用性:解决实际网络管理中的痛点问题
  • 可视化:直观的热力图展示,便于理解和使用
  • 自动化:定时扫描和自动刷新,无需人工干预
  • 可扩展:代码结构清晰,易于扩展和定制

未来展望

  • 支持更多网络协议(如 SNMP)
  • 添加邮件/短信告警功能
  • 支持多网段监控
  • 添加数据导出功能(Excel、CSV)
  • 支持 Docker 部署
  • 添加用户认证和权限管理

作者

  • 郑恩赐 - 主要开发者
  • 陈堉坤 - 主要开发者
  • 苏静铷 - 主要开发者

许可证:本项目基于 MIT 许可证开源,欢迎自由使用、修改和分发。

如有问题或建议,欢迎在 Gitee 上提交 Issue 或 Pull Request!