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连接, 二进制发布, 域名枚举, 并发扫描, 开源工具, 插件系统, 数据泄露防护, 数据统计, 文档结构分析, 无依赖, 服务识别, 端口扫描, 端口检测, 系统管理, 网络安全工具, 网络工具, 网络探测