一个实用的 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)
功能演示
主要功能点
-
实时监控
- 系统每 60 秒自动扫描一次网络
- 使用多线程并发 ping,提高扫描效率
- 自动清除 ARP 缓存,确保扫描结果准确
-
数据统计
- 统计每个 IP 的出现次数
- 计算最近 7 天的扫描次数
- 支持历史数据查询和分析
-
可视化展示
- 热力图显示 IP 使用频率(颜色越深表示使用越频繁)
- 交互式颜色筛选器,可按使用频率筛选 IP
- 区分显示坊内 IP 和非坊内 IP
-
自动刷新
- 页面每分钟自动刷新,获取最新数据
- 无需手动操作,实时查看监控结果
基本原理
为了更好地理解和使用本项目,这里简要说明一下系统的工作原理:
1. 网络扫描机制
系统通过以下步骤完成一次网络扫描:
- 清除 ARP 缓存:执行
arp -d命令清除系统 ARP 缓存表,确保获取最新的网络状态 - 并发 Ping 扫描:使用多线程并发 ping 所有需要监控的 IP 地址(坊内 IP)
- 读取 ARP 表:ping 操作后,系统会更新 ARP 表,通过
arp -a命令读取当前活跃的 IP 地址 - 数据记录:将扫描时间戳和检测到的活跃 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 系统中:
- 右键点击命令提示符(CMD)或 PowerShell
- 选择"以管理员身份运行"
- 切换到项目目录
- 运行以下命令:
python app.py
应用将在 http://0.0.0.0:5000 启动,你可以在浏览器中访问该地址查看 IP 监控界面。
为什么需要管理员权限?
本项目需要管理员权限的原因如下:
核心原因:清除 ARP 缓存需要管理员权限
在 Windows 系统中,arp -d 命令用于清除 ARP(Address Resolution Protocol)缓存表。这个操作需要管理员权限才能执行。
为什么需要清除 ARP 缓存?
-
确保扫描结果准确:ARP 缓存表会记录之前通信过的 IP 地址和 MAC 地址的映射关系。如果不清除缓存,即使某个 IP 的设备已经离线,ARP 表中可能仍然保留着旧的记录,导致扫描结果不准确。
-
获取最新网络状态:每次扫描前清除 ARP 缓存,可以确保我们获取的是当前最新的网络状态,而不是缓存的旧数据。
-
提高检测准确性:通过清除缓存后再 ping,可以更准确地检测哪些 IP 地址当前真正在线。
如果没有管理员权限会怎样?
- ❌
arp -d命令会执行失败(但不会报错,只是静默失败) - ⚠️ ARP 缓存无法清除,可能导致扫描结果不准确
- ⚠️ 可能显示一些已经离线的设备仍然在线(因为使用的是缓存的旧数据)
- ✅ 其他功能(ping、读取 ARP 表、Web 服务等)仍然可以正常工作
如果无法获取管理员权限怎么办?
如果确实无法以管理员权限运行,可以:
- 注释掉清除 ARP 缓存的代码:在
utils/network_scanner.py文件中,找到_scan_network方法中的arp -d命令并注释掉 - 接受可能的不准确性:虽然扫描结果可能不够准确,但基本功能仍然可用
不过,为了获得最佳的监控效果,强烈建议以管理员权限运行。
访问界面
启动成功后,在浏览器中访问 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(文件处理器)
- 提供线程安全的文件读写操作
- 确保多线程环境下的数据一致性
使用场景
实际应用案例
-
企业内网管理
- 监控企业内部 IP 使用情况
- 为新员工设备分配可用 IP
- 优化 IP 地址分配策略
-
机房设备管理
- 监控机房设备在线状态
- 统计设备 IP 使用频率
- 辅助设备维护和故障排查
-
网络规划优化
- 分析 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!