gunelsarac/gns3-network-monitoring
GitHub: gunelsarac/gns3-network-monitoring
基于 GNS3 与 Python 微服务架构的虚拟网络实时流量监控与管理系统,提供数据包捕获可视化、ACL 规则管理和 QoS 带宽控制功能。
Stars: 0 | Forks: 0
# 基于 GNS3 的实时网络流量监控与管理系统
使用 Python 和 Scapy 开发的微服务监控平台,可在虚拟网络环境中实时捕获、可视化流量,并通过 ACL/QoS 规则进行管理。





## 目录
- [项目介绍](#proje-hakkında)
- [特性](#özellikler)
- [系统截图](#ekran-görüntüleri)
- [系统架构](#sistem-mimarisi)
- [网络拓扑](#ağ-topolojisi)
- [微服务](#mikroservisler)
- [安装说明](#kurulum)
- [运行方式](#çalıştırma)
- [所用技术](#kullanılan-teknolojiler)
- [项目结构](#proje-yapısı)
- [开源协议](#lisans)
## 项目介绍
本项目是一个实时流量监控与管理系统,运行于 GNS3 网络模拟器构建的虚拟网络拓扑之上。系统通过在 Ubuntu 路由器上运行的 Python 服务,捕获流经网络的数据包,追踪各设备产生的流量状况,并通过 Web 界面进行可视化展示。
系统不仅限于监控,还能通过基于 **iptables** 的访问控制列表(ACL)和基于 **Linux tc HTB** 的带宽管理(QoS)对网络进行主动管理。系统可以区分 YouTube(TCP)和 Zoom(UDP)等服务类型,将设备状态监控为 NORMAL / WARNING / DANGER,并在必要时执行自动干预。
本项目是作为 **阿马西亚大学(Amasya University)计算机工程系** 的毕业设计开发的。
## 特性
- **实时数据包捕获** — 使用 Scapy 监听所有活动接口,根据协议和端口对数据包进行分类
- **服务识别** — 自动将 TCP 80/443 标记为 YouTube,将 UDP 8801/8802 标记为 Zoom
- **20 台虚拟设备的网络** — 分布在 4 个 VLAN 上,由真实和模拟设备协同工作的混合拓扑
- **ICMP/ARP 模拟** — 为非物理的虚拟 PC 模拟 ping 和 ARP 响应
- **ACL 管理** — 在 iptables FORWARD 链中,基于接口模拟真实的 Cisco ACL 行为进行规则管理
- **QoS / 带宽控制** — 使用 tc HTB 实现基于服务的速率限制
- **状态机** — 根据设备流量在 NORMAL / WARNING / DANGER 之间进行状态转换并自动干预
- **Web dashboard** — 基于 Flask;包含实时流量表、拓扑动画、ICMP ping 可视化及 ACL 规则管理等标签页
- **原子级 JSON 通信** — 服务间的数据共享通过防止竞态条件的原子文件写入来实现
## 系统截图
### Web Dashboard — 实时流量与状态卡片

### 实时设备状态表

### 网络拓扑动画(TCP / UDP 数据包流)

### ICMP Ping 可视化

### 拓扑 — 局部放大

## 系统架构
系统由五个独立运行的微服务组成。服务之间不直接通信,而是通过对公共 JSON 文件进行原子写入/读取来共享数据。这种方法允许各个服务单独重启,并将错误隔离。
```
┌─────────────────┐ ┌──────────────────────┐ ┌─────────────────┐
│ traffic_ │ │ Ubuntu Router │ │ sniff.py │
│ generator.py │───▶ │ (GNS3 / VMware) │───▶ │ (paket yakala) │
│ (paket üret) │ │ ens4 / ens5 ... │ │ │
└─────────────────┘ └──────────────────────┘ └────────┬────────┘
│
┌─────────────────────────────────────────────┐ │ live_stats.json
│ Atomik JSON Dosyaları │◀─────┘
│ live_stats · device_states · acl_rules ... │
└──────┬───────────────┬──────────────┬────────┘
│ │ │
┌───────▼──────┐ ┌──────▼──────┐ ┌────▼────────┐
│ acl_engine │ │ qos_engine │ │ icmp_ │
│ (iptables) │ │ (tc HTB) │ │ responder │
└──────────────┘ └─────────────┘ └─────────────┘
│
┌───────▼────────┐
│ dashboard_v15 │
│ (Flask :5000) │
└────────────────┘
```
## 网络拓扑
```
NAT
│
Ubuntu-Router (192.168.64.207)
├── ens3 → WAN / NAT (internet)
├── ens4 → Switch → PC1..PC20 (4 VLAN)
└── ens5 → Cloud → Dashboard erişimi
```
| VLAN | IP 范围 | 设备 |
|------|-----------|----------|
| VLAN 10 | 192.168.10.0/24 | PC1–PC5 (PC1, PC2 为真实 VPCS) |
| VLAN 20 | 192.168.20.0/24 | PC6–PC10 (模拟) |
| VLAN 30 | 192.168.30.0/24 | PC11–PC15 (模拟) |
| VLAN 40 | 192.168.40.0/24 | PC16–PC20 (模拟) |
PC1 和 PC2 是真实的 VPCS 实例;PC3–PC20 则通过 `icmp_responder.py` 在 ARP 和 ICMP 层级进行模拟。
## 微服务
| 服务 | 任务 | 技术 |
|--------|--------|-----------|
| `sniff.py` | 监听活动接口,捕获数据包并写入 `live_stats.json` | Scapy |
| `traffic_generator.py` | 为 20 个虚拟设备生成 YouTube (TCP) 和 Zoom (UDP) 的合成流量 | Scapy `sendp()` |
| `icmp_responder.py` | 为模拟设备伪造 ARP + ICMP 响应 | Scapy |
| `acl_engine.py` | 在 iptables FORWARD 链中管理基于接口的 ACL 规则 | iptables |
| `qos_engine.py` | 使用 tc HTB 应用基于服务的带宽限制 | Linux tc |
| `state_manager.py` | 监控设备状态 (NORMAL/WARNING/DANGER) 并进行干预 | Python |
| `dashboard_v15.py` | Web 界面 — 流量、拓扑、ICMP 和 ACL 标签页 | Flask |
### 服务间的 JSON 文件
| 文件 | 写入者 | 读取者 |
|-------|-------|--------|
| `live_stats.json` | sniff.py | dashboard, state_manager |
| `device_states.json` | state_manager.py | dashboard |
| `disrupt_list.json` | dashboard | traffic_generator, state_manager |
| `slider_targets.json` | dashboard | state_manager |
| `acl_rules.json` | acl_engine / dashboard | sniff, icmp_responder |
## 安装说明
### 前置条件
- GNS3 + VMware Workstation
- Ubuntu 路由器虚拟机(已安装 Python 3.x)
- Python 包:`scapy`, `flask`
### 步骤
在路由器上安装必要的 Python 包:
```
sudo apt update
sudo apt install python3-pip
pip3 install scapy flask
```
将项目文件复制到路由器(SCP 命令示例):
```
scp *.py setup_routes.sh gunel@192.168.64.207:/home/gunel/
```
设置网络路由(每次重启后需重新运行):
```
sudo bash setup_routes.sh
```
## 运行方式
首先,停止可能存在的旧服务实例:
```
sudo pkill -f sniff.py
sudo pkill -f traffic_generator
sudo pkill -f icmp_responder
sudo pkill -f state_manager
sudo pkill -f dashboard_v15
sleep 2
```
开启接口转发并按顺序启动服务:
```
sudo ip link set ens4 up
sudo ip link set ens5 up
sudo python3 /home/gunel/sniff.py > /home/gunel/sniff.log 2>&1 &
sudo python3 /home/gunel/icmp_responder.py > /home/gunel/icmp.log 2>&1 &
sudo python3 /home/gunel/traffic_generator.py > /home/gunel/trafik.log 2>&1 &
sudo python3 /home/gunel/state_manager.py > /home/gunel/state.log 2>&1 &
sudo python3 /home/gunel/dashboard_v15.py > /home/gunel/dashboard.log 2>&1 &
```
验证服务是否正在运行(在健康状态下,应准确看到 5 个 python 进程):
```
ps aux | grep python3
```
通过浏览器访问 Dashboard:
```
http://192.168.64.207:5000
```
## 所用技术
- **Python 3** — 所有服务的开发语言
- **Scapy** — 数据包捕获与生成
- **Flask** — Web dashboard
- **iptables** — 访问控制列表(ACL)
- **Linux tc (HTB)** — 流量整形 / QoS
- **GNS3 + VMware** — 网络模拟
- **VPCS** — 虚拟 PC 客户端
## 项目结构
```
.
├── sniff.py # Paket yakalama servisi
├── traffic_generator.py # Sentetik trafik üreteci
├── icmp_responder.py # ARP + ICMP simülasyonu
├── acl_engine.py # iptables ACL yönetimi
├── qos_engine.py # tc HTB bant genişliği yönetimi
├── state_manager.py # Durum makinesi (NORMAL/WARNING/DANGER)
├── dashboard_v15.py # Flask web arayüzü
├── setup_routes.sh # Ağ rotalarını ayarlama betiği
├── docs/
│ └── images/ # Ekran görüntüleri
└── README.md
```
## 开源协议
本项目基于 MIT 协议授权。详情请参阅 [LICENSE](LICENSE) 文件。
**Günel Saraç** — 阿马西亚大学计算机工程系
毕业设计 · 2026
标签:GNS3, Python, QoS, Scapy, Streamlit, 无后门, 流量管理, 访问控制, 逆向工具