Manisankar-code/PortScanner
GitHub: Manisankar-code/PortScanner
一个基于Java多线程技术,通过真实TCP连接检测目标主机端口状态及服务类型的网络扫描工具。
Stars: 0 | Forks: 0
# 智能端口扫描工具
一个生产级、多线程的 Java 端口扫描器,使用 **真实 TCP socket 连接** 来检测目标主机上的开放、关闭和被过滤的端口。
## 项目结构
```
PortScannerProject/
├── src/
│ ├── scanner/
│ │ ├── PortScanner.java # Core scan engine with thread pool orchestration
│ │ ├── ScanWorker.java # Individual port probe via real TCP socket
│ │ └── ServiceDetector.java # Port-to-service name mapping (70+ services)
│ ├── network/
│ │ ├── HostValidator.java # Multi-strategy host reachability check
│ │ └── TimeoutConfig.java # Centralized timeout configuration
│ ├── utils/
│ │ └── OutputFormatter.java # ANSI-colored console output formatting
│ └── main/
│ └── Main.java # Interactive CLI entry point
├── out/ # Compiled .class files
└── README.md
```
## 环境要求
- **Java 17** 或更高版本
- 无外部依赖 —— 仅使用标准 Java 库
## 如何编译
```
javac -encoding UTF-8 -d out -sourcepath src src/main/Main.java
```
## 如何运行
```
java -cp out main.Main
```
## 扫描模式
| 模式 | 描述 |
|------|-------------|
| **[1] 单端口扫描** | 扫描目标主机上的一个特定端口 |
| **[2] 端口范围扫描** | 扫描连续范围(例如,端口 1-1024) |
| **[3] 多个特定端口** | 扫描逗号分隔的列表(例如,22,80,443) |
| **[4] 前 100 个常用端口** | 扫描最常用的 100 个端口 |
| **[5] 退出** | 退出应用程序 |
## 示例输出
```
+--------------------------------------------------------------+
| SMART PORT SCANNER TOOL v1.0 |
+--------------------------------------------------------------+
| Target Host : google.com |
| Ports Count : 7 |
+--------------------------------------------------------------+
| Validating host reachability... |
+--------------------------------------------------------------+
[+] DNS resolved: google.com -> 142.251.220.14
[+] Host is reachable (ICMP)
>> Host validated successfully. Starting scan...
--------------------------------------------------------
PORT STATUS SERVICE RESPONSE TIME
--------- --------- ------------- -------------
21 FILTERED FTP 1515ms
22 FILTERED SSH 1515ms
53 FILTERED DNS 1515ms
80 OPEN HTTP 62ms
443 OPEN HTTPS 62ms
3306 FILTERED MYSQL 1515ms
8080 FILTERED HTTP-ALT 1515ms
+------------------------------------------+
| SCAN SUMMARY |
+------------------------------------------+
| Total Ports Scanned : 7 |
| Open : 2 |
| Closed : 0 |
| Filtered : 5 |
| Scan Duration : 1.52 seconds |
+------------------------------------------+
```
## 内部扫描原理
```
┌─────────────────────────────────────────────────────┐
│ Main.java │
│ (User Input + Menu Selection) │
└──────────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ PortScanner.java │
│ (Creates ExecutorService fixed thread pool) │
│ (Submits ScanWorker tasks for each port) │
│ (Collects Future results) │
└──────────────────────┬──────────────────────────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────────┐┌──────────────┐┌──────────────┐
│ ScanWorker ││ ScanWorker ││ ScanWorker │
│ (Port 80) ││ (Port 443) ││ (Port 22) │
│ ││ ││ │
│ Socket. ││ Socket. ││ Socket. │
│ connect() ││ connect() ││ connect() │
└──────┬───────┘└──────┬───────┘└──────┬───────┘
│ │ │
▼ ▼ ▼
Connection Connection Timeout
Succeeded Succeeded Reached
│ │ │
▼ ▼ ▼
OPEN OPEN FILTERED
```
### 端口状态检测逻辑
每个 `ScanWorker` 创建一个 **真实的、未连接的 `java.net.Socket`** 并调用:
```
socket.connect(new InetSocketAddress(host, port), timeoutMs);
```
| 结果 | 异常 | 状态 |
|---------|-----------|--------|
| 连接成功 | _无_ | **OPEN** —— 有服务正在监听 |
| 连接被拒绝 | `ConnectException` | **CLOSED** —— 操作系统拒绝了连接 |
| 超时内无响应 | `SocketTimeoutException` | **FILTERED** —— 可能被防火墙拦截 |
| 无路由到主机 | `NoRouteToHostException` | **FILTERED** —— 网络不可达 |
### 主机验证(扫描前)
在扫描开始之前,`HostValidator` 执行 3 步可达性检查:
1. **DNS 解析** —— `InetAddress.getByName()` 以验证主机名可解析
2. **ICMP Ping** —— `InetAddress.isReachable()` 用于直接可达性检查
3. **TCP 回退** —— 如果 ICMP 被阻止,尝试连接端口 80 或 443
### 线程模型
- 使用 `Executors.newFixedThreadPool(N)`,其中 N 上限为 200
- 线程池大小自动调整:`min(50, portCount)` 以实现最佳资源利用
- 每个端口扫描作为独立的 `Callable` 任务运行
- 结果通过 `Future.get()` 收集,并具有超时保护
## 已知服务(70+ 映射)
扫描器识别常见端口的服务,包括:
| 端口 | 服务 | 端口 | 服务 | 端口 | 服务 |
|------|---------|------|---------|------|---------|
| 21 | FTP | 80 | HTTP | 443 | HTTPS |
| 22 | SSH | 110 | POP3 | 993 | IMAPS |
| 23 | TELNET | 143 | IMAP | 995 | POP3S |
| 25 | SMTP | 389 | LDAP | 3306 | MYSQL |
| 53 | DNS | 445 | SMB | 5432 | POSTGRESQL |
...以及 55+ 更多服务,包括 Redis, MongoDB, Kafka, Docker, Kubernetes, Elasticsearch 等。
## 安全与性能
- **线程池上限** 为 200 个线程,以防止资源耗尽
- **超时限制** 在 100ms 和 30,000ms 之间
- **大规模扫描警告**:扫描 10,000+ 端口时会提示确认
- **异常安全**:所有 socket 操作都包裹在 try-catch-finally 中
- **无模拟数据**:每个结果都来自真实的 TCP 连接尝试
- **优雅关闭**:使用 `ExecutorService.awaitTermination()` 并在必要时强制关闭
# 由 ManiShankar 创建
标签:Awesome, DNS枚举, Java 17, JS文件枚举, MIT 许可证, Qt框架, Socket编程, TCP连接, 二进制发布, 域名枚举, 并发扫描, 开源工具, 插件系统, 数据泄露防护, 数据统计, 文档结构分析, 无依赖, 服务识别, 端口扫描, 端口检测, 系统管理, 网络安全工具, 网络工具, 网络探测