yoroki12/simple-port-scanner
GitHub: yoroki12/simple-port-scanner
一个基于 Python 标准库的轻量级多线程 TCP 端口扫描器,用于检测目标主机开放端口并提供基础服务识别与结果报告。
Stars: 0 | Forks: 0
# 简单的端口扫描器
一个使用 Python 构建的轻量级 TCP 端口扫描器,该项目作为学习实践,旨在帮助理解网络基础知识(TCP 握手、socket 编程)和并发编程。
## 功能
- **TCP Connect 扫描** — 使用原生 socket (`connect_ex()`) 通过完整的 TCP 握手来检测开放端口
- **多线程** — 使用 `ThreadPoolExecutor` 并发扫描多个端口,以获得更快的扫描结果
- **服务检测** — 识别开放端口上运行的常见服务(HTTP、SSH 等)
- **过滤端口检测** — 区分已关闭端口(主动拒绝)和被过滤端口(无响应 / 被防火墙拦截),包括 `EAGAIN` errno 等边缘情况
- **报告生成** — 将扫描结果连同时间戳和持续时间保存到文本文件中
## 学到了什么
构建这个项目帮助我理解了:
- TCP 三次握手以及 `connect_ex()` 如何与其进行交互
- 在网络层面上,开放、关闭和被过滤的端口之间的区别
- 为什么多线程对于网络扫描等 I/O 密集型任务至关重要
- 真实世界中的边缘情况(例如,调试为什么此扫描器和 `nmap` 在 SMTP 端口 25 上显示不同的结果,追踪发现是由 ISP 级别的过滤可能引起的 `EAGAIN` errno)
## 安装
```
git clone https://github.com/yoroki12/simple-port-scanner.git
cd simple-port-scanner
python3 SimplePortScanner.py
```
无需外部依赖 — 仅使用 Python 的标准库(`socket`、`concurrent.futures`、`datetime`)。
## 用法
运行脚本并按照提示操作:
```
python3 SimplePortScanner.py
```
系统会提示您输入:
- 目标 IP 或域名
- 要扫描的端口范围
## 示例输出
Mulai scan: 2026-07-19 10:23:01
Port 22: OPEN (ssh)
Port 80: OPEN (http)
Port 25: FILTERED (errno 11)
Selesai scan: 2026-07-19 10:23:03
Durasi: 0:00:02
Port OPEN: [(22, 'ssh'), (80, 'http')]
Port FILTERED: [25]
## 免责声明
本工具仅出于教育目的和授权的安全测试。请仅扫描您拥有或获得明确测试许可的系统(例如 `scanme.nmap.org`,这是由 Nmap 项目专门为测试目的提供的)。未经授权的端口扫描在您所在的司法管辖区可能属于违法行为。
## 路线图
- [ ] 通过 `argparse` 支持命令行参数
- [ ] 对 IP/域名的输入验证
- [ ] 大规模扫描的进度指示器
- [ ] 将结果导出为 JSON/CSV
- [ ] Banner grabbing 以实现更深度的服务识别
## 许可证
MIT
标签:Python, 插件系统, 数据统计, 无后门, 端口扫描, 网络安全, 网络编程, 逆向工具, 隐私保护