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, 安全工具开发, 密码管理, 并发扫描, 插件系统, 无后门, 服务器安全, 服务识别, 漏洞评估辅助, 网络安全, 网络扫描器, 网络测绘, 逆向工具, 隐私保护