AkshayP47/Port_Scanner
GitHub: AkshayP47/Port_Scanner
一款基于 Python 标准库、零外部依赖的专业级多线程 TCP 端口扫描器,提供服务识别与多格式报告导出功能。
Stars: 0 | Forks: 0
# 专业 TCP 端口扫描器
一个全面、**生产就绪的端口扫描器**,使用 Python 内置库构建。专为网络安全专业人员、学生和作品集展示而设计。
## 🎯 项目概述
本项目展示了专业级的网络安全工具开发,无需依赖 Nmap 等外部工具。它非常适合:
- 学习网络基础知识的网络安全学生
- 展示编程和网络技能的作品集项目
- 安全相关职位的面试准备
- 在实践层面理解 TCP/IP 协议
## ✨ 功能
### 核心功能
- ✅ **TCP 端口扫描** - 使用原始 socket 检测开放/关闭的端口
- ✅ **多线程扫描** - 支持配置线程数的快速并发端口扫描
- ✅ **服务识别** - Banner 抓取与服务检测
- ✅ **进度跟踪** - 实时扫描进度条
- ✅ **详细计时** - 扫持续时间和时间戳
- ✅ **优雅的错误处理** - 网络错误、超时、无效输入
### 导出格式
- ✅ **JSON** - 机器可读格式
- ✅ **CSV** - 兼容电子表格的格式
- ✅ **TXT** - 人类可读报告
### 高级功能
- ✅ **Banner 抓取** - 从响应中提取服务信息
- ✅ **服务映射** - 识别 15+ 种常见服务
- ✅ **风险评估** - 标记高风险的开放端口
- ✅ **彩色输出** - 专业的终端格式化
- ✅ **全面的日志记录** - 调试和操作日志
## 📋 要求
### 必备条件
- **Python 3.7+**(推荐 3.10+)
### 可选(用于开发)
- pytest - 用于单元测试
- pylint - 用于代码质量检查
- black - 用于代码格式化
### 依赖项
**核心功能零外部依赖!** 仅使用 Python 标准库:
- `socket` - 网络通信
- `threading` + `concurrent.futures` - 并发执行
- `argparse` - CLI 界面
- `json` / `csv` - 报告生成
- `logging` - 应用程序日志记录
- `ipaddress` - IP 验证
## 🚀 安装与设置
### 1. 克隆仓库
```
cd d:\CODE\cyber\port_scanner
```
### 2. 验证 Python 安装
```
python --version
# 应显示 Python 3.7+
```
### 3. (可选)创建虚拟环境
```
# Windows
python -m venv venv
venv\Scripts\activate
# Linux/macOS
python3 -m venv venv
source venv/bin/activate
```
### 4. 安装开发依赖(可选)
```
pip install -r requirements.txt
```
## 💻 用法
### 基本扫描
**扫描默认端口范围(1-65535):**
```
python main.py --target 192.168.1.1
```
**扫描特定端口范围:**
```
python main.py --target 192.168.1.1 --start-port 1 --end-port 1000
```
### 性能调优
**增加线程以加快扫描速度:**
```
python main.py --target 192.168.1.1 --threads 100
```
**调整超时以适应缓慢的网络:**
```
python main.py --target 192.168.1.1 --timeout 2.0
```
### Web 前端
使用内置的 Python WSGI 服务器提供了一个简单的基于浏览器的界面。
**运行 Web 前端:**
```
python webapp.py
```
然后在浏览器中打开:
```
http://127.0.0.1:8000/
```
Web 界面允许您输入目标 IP、端口范围、线程数、超时和输出格式,然后在浏览器中查看扫描结果。
```
python main.py --target 192.168.1.1 --timeout 3.0
```
### 报告生成
**导出为单一格式:**
```
python main.py --target 192.168.1.1 --output json
```
**导出为多种格式:**
```
python main.py --target 192.168.1.1 --output json,csv,txt
```
**导出所有格式:**
```
python main.py --target 192.168.1.1 --output all
```
**自定义报告目录:**
```
python main.py --target 192.168.1.1 --output-dir ./my_reports
```
### 详细/静默模式
**启用调试日志:**
```
python main.py --target 192.168.1.1 --verbose
```
**禁止控制台输出:**
```
python main.py --target 192.168.1.1 --quiet
```
### 完整示例
```
# Fast scan of web service ports with logging
python main.py --target 192.168.1.10 --start-port 80 --end-port 8443 --threads 200 --output json,csv
# Comprehensive scan with custom timeout
python main.py --target 192.168.1.10 --timeout 2.0 --threads 128 --output all --verbose
# 快速 localhost 扫描
python main.py --target 127.0.0.1 --start-port 1 --end-port 10000 --threads 100
```
## 📁 项目结构
```
port_scanner/
├── main.py # CLI entry point
├── scanner.py # Core scanning engine
├── utils.py # Utility functions & validation
├── banner_grabber.py # Service identification & banner grabbing
├── report_generator.py # Report export (JSON/CSV/TXT)
├── requirements.txt # Dependencies
├── README.md # This file
└── sample_reports/ # Example output reports
├── scan_192_168_1_1_20240609_120000.json
├── scan_192_168_1_1_20240609_120000.csv
└── scan_192_168_1_1_20240609_120000.txt
```
## 🔍 工作原理
### TCP 连接扫描过程
1. **Socket 创建**:为每个端口创建 TCP socket
2. **连接尝试**:发起 3 次握手
3. **响应处理**:
- **开放端口**:连接成功(响应代码 0)
- **关闭端口**:连接被拒绝(非零响应代码)
4. **Banner 抓取**:尝试读取服务响应
5. **服务识别**:将端口/Banner 映射到已知服务
### 线程架构
```
ThreadPoolExecutor (N threads)
├─ Thread 1: Scan port 1
├─ Thread 2: Scan port 2
├─ Thread 3: Scan port 3
└─ Thread N: Scan port N
```
扫描器使用 `concurrent.futures.ThreadPoolExecutor` 进行高效的并发端口扫描,无需手动管理线程。
### 服务识别
**多级识别:**
1. **端口号分析**:对照常见服务端口进行检查(HTTP:80, SSH:22 等)
2. **Banner 解析**:分析服务响应以获取版本信息
3. **启发式判断**:使用端口范围判断常见服务
4. **默认**:对于无法识别的服务返回“Unknown”
## 🛡️ 安全注意事项
### 本工具的功能
- 执行 TCP 端口扫描(基于连接,无数据包构造)
- 使用标准 socket 库功能
- 识别开放端口和服务
### 本工具不会做的事
- SYN/隐蔽扫描(需要原始 socket/管理员权限)
- UDP 扫描
- 服务漏洞扫描
- 漏洞利用执行
- 网络模糊测试
### 使用限制
⚠️ **重要提示**:仅扫描您拥有或获得明确测试许可的网络和系统。未经授权的端口扫描可能是非法的。
### 网络礼仪
- 高线程数会对网络和目标系统造成压力
- 对于生产/关键系统,请使用 `--threads 50` 或更低设置
- 考虑扫描时间以避免造成中断
- 在测试他人系统之前,务必获得书面授权
## 📊 示例输出
### 控制台输出
```
================================================================================
PROFESSIONAL PORT SCANNER
================================================================================
Target: 192.168.1.1
Port Range: 1-1000
Threads: 50
Timeout: 1.0s
================================================================================
Progress: [==================================================] 100.0%
================================================================================
SCAN RESULTS FOR 192.168.1.1
================================================================================
Duration: 12.34 seconds
Open Ports: 5 | Closed Ports: 995
--------------------------------------------------------------------------------
Port State Service Description
--------------------------------------------------------------------------------
21 open FTP File Transfer Protocol
22 open SSH Secure Shell
80 open HTTP HyperText Transfer Protocol
443 open HTTPS HTTP Secure
3306 open MySQL MySQL Database
================================================================================
✓ JSON report: reports/scan_192_168_1_1_20240609_120000.json
✓ CSV report: reports/scan_192_168_1_1_20240609_120000.csv
✓ Text report: reports/scan_192_168_1_1_20240609_120000.txt
⚠ High-Risk Ports Found: [21, 3306]
```
### JSON 报告示例
```
{
"target": "192.168.1.1",
"start_port": 1,
"end_port": 1000,
"scan_start_time": "2024-06-09T12:00:00",
"scan_end_time": "2024-06-09T12:00:12.34",
"duration_seconds": 12.34,
"total_ports_scanned": 1000,
"open_ports_count": 5,
"closed_ports_count": 995,
"open_ports": [
{
"port": 21,
"state": "open",
"service": "FTP",
"description": "File Transfer Protocol",
"banner": "220 FTP Server Ready"
},
{
"port": 22,
"state": "open",
"service": "SSH",
"description": "Secure Shell",
"banner": "SSH-2.0-OpenSSH_7.4"
}
]
}
```
### CSV 报告示例
```
Port,State,Service,Description,Banner
21,open,FTP,File Transfer Protocol,220 FTP Server Ready
22,open,SSH,Secure Shell,SSH-2.0-OpenSSH_7.4
80,open,HTTP,HyperText Transfer Protocol,
443,open,HTTPS,HTTP Secure,
3306,open,MySQL,MySQL Database,
```
## 🎓 学习资源
### 网络概念解释
**TCP 3 次握手:**
1. 客户端向服务器发送 SYN
2. 服务器响应 SYN-ACK
3. 客户端发送 ACK
- 如果成功 → 端口开放
- 如果被拒绝 → 端口关闭
**Socket 编程:**
- `socket.socket()` - 创建 socket 对象
- `connect_ex()` - 非阻塞连接尝试
- `recv()` - 从 socket 接收数据
**线程:**
- `ThreadPoolExecutor` - 管理 worker 线程
- `concurrent.futures` - 异步任务执行
- `as_completed()` - 在结果完成后进行处理
### 关键网络安全概念
1. **端口扫描** - 基本的侦察技术
2. **服务识别** - 确定攻击面
3. **风险评估** - 确定漏洞测试的优先级
4. **威胁建模** - 规划安全评估
## 🚨 限制
- **无原始 Socket**:在没有提升权限的情况下无法执行隐蔽/SYN 扫描
- **单一目标**:需修改以支持批量扫描功能
- **仅限 TCP**:UDP 扫描需要不同的方法
- **无 DNS 解析**:仅使用 IP 地址
- **仅本地日志**:不支持远程日志
- **顺序线程**:对于 CPU 密集型任务受 GIL 限制
## 📈 未来增强计划
1. **UDP 扫描** - 增加 UDP 端口扫描功能
2. **批量扫描** - 支持多目标和 CIDR 范围
3. **服务指纹识别** - 增强的版本检测
4. **漏洞映射** - 将端口链接到已知的 CVE
5. **数据库导出** - 支持 SQLite/PostgreSQL
6. **Web 仪表板** - 实时扫描仪表板
7. **分布式扫描** - 多机协调
8. **服务脚本支持** - 执行自定义服务探测
## 🧪 测试
### 运行测试
```
pytest tests/ -v
pytest tests/ --cov=scanner
```
### 手动测试
```
# 使用 localhost 测试
python main.py --target 127.0.0.1 --start-port 80 --end-port 85
# 使用无效输入测试
python main.py --target "invalid"
python main.py --target 127.0.0.1 --start-port 70000
# 测试输出格式
python main.py --target 127.0.0.1 --output all
```
## 📝 代码质量标准
本项目遵循:
- **PEP 8** - Python 风格指南
- **Docstrings** - Google 风格的文档
- **Type Hints** - 完整的类型注释(Python 3.7+)
- **错误处理** - 全面的异常管理
- **日志记录** - 结构化的事件日志
### 代码质量检查
```
pylint main.py scanner.py utils.py banner_grabber.py report_generator.py
black main.py scanner.py utils.py banner_grabber.py report_generator.py
```
## 🤝 贡献
欢迎贡献!可改进的领域包括:
- 额外的服务指纹
- 性能优化
- 新的导出格式
- 增强的文档
- 测试覆盖率
## 📄 许可证
本项目按原样提供,用于教育目的。
## 🎤 面试谈话要点
**技术深度:**
- “使用 ThreadPoolExecutor 实现了多线程扫描,性能提升了 10 倍以上”
- “构建了自定义服务识别引擎,将 banner 匹配到 15+ 个已知服务”
- “设计了分离关注点(扫描、报告、工具)的模块化架构”
**安全知识:**
- “展示了对 TCP/IP 3 次握手和连接状态的理解”
- “针对网络超时和故障实现了适当的错误处理”
- “在工具设计中考虑了提权和网络礼仪”
**软件工程:**
- “遵循 PEP 8 并保持完整的 type hints 以提高代码清晰度”
- “实现了全面的日志记录以进行调试和监控”
- “创建了具有参数验证和用户反馈的专业 CLI”
**作品集价值:**
- “零外部依赖的生产就绪工具”
- “全面的文档和示例报告”
- “展示了完整的软件开发生命周期”
## 📞 支持
如有问题、疑问或建议:
1. 查看现有文档
2. 查看示例报告
3. 使用 `--verbose` 启用详细日志记录
4. 检查 `port_scanner.log` 以获取详细的错误信息
## 🌟 致谢
本项目旨在展示专业的 Python 开发实践和网络安全基础知识,供教育用途使用。
**版本:** 1.0.0
**最后更新:** 2024-06-09
**作者:** Cybersecurity Portfolio Project
标签:Banner抓取, Python, TCP/IP, 插件系统, 数据统计, 无后门, 服务器安全, 端口扫描, 网络安全, 网络工具, 逆向工具, 隐私保护