ArtinDoroudi/port-scanner
GitHub: ArtinDoroudi/port-scanner
这是一个基于Python标准库构建的多线程TCP端口扫描器,具备Banner抓取与服务指纹识别功能。
Stars: 0 | Forks: 0
# 端口扫描器


一个支持 banner 抓取和服务指纹识别的多线程 TCP 端口扫描器,
使用 Python 构建,仅依赖标准库。
我构建这个工具是为了深入理解服务如何在网络上暴露自身——
包括 socket 层面的 TCP 握手是什么样的、像 Nmap 这样的工具如何识别运行中的服务,
以及线程如何改变 I/O 密集型任务的性能表现。
## 演示
```
██████╗ ██████╗ ██████╗ ████████╗ ███████╗ ██████╗ █████╗ ███╗ ██╗
██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝ ██╔════╝██╔════╝██╔══██╗████╗ ██║
██████╔╝██║ ██║██████╔╝ ██║ ███████╗██║ ███████║██╔██╗██║
██╔═══╝ ██║ ██║██╔══██╗ ██║ ╚════██║██║ ██╔══██║██║╚████║
██║ ╚██████╔╝██║ ██║ ██║ ███████║╚██████╗██║ ██║██║ ╚███║
╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚══╝
TCP Connect Scanner with Banner Grabbing
Only scan hosts you own or have explicit permission to scan.
Target : scanme.nmap.org
Ports : 1-1024 (1024 ports)
Threads : 100
[OPEN] 22
[OPEN] 80
Scan complete in 1.44s
Grabbing banners from open ports...
============================================================
Port Scanner Report
============================================================
Target : scanme.nmap.org
Scanned at : 2026-04-06T08:11:28.195875+00:00
Ports scanned: 1024
Duration : 1.44s
Open ports : 2
============================================================
PORT STATE SERVICE BANNER
--------------------------------------------------------
22 open SSH SSH-2.0-OpenSSH_6.6.1p1 Ubuntu
80 open HTTP HTTP/1.1 200 OK
============================================================
```
## 安装
```
git clone https://github.com/ArtinDoroudi/port-scanner.git
cd port-scanner
pip install -r requirements.txt
```
需要 Python 3.11+。除了用于终端颜色的 `colorama` 外,没有第三方依赖。
## 使用方法
```
# 扫描最常用端口
python -m scanner --target 127.0.0.1
# 使用 JSON 输出扫描自定义范围
python -m scanner --target 192.168.1.1 --ports 1-1024 --output json
# 仅扫描特定端口
python -m scanner --target example.com --ports 22,80,443
# 将结果保存到文件
python -m scanner --target 10.0.0.1 --ports 1-1024 --save results.json
# 使用更多线程进行更快的扫描
python -m scanner --target 192.168.1.1 --ports 1-65535 --threads 500
# 使用速率限制进行更安静的扫描(20 次/秒)
python -m scanner --target 192.168.1.1 --rate-limit 0.05
# 仅显示开放端口,跳过 banner 抓取
python -m scanner --target 192.168.1.1 --open-only --no-banner
```
### 所有选项
| Flag | 默认值 | 描述 |
|---|---|---|
| `--target`, `-t` | 必填 | 要扫描的主机名或 IP |
| `--ports`, `-p` | `1-1024` | 端口范围:`1-1024`、`80` 或 `22,80,443` |
| `--threads`, `-n` | `100` | 并发线程数 |
| `--timeout` | `1.0` | 每个端口的超时时间(秒) |
| `--rate-limit` | `0` | 线程间的延迟(秒) |
| `--output`, `-o` | `text` | 输出格式:`text` 或 `json` |
| `--save`, `-s` | — | 将报告写入文件而非 stdout |
| `--open-only` | — | 仅显示开放端口 |
| `--no-banner` | — | 跳过 banner 抓取 |
## 工作原理
该扫描器执行 **TCP connect 扫描**。对于每个端口,它会尝试完成完整的三次握手——SYN、SYN-ACK、ACK。握手完成表示端口开放。收到 RST 回复表示端口关闭。无响应表示被过滤(防火墙正在丢弃数据包)。
多线程使其速度很快。端口扫描属于 I/O 密集型任务:CPU 几乎所有时间都在等待网络回复。Python 的 GIL 会在阻塞 I/O 期间释放,因此 100 个线程可以同时各自等待响应——扫描 1,024 个端口只需约 1.5 秒,而非约 17 分钟。
一旦识别出开放端口,扫描器会再次连接并读取服务首先发送的内容——即其 banner。SSH 会立即自我声明(`SSH-2.0-OpenSSH_8.9`)。HTTP 需要发送探测请求(`HEAD / HTTP/1.0`)来获取响应。Banner 内容会与已知签名进行匹配;如果没有匹配项,则会在 IANA 注册表中查找该端口号。
**包含图表的完整技术深度解析:** [artindoroudi.github.io/port-scanner](https://ArtinDoroudi.github.io/port-scanner)
## 项目结构
```
port-scanner/
├── scanner/
│ ├── __main__.py # CLI interface (argparse)
│ ├── core.py # TCP scanning + threading
│ ├── banner.py # Banner grabbing + service fingerprinting
│ └── reporter.py # JSON and text output
├── tests/
│ └── test_scanner.py
├── docs/
│ └── index.html # Technical explainer (GitHub Pages)
├── examples/
│ └── sample_output.json
└── .github/
└── workflows/
└── tests.yml
```
## 局限性
- 仅支持 TCP connect 扫描——不支持 UDP,不支持 SYN(半开)扫描
- 不支持 IPv6
- Banner 抓取仅读取前 1024 字节
- 服务指纹识别使用的是小型签名列表,而非 Nmap 的完整探测数据库
## 道德声明
仅扫描您拥有或已获得明确书面许可的主机。
未经授权的端口扫描在您的司法管辖区可能属于违法行为。
本工具仅供学习和授权的安全评估使用。
## 参考资料
- [RFC 793](https://www.rfc-editor.org/rfc/rfc793) — TCP 规范
- [Nmap 参考指南](https://nmap.org/book/man.html)
- [IANA 端口注册表](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
标签:Banner抓取, DNS解析, Nmap, Python, Scrypt密钥派生, Socket, Socket编程, TCP Connect, 云存储安全, 子域名枚举, 并发扫描, 开源项目, 插件系统, 数据统计, 无后门, 服务器安全, 服务指纹识别, 标准库, 端口扫描, 系统安全, 网络安全, 网络工具, 网络扫描, 虚拟驱动器, 逆向工具, 隐私保护