M6Jet/Port-Scanner-Python-
GitHub: M6Jet/Port-Scanner-Python-
一款纯标准库实现的轻量级多线程 TCP 端口扫描器,通过高并发连接解决了大规模端口扫描耗时长的问题,适合授权安全审计与自动化脚本集成。
Stars: 1 | Forks: 0
# 🔍 多线程 Python 端口扫描器
一个快速、多线程的 TCP 端口扫描器,使用 Python 构建,专为授权的网络侦察和安全审计设计。它使用线程池并发扫描数千个端口,支持服务名解析、可选的 banner grabbing 以及机器可读的 JSON 输出。
## 功能
- **并发扫描** — 通过可配置的 `ThreadPoolExecutor` 线程池实现
- **灵活的端口规范** — 支持范围 (`1-1024`)、列表 (`22,80,443`) 或混合模式 (`1-100,8080`)
- **服务检测** — 将已知端口号解析为服务名 (22 → ssh)
- **Banner grabbing** (`--banner`) — 用于指纹识别开放端口上的服务
- **JSON 导出** (`--json results.json`) — 便于通过管道传递给其他工具
- **简洁的 CLI** — 基于 `argparse` 实现,无交互式提示,完全支持脚本化
- 优雅处理无法解析的主机和无效输入
## 为什么多线程很重要
单线程扫描器在每个关闭或被过滤的端口上都会等待完整的连接超时,且只能逐个进行。面对具有 0.5 秒超时的远程主机,扫描 1000 个端口可能需要几分钟时间。而线程池会并发发起多个连接尝试,因此总扫描时间受限于最慢的 *批次*,而不是每个端口超时的 *总和*。
### 基准测试
在我的机器上针对 `scanme.nmap.org`(Nmap 项目提供的允许扫描的测试主机)进行测量,在 0.5 秒超时下扫描端口 1–1024:
| 模式 | 耗时 |
|----------------------------|-----------|
| 单线程 (1 个 worker) | `106.51 s` |
| 多线程 (200 个 worker)| `0.72 s` |
| **加速比** | **148×** |
## 安装
```
git clone https://github.com/M6Jet/Port-Scanner-Python-.git
cd Port-Scanner-Python-
# 无需第三方依赖 — 仅使用标准库。
python3 scanner.py --help
```
## 使用方法
```
# 扫描 host 上的 well-known ports
python3 scanner.py scanme.nmap.org
# 使用 200 个 threads 扫描特定范围
python3 scanner.py 192.168.1.1 -p 1-65535 -t 200
# 扫描少量命名 ports 并抓取 banners
python3 scanner.py example.com -p 22,80,443,8080 --banner
# 将结果导出至 JSON
python3 scanner.py 10.0.0.5 -p 1-1024 --json scan.json
```
### 选项
| 标志 | 描述 | 默认值 |
|------------------|--------------------------------------------|---------|
| `target` | 要扫描的主机名或 IP (位置参数) | — |
| `-p, --ports` | 端口规范:`1-1024`、`22,80` 或混合模式 | `1-1024`|
| `-t, --threads` | 并发 worker 线程数 | `100` |
| `--timeout` | 每个连接的超时时间 (秒) | `0.5` |
| `--banner` | 尝试对开放端口进行 banner grabbing | 关闭 |
| `--json FILE` | 将结果写入 JSON 文件 | — |
## 示例输出
```
Scan report for scanme.nmap.org (45.33.32.156)
Scanned 1024 ports in 2.13s — 2 open
PORT STATE SERVICE BANNER
------ ----- ------- ------
22 open ssh SSH-2.0-OpenSSH_6.6.1p1 Ubuntu
80 open http HTTP/1.1 200 OK
```
## 工作原理
每个端口通过 `socket.connect_ex` 进行扫描,该方法会返回错误代码,而不会在端口关闭时引发异常——这使得在数万个端口中的热路径保持快速。连接尝试被分派给 `ThreadPoolExecutor`,并随着每个 future 的完成来收集结果。随后,开放端口将被附加服务名,并可选择性地附加 banner。
## ⚠️ 合规使用
本工具仅供**授权**的安全测试和教育使用。请仅扫描您拥有或获得明确书面测试许可的主机。未经授权的端口扫描在您所在的司法管辖区可能是非法的。`scanme.nmap.org` 由 Nmap 项目专门提供用于合法的扫描测试。
## 许可证
请参阅 [LICENSE](LICENSE)。
标签:Python, 插件系统, 数据统计, 无后门, 端口扫描, 网络工具, 逆向工具