nikhilreddynani1-beep/TCP_PORT_SCANNER
GitHub: nikhilreddynani1-beep/TCP_PORT_SCANNER
基于 FastAPI 和 React 构建的全栈 TCP 端口扫描器,提供 Web 界面和 CLI 两种使用方式,支持并发扫描、Banner 抓取和服务识别。
Stars: 1 | Forks: 0
# TCP 端口扫描器
一个基于 **FastAPI** 后端和 **React** 前端构建的全栈网络端口扫描器。
扫描任意 IP 地址或主机名,检测开放端口,识别运行中的服务,并捕获服务 Banner —— 全部通过现代化的 Web 仪表盘完成。
## 工作原理
```
┌─────────────────────────────────────────────────────────────┐
│ Browser │
│ React + Vite → ScanForm → Axios GET /scan │
└────────────────────────────┬────────────────────────────────┘
│ HTTP
┌────────────────────────────▼────────────────────────────────┐
│ FastAPI (port 8000) │
│ GET /scan → scanner.py → ThreadPoolExecutor │
│ (100 concurrent TCP probes) │
└────────────────────────────┬────────────────────────────────┘
│ Raw TCP sockets
┌──────────────▼──────────────┐
│ Target Host │
│ port 20 … port 65535 │
└─────────────────────────────┘
```
### 后端 (`backend/`)
| 文件 | 作用 |
|---|---|
| `main.py` | FastAPI 应用 —— 暴露 `GET /scan` 和 `POST /scan` 端点,包含 CORS 中间件、输入验证 |
| `scanner.py` | 核心扫描逻辑 —— DNS 解析、通过 `socket.connect_ex()` 进行并发 TCP 连接、使用 `socket.recv()` 进行 Banner 抓取 |
| `port_scanner.py` | 独立 CLI 端口扫描器模块 —— 可直接在终端独立运行 |
| `models.py` | Pydantic 请求/响应模型(`ScanRequest`、`PortResult`、`ScanResponse`) |
| `requirements.txt` | Python 依赖 |
**扫描流程:**
1. API 将目标主机名解析为 IP 地址。
2. `ThreadPoolExecutor`(最多 200 个工作线程)同时对每个端口发起一个 TCP `connect_ex()` 调用。
3. 在每个开放端口上,复用同一个 Socket 尝试抓取 Banner(`recv(1024)`)。
4. 结果按端口号排序并以 JSON 格式返回。
### 前端 (`frontend/`)
| 文件 | 作用 |
|---|---|
| `src/App.jsx` | 根组件 —— 持有所有状态,使用 Axios 调用 API |
| `src/components/ScanForm.jsx` | 带有客户端验证的受控表单 |
| `src/components/ResultsTable.jsx` | 可排序、可过滤的结果表格(端口 / 状态 / 服务 / Banner) |
| `src/components/StatsPanel.jsx` | 统计卡片 + Chart.js 饼图(开放 vs 关闭) |
| `src/components/LoadingSpinner.jsx` | 扫描进行中显示的动画加载卡片 |
| `src/index.css` | 使用 CSS 自定义属性的暗色主题设计系统 |
## 项目结构
```
CN/
├── backend/
│ ├── main.py
│ ├── models.py
│ ├── port_scanner.py
│ ├── scanner.py
│ └── requirements.txt
└── frontend/
├── index.html
├── package.json
├── vite.config.js
└── src/
├── main.jsx
├── App.jsx
├── index.css
└── components/
├── ScanForm.jsx
├── ResultsTable.jsx
├── StatsPanel.jsx
└── LoadingSpinner.jsx
```
## 快速开始
安装并运行整个项目最快的方式是使用附带的 Shell 脚本:
```
./start.sh
```
这条命令将:
1. 检查所需工具(`python3`、`pip3`、`node`、`npm`)
2. 创建 Python 虚拟环境并安装后端依赖
3. 安装前端 Node.js 依赖
4. 在 **http://localhost:8000** 启动 FastAPI 后端
5. 在 **http://localhost:5173** 启动 React 前端
按 **Ctrl+C** 停止这两个服务。
## 环境要求
| 工具 | 最低版本 |
|---|---|
| Python | 3.11+ |
| Node.js | 18+ |
| npm | 9+ |
## 安装说明
### 1. 克隆 / 打开项目
```
cd /path/to/CN
```
### 2. 安装后端依赖
```
cd backend
pip install -r requirements.txt
```
这将安装:
- `fastapi` —— Web 框架
- `uvicorn[standard]` —— ASGI 服务器
- `pydantic` —— 数据验证
### 3. 安装前端依赖
```
cd ../frontend
npm install
```
这将安装:
- `react` / `react-dom`
- `axios` —— HTTP 客户端
- `chart.js` + `react-chartjs-2` —— 饼图
- `vite` + `@vitejs/plugin-react` —— 构建工具
## 运行项目
你需要**两个终端**同时运行。
### 终端 1 — 启动 FastAPI 后端
```
cd backend
uvicorn main:app --reload --host 0.0.0.0 --port 8000
```
API 将在以下地址可用:
- **Base URL:** `http://localhost:8000`
- **交互式文档:** `http://localhost:8000/docs`
- **扫描端点:** `GET http://localhost:8000/scan?target=...&start_port=...&end_port=...`
### 终端 2 — 启动 React 前端
```
cd frontend
npm run dev
```
仪表盘将在以下地址可用:
- **URL:** `http://localhost:5173`
## API 用法
### GET /scan
```
GET /scan?target=127.0.0.1&start_port=20&end_port=100
```
### POST /scan
```
curl -X POST http://localhost:8000/scan \
-H "Content-Type: application/json" \
-d '{"target": "127.0.0.1", "start_port": 20, "end_port": 100}'
```
### 响应示例
```
{
"target": "127.0.0.1",
"resolved_ip": "127.0.0.1",
"start_port": 20,
"end_port": 100,
"open_ports": 2,
"total_scanned": 81,
"scan_duration_seconds": 1.042,
"results": [
{ "port": 22, "status": "open", "service": "SSH", "banner": "SSH-2.0-OpenSSH_8.9" },
{ "port": 80, "status": "open", "service": "HTTP", "banner": "HTTP/1.1 200 OK..." },
{ "port": 21, "status": "closed", "service": "FTP Control", "banner": null }
]
}
```
### 验证规则
| 规则 | 详情 |
|---|---|
| 端口范围 | 1 – 65535 |
| 每次请求最大端口数 | 10 000 |
| `end_port` ≥ `start_port` | 必须满足 |
| 无法解析的主机名 | 返回 `400 Bad Request` |
## 使用 CLI 扫描器(可选)
`port_scanner.py` 可以在不启动 Web 服务器的情况下直接运行:
```
cd backend
python port_scanner.py
```
**示例:**
```
python port_scanner.py 127.0.0.1 1 1024
```
**输出:**
```
Scanning 127.0.0.1 ports 1–1024 …
Port Status Service Banner
────────────────────────────────────────────────────────────────────────────────
22 open SSH SSH-2.0-OpenSSH_8.9p1 ◀
80 open HTTP HTTP/1.1 200 OK ... ◀
443 closed HTTPS -
────────────────────────────────────────────────────────────────────────────────
Total scanned : 1024
Open ports : 2
```
## 生产环境构建
### 前端
```
cd frontend
npm run build # outputs to frontend/dist/
npm run preview # local preview of the production build
```
通过创建 `frontend/.env` 文件设置生产环境的后端 URL:
```
VITE_API_BASE=https://your-backend-domain.com
```
标签:AV绕过, Banner抓取, FastAPI, Python, Qt框架, React, Socket编程, Syscalls, TCP端口扫描, Vite, 安全工具开发, 密码管理, 并发扫描, 插件系统, 无后门, 服务器安全, 服务识别, 漏洞评估辅助, 网络安全, 网络扫描器, 网络测绘, 逆向工具, 隐私保护