shinjansarkar/netdiscover
GitHub: shinjansarkar/netdiscover
一款使用 Python 编写的多线程网络扫描器,通过 Flask 仪表板提供主机发现、端口扫描、服务枚举及报告导出功能。
Stars: 0 | Forks: 0
# NetDiscover 🔍
NetDiscover 是一款生产级、轻量级、受 Nmap 启发的网络扫描器和服务枚举工具,使用 Python 编写。它提供了一个现代、响应式的深色主题 Flask 仪表板,用于运行、可视化和导出审计结果。
## 功能
- **主机发现**:在目标子网中利用 **ICMP Echo Ping**(无需 root 即可工作)和 **ARP 广播**(需要提升的权限)进行多线程主机检测。
- **服务和端口扫描**:使用可配置的 `ThreadPoolExecutor` 工作池进行快速的 TCP 端口连接扫描。
- **服务版本检测与 Banner 获取**:连接到开放端口以读取 Banner,并映射带有版本标记的协议。
- **数据库日志与历史记录**:在 SQLite 中维护扫描历史记录、主机清单和日志事件。
- **报告导出**:支持即时下载 **TXT**、**JSON** 和 **CSV** 格式的审计结果。
- **交互式可视化**:包含实时的 CLI 风格控制台和动态的 SVG 子网拓扑图。
- **Docker 支持**:开箱即用,随时可以构建和运行。
## 项目架构
```
NetDiscover/
├── netdiscover/
│ ├── __init__.py
│ ├── app.py # Flask server routes & API endpoints
│ ├── config.py # Configuration manager (ports, timeouts, threads)
│ ├── db.py # SQLite database wrapper & audit logs
│ ├── host_discovery.py # ICMP & ARP subnet sweeps (ThreadPoolExecutor)
│ ├── port_scanner.py # TCP socket connect scanner
│ ├── service_detector.py # Banner regex parser & service mapper
│ ├── banner_grabber.py # Socket payload query tool
│ ├── report_generator.py # Exporters (JSON, TXT, CSV)
│ ├── scanner_engine.py # Core scan pipeline orchestrator
│ ├── init_helper.py # Database pre-population helper
│ └── templates/ # Jinja2 Dashboard Layouts
│ ├── base.html
│ ├── index.html
│ ├── new_scan.html
│ ├── scan_history.html
│ ├── reports.html
│ └── logs.html
├── run.py # Entry start script
├── Dockerfile # Container build instructions
├── docker-compose.yml # Compose stack specification
├── requirements.txt # Python dependency manifest
└── README.md # System instruction handbook
```
## 安装与设置
### 1. 虚拟环境设置
#### 创建与激活虚拟环境
**Linux / macOS:**
```
# 创建虚拟环境
python3 -m venv venv
# 激活它
source venv/bin/activate
```
**Windows (命令提示符):**
```
python -m venv venv
venv\Scripts\activate.bat
```
**Windows (PowerShell):**
```
python -m venv venv
.\venv\Scripts\Activate.ps1
```
#### 停用虚拟环境
工作完成后,请停用虚拟环境:
```
deactivate
```
### 2. 本地设置(标准主机执行)
确保已安装 python3 和 pip。首先安装系统网络工具:
```
# Ubuntu / Debian
sudo apt update
sudo apt install -y iputils-ping net-tools libpcap-dev gcc
# macOS (使用 Homebrew)
brew install tcpdump libpcap
```
创建虚拟环境并安装依赖项:
```
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
```
启动服务器:
```
python run.py
```
在浏览器中打开 **`http://localhost:5000`**。
### 3. 在 Docker 中运行
#### 了解 Dockerfile
`Dockerfile` 定义了容器镜像:
```
# 使用官方轻量级 Python 镜像
FROM python:3.10-slim
# 安装网络命令和 scapy 所需的系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
iputils-ping \
net-tools \
tcpdump \
libpcap-dev \
gcc \
libc-dev \
&& rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 复制 requirements 并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用程序文件
COPY netdiscover/ ./netdiscover/
COPY run.py .
# 为 dashboard 暴露端口
EXPOSE 5000
# 运行 Flask 服务器
CMD ["python", "run.py"]
```
**Dockerfile 分解说明:**
- **`FROM python:3.10-slim`** — 从轻量级的 Python 3.10 镜像开始
- **`RUN apt-get...`** — 安装用于扫描的网络工具(ping、tcpdump、libpcap)
- **`WORKDIR /app`** — 设置容器的工作目录
- **`COPY requirements.txt...`** — 复制并安装 Python 依赖项
- **`COPY netdiscover/...`** — 复制应用程序源代码
- **`EXPOSE 5000`** — 声明容器监听 5000 端口
- **`CMD`** — 在启动时运行 Flask 应用程序
#### 使用 Docker Compose 构建与运行
Docker Compose 可自动执行镜像构建和容器编排:
```
# 构建并启动容器(支持实时重载)
docker-compose up --build
# 不重新构建直接启动
docker-compose up
# 在后台运行(detached)
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止容器
docker-compose down
```
仪表板可在 **`http://localhost:5000`** 访问。
#### 手动 Docker 构建与运行
如果您不想使用 Docker Compose 进行构建:
```
# 构建镜像
docker build -t netdiscover:latest .
# 运行容器
docker run --network host -p 5000:5000 netdiscover:latest
```
## 使用的网络核心概念
### 1. 子网划分与 CIDR 表示法
NetDiscover 解析采用 CIDR 表示法(例如 `192.168.1.0/24`)的子网。`/24` 子网掩码将 24 位用于网络,提供 254 个可用的主机地址(从 `.1` 到 `.254`)。
### 2. ICMP Echo 请求 (Ping)
Ping 传输 ICMP Type 8 数据包。如果主机在线,它会回复 ICMP Type 0(Echo Reply)。NetDiscover 利用系统原生的 `ping` 二进制文件来可靠地执行此测试,且无需 root 权限。
### 3. ARP 广播(地址解析协议)
ARP 用于将 IP 地址解析为物理 MAC 地址。扫描器向 MAC 地址 `ff:ff:ff:ff:ff:ff` 广播 ARP 请求(`Who has 192.168.1.X? Tell 192.168.1.Y`)。活跃的主机会直接回复。
### 4. TCP Connect 端口扫描
扫描器使用标准的 socket 连接发起完整的 3 次握手(`SYN` -> `SYN-ACK` -> `ACK`)。这保证了准确性,且不需要 raw socket 权限。
### 5. Banner 获取与服务指纹识别
一旦端口连接成功,应用程序就会捕获初始的应用程序问候语(例如 `SSH-2.0-OpenSSH_8.2p1`)。通过使用正则表达式解析这些问候语,NetDiscover 可以提取特定的服务版本(如 NGINX、Apache、MariaDB)。
标签:Docker, Flask, Python, 占用监测, 后端开发, 安全防御评估, 插件系统, 数据统计, 无后门, 端口扫描, 网络扫描器, 请求拦截, 资产管理, 逆向工具