raunakp0690/port-scanner
GitHub: raunakp0690/port-scanner
一个基于 Python 的多线程 TCP 端口扫描器,利用并发连接快速检测目标主机开放端口并获取服务 banner,用于网络侦察与安全学习。
Stars: 0 | Forks: 0
# 端口扫描器
一个用 Python 构建的多线程 TCP 端口扫描器,旨在理解网络侦察在底层的实际工作原理——包括 socket、TCP 三次握手、并发以及基本的服务指纹识别。
## 功能简介
- 扫描目标主机的指定端口范围或端口列表
- 采用多线程技术,扫描 1000+ 个端口只需几秒钟,而不是几分钟
- 通过端口号识别常见服务(SSH、HTTP、FTP 等)
- 可选获取服务 **banner** ——即服务在建立连接后返回的文本信息,这可以揭示软件名称/版本(对于识别过时、存在漏洞的软件非常有用)
## 工作原理
1. **解析**:通过 `socket.gethostbyname` 将目标主机名解析为 IP 地址。
2. **解析端口**:将请求的端口解析为列表(支持 `80`、`1-1024`、`22,80,443`)。
3. **队列 + 线程**:将端口推入 `Queue` 中;一个工作线程池并发地从队列中拉取任务,每个线程尝试对 `(target, port)` 发起 TCP `connect_ex()` 请求。
- `connect_ex` 成功时返回 `0` ——表示 TCP 握手已完成,且有进程正在该端口上监听。
- 其他任何返回值(超时、拒绝、不可达)都意味着该端口已关闭或被过滤。
4. **获取 Banner(可选)**:对于开放端口,脚本会读取服务最先发回的任何字节。如果没有收到数据(在 HTTP 中很常见),它会发送一个最小化的 `HEAD / HTTP/1.1` 请求来引发响应。
5. **报告**:所有开放的端口及任何获取到的 banner 将在最后连同总扫描时间一起打印出来。
## 用法
```
# 扫描 localhost 上的默认 range (1-1024)
python port_scanner.py -t 127.0.0.1
# 使用 banner grabbing 扫描特定 range
python port_scanner.py -t scanme.nmap.org -p 1-1000 --banner
# 仅扫描特定 ports
python port_scanner.py -t 192.168.1.1 -p 22,80,443
# 调整 speed / accuracy
python port_scanner.py -t 127.0.0.1 -p 1-65535 --threads 200 --timeout 0.3
```
## 输出示例
```
Scanning scanme.nmap.org (45.33.32.156)
Ports: 1-1000 | Threads: 100 | Timeout: 0.5s
[+] Port 22 OPEN (SSH) -> SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.13
[+] Port 80 OPEN (HTTP) -> HTTP/1.1 200 OK
Scan complete in 1.84s — 2 open port(s) found.
Open ports: [22, 80]
```
## 构建该项目我学到了什么
- 为什么在扫描时 `connect()` 和 `connect_ex()` 的选择至关重要(后者在失败时不会抛出异常,这使得多线程循环的代码更加整洁)。
- 为什么在这里线程——而不是多进程——是正确的工具:瓶颈在于等待网络 I/O,而不是 CPU,因此线程可以“并行”运行数百次扫描,且不会产生太多额外开销。
- `timeout` 值与扫描准确性之间的权衡:设置得太短,响应缓慢但开放的端口会被误报为关闭;设置得太长,完整扫描会耗费极其漫长的时间。
- 为什么获取 banner 是一种真实的侦察技术——过时的服务 banner(例如旧版本的 OpenSSH)通常是攻击者或进行审计的防御者最先关注的目标。
## 负责任地使用
该工具仅对我拥有或获得明确授权进行测试的主机执行 **TCP connect 扫描**(例如 `scanme.nmap.org`,Nmap 官方公开的测试目标,或我自己的机器/虚拟机)。在大多数司法管辖区,未经许可扫描他人系统是非法的,包括根据印度的《信息技术法》(IT Act, 2000)。
## 可能的扩展
- 添加 UDP 扫描支持
- 通过 TTL/窗口大小分析添加 OS 指纹识别
- 将结果导出为 JSON/CSV 以便生成报告
- 使用 raw socket 添加 `--stealth` SYN 扫描模式(需要 root 权限)
标签:DNS查询工具, Python, 插件系统, 无后门, 端口扫描器, 网络安全, 网络工具, 逆向工具, 隐私保护