loerayamil-star/escaner-puertos
GitHub: loerayamil-star/escaner-puertos
一个使用 Python、Tkinter 和 threading 构建的轻量级 TCP 端口扫描桌面工具,可在图形界面中实时显示端口开放状态及关联服务。
Stars: 0 | Forks: 0
# 端口扫描器
我的计算机工程项目集 #5 —— DevSecOps 路线。
这是一个用于扫描主机 TCP 端口的桌面工具,其图形界面使用 Tkinter 构建。它可以实时显示哪些端口处于开放状态、关联的服务以及扫描进度——并且不会导致窗口卡顿。
## 开发动机
端口扫描是攻防安全领域的基础技术之一。从零开始构建它,而不仅仅是使用 `nmap`,迫使我深入理解了底层原理:TCP 连接是如何工作的、为什么在图形界面中需要使用线程,以及如何安全地在辅助线程与 UI 之间进行通信。
## 技术栈
| 技术 | 用途 |
|------------|-----|
| Python 3 | 基础编程语言 |
| Tkinter + ttk | 图形界面(窗口、Treeview、Progressbar) |
| `socket` | 用于测试各个端口的 TCP 连接 |
| `threading` | 在辅助线程中执行扫描,防止 UI 卡死 |
## 界面
- **输入字段:** 主机(默认值:`localhost`)、起始端口和结束端口
- **扫描按钮:** 在扫描期间会被禁用,以避免并发执行
- **进度条:** 实时显示扫描进度及百分比
- **结果表格(Treeview):** 包含三列 —— 端口 / 服务 / 状态
```
┌─────────────────────────────────────────┐
│ Host: [localhost ] │
│ Puerto Inicial: [1 ] Final: [1024] │
│ [ Iniciar escaneo ] │
│ ████████████░░░░░░░░ Escaneando... 61%│
│ │
│ Puerto │ Servicio │ Estado │
│ ───────────────────────────── │
│ 22 │ SSH │ Abierto │
│ 80 │ HTTP │ Abierto │
│ 443 │ HTTPS │ Abierto │
└─────────────────────────────────────────┘
```
## 如何运行
**环境要求:** Python 3.8 或更高版本。无需任何外部依赖。
```
git clone https://github.com/loerayamil-star/escaner-puertos.git
cd escaner-puertos
python3 escaner_puertos.py
```
## 我应用的技术概念
**`connect_ex()` vs `connect()`**
如果端口已关闭,`socket.connect()` 会抛出异常——对全部 1024 个端口使用 `try/except` 进行处理不仅低效而且代码冗长。如果连接成功,`connect_ex()` 会返回 `0`;如果失败,则返回错误代码,且不会中断执行流程。这样我们就可以简单地编写如下代码:
```
return socket.connect_ex((host, puerto)) == 0
```
**使用 `daemon=True` 的 Threading**
辅助线程被标记为 daemon(守护线程),这样当用户关闭窗口时,它会自动终止,不会在系统中留下孤儿进程。
**使用 `root.after()` 进行线程间通信**
Tkinter 不是线程安全的——辅助线程不能直接修改控件,否则会导致 UI 崩溃。正确的解决方案是使用 `root.after(0, lambda: ...)` 将更新任务排入主线程的队列中,该函数会在 Tkinter event loop 的下一个周期中执行。
```
self.root.after(0, lambda: self.tabla.insert("", "end", values=(puerto, servicio, "Abierto")))
```
## 伦理使用声明
## 未来的改进方向
- [ ] 将结果导出为 `.txt` 或 `.csv`
- [ ] 除了 TCP 外,支持 UDP 扫描
- [ ] 服务版本检测(banner grabbing)
- [ ] 使用多个并发线程进行扫描以提升速度
- [ ] 历史扫描记录
## 关于本项目
本项目是作为自学 DevSecOps 路线的一部分而开发的。这是我第一次有意识地深入使用 `socket` 和 `threading`——我的目标是彻底理解其底层机制,而不仅仅是让工具能够运行起来。
标签:GUI, Python, Tkinter, 插件系统, 数据统计, 无后门, 端口扫描, 网络安全, 网络编程, 隐私保护