omarmohamed456/Network-Traffic-Analyzer
GitHub: omarmohamed456/Network-Traffic-Analyzer
基于 Python 和 Scapy 从零构建的网络入侵检测系统,通过自定义规则引擎实时捕获并解析全层数据包以检测各类网络攻击。
Stars: 0 | Forks: 0
# 网络流量分析与 IDS
一个从零开始使用 Python 构建的网络入侵检测系统。通过 Scapy 捕获实时流量,解析所有网络层上的每个数据包,同时记录为多种格式,并使用自定义规则引擎实时检测攻击。
## 实验架构
```
192.168.10.10 Kali Linux Attacker — nmap, hping3, hydra, nikto
192.168.10.20 Ubuntu Victim — Apache, SSH, FTP, DNS
192.168.10.30 Ubuntu IDS — Scapy sniffer, rule engine, dashboard
```
所有三台机器均在隔离的 VirtualBox Host-Only 网络上运行。无互联网暴露。
## 项目结构
```
network-traffic-analyzer/
│
├── core/
│ ├── capture.py Scapy sniffer — packet queue and processing loop
│ ├── parser.py Protocol dissector — Layer 2 through Layer 7
│ ├── rule_engine.py Real-time rule evaluator — reads .rule files
│ └── logger.py Multi-format writer — JSON, CSV, SQLite
│
├── rules/
│ ├── port_scan.rule Horizontal SYN scan detection
│ ├── syn_flood.rule DoS SYN flood detection
│ ├── ssh_brute.rule SSH brute force detection
│ ├── dns_tunnel.rule DNS tunneling detection
│ ├── web_scan.rule HTTP directory scan detection
│ └── misc.rule ICMP flood, ARP scan, high entropy payload
│
├── storage/ Auto-created on first run
│ ├── traffic.json Newline-delimited JSON — Splunk ingestion
│ ├── traffic.csv Labeled packet records
│ └── alerts.db SQLite — dashboard backend
│
├── config.py Interface name, paths, feature flags
├── main.py Entry point
└── requirements.txt
```
## 工作原理
### 捕获层
Scapy 以混杂模式监听 Host-Only 网络接口。每一个穿过虚拟交换机的数据包——包括 Kali 与 Victim 之间的流量——都会被捕获并放入线程安全的队列中。
### 解析层
工作线程从队列中提取数据包,并逐一解析其所有网络层:
- **Layer 2** — MAC 地址、OUI 供应商、VLAN 标签
- **Layer 3** — 源/目的 IP、TTL、分片标志
- **Layer 4** — TCP 标志、序列号、窗口大小、UDP/ICMP 字段
- **Layer 7** — DNS 查询、HTTP 方法/路径/主机/User-Agent、TLS 检测、payload 熵
### 规则引擎
每个解析后的数据包都会与所有已加载的 `.rule` 文件进行比对评估。规则定义了协议、标志、端口和阈值条件。当源 IP 在时间窗口内超过数据包计数阈值时,会立即触发告警——早于数据包被写入磁盘。
```
RULE ssh_brute_force
DESCRIPTION "SSH brute force — repeated connection attempts to port 22"
PROTOCOL TCP
DST_PORT 22
FLAGS S
THRESHOLD 10 packets FROM same_src IN 60 seconds
ACTION alert HIGH
```
### Logger
每个数据包都会同时写入三种格式。JSON 用于提供给 Splunk。CSV 用于积累供 ML 模型使用的带标签训练数据。SQLite 用于支撑实时仪表板。
## 快速开始
### 环境要求
```
Python 3.10+
Root / sudo access for packet capture
VirtualBox with Host-Only adapter configured
```
### 安装
```
git clone https://github.com/yourname/network-traffic-analyzer
cd network-traffic-analyzer
pip install -r requirements.txt
```
### 配置
在运行前编辑 `config.py`:
```
INTERFACE = "enp0s3" # run 'ip a' to find your Host-Only interface name
HOME_NET = "192.168.10.0/24"
```
### 运行
```
# Terminal 1 — 启动 IDS(需要 root 权限以进行 raw socket 访问)
sudo python3 main.py
```
### 生成攻击流量(来自 Kali VM)
```
# Port scan — 触发 port_scan 规则
nmap -sS 192.168.10.20
# SYN flood — 触发 syn_flood 规则
sudo hping3 -S --flood -p 80 192.168.10.20
# SSH brute force — 触发 ssh_brute_force 规则
hydra -l root -P /usr/share/wordlists/rockyou.txt ssh://192.168.10.20
# Web scan — 触发 web_scan 规则
nikto -h http://192.168.10.20
```
## 检测规则
| 规则 | 协议 | 条件 | 严重程度 |
|---|---|---|---|
| port_scan | TCP | 同一源在 3s 内发送 20 个 SYN 数据包 | HIGH |
| syn_flood | TCP | 同一源在 1s 内发送 200 个 SYN 数据包 | CRITICAL |
| ssh_brute_force | TCP | 同一源在 60s 内对端口 22 发送 10 个 SYN | HIGH |
| ftp_brute_force | TCP | 同一源在 60s 内对端口 21 发送 10 个 SYN | HIGH |
| web_scan | TCP | 同一源在 5s 内对端口 80 发送 30 个 SYN | MEDIUM |
| dns_tunneling | DNS | 查询长度 > 50 个字符,10s 内有 5 个数据包 | HIGH |
| icmp_flood | ICMP | 同一源在 2s 内发送 50 个数据包 | HIGH |
| arp_scan | ARP | 同一源在 5s 内发送 20 个 ARP 请求 | MEDIUM |
## 记录字段
每个捕获的数据包记录包含:
```
timestamp, label, src_mac, dst_mac, src_mac_oui,
src_ip, dst_ip, ip_version, ttl, ip_flags,
packet_length, protocol, src_port, dst_port,
tcp_flags, seq_number, ack_number, window_size,
payload_size, payload_entropy, payload_printable,
dns_query, dns_query_length, http_method,
http_host, http_path, http_user_agent, tls_detected
```
标签:Homebrew安装, Python, Scapy, 云计算, 入侵检测系统, 多包管理, 安全数据湖, 无后门, 时间线生成, 红队行动, 网络安全, 规则引擎, 逆向工具, 隐私保护