F0CUSMSK/PortScanner

GitHub: F0CUSMSK/PortScanner

一个基于 Python 标准库的友好型端口扫描工具,旨在帮助初学者通过实践学习计算机网络与多线程编程知识。

Stars: 0 | Forks: 0

# 🔍 PortScanner - 了解网络是如何工作的! 一个**友好且具教育意义**的端口扫描器,能让你在使用过程中学习网络知识! 你可以把它想象成一个“网络侦探”,敲击各个门(端口)看看哪些会有回应。 ## ✨ 功能 - **快速并行扫描** - 同时扫描多个主机和端口 - **服务检测** - 识别开放端口上运行的服务 - **多种导出格式** - JSON, TXT 和 HTML 报告 - **专业的日志记录** - 彩色控制台输出和文件日志 - **教育导向** - 学习网络、socket 和线程知识 - **无外部依赖** - 仅使用 Python 标准库 ## 📦 安装与快速开始 ### 前置条件:Python 3.7+ 检查你的 Python 版本: ``` python3 --version ``` ### 选项 1:快速运行(免安装) ``` # 克隆仓库 git clone https://github.com/yourusername/portscanner.git cd portscanner # 在 interactive mode 下运行 python3 main.py --interactive ``` ### 选项 2:安装包 ``` git clone https://github.com/yourusername/portscanner.git cd portscanner pip install -e . ``` **无需使用 pip 安装依赖!** 我们仅使用 Python 的标准库。 👉 **[查看 GETTING_STARTED.md 获取详细说明](GETTING_STARTED.md)** ## 🎓 教育价值 本项目教你学习: - **Socket 与 TCP/IP** - 网络连接是如何工作的 - **Threading** - 用于提升速度的并行处理 - **端口状态** - OPEN, CLOSED, FILTERED 概念 - **服务检测** - 端口到服务的映射(IANA 标准) - **CLI 开发** - 命令行参数解析 - **专业代码** - 类型提示、文档和错误处理 ## ⚠️ 重要免责声明 **本工具仅供教育目的使用。** - ✅ 扫描你自己的网络 - ✅ 在获得明确的书面许可后进行扫描 - ✅ 学习网络概念 - ❌ 未经许可,请勿扫描他人的网络 - ❌ 请勿用于恶意目的 - ❌ 未经授权的网络扫描可能是违法的 ## 🚀 快速开始(只需 5 分钟!) ### 1️⃣ 不知道从何开始? **试试交互模式!** 它会问你一些友好的问题: ``` python main.py --interactive ``` 如果你是新手,这非常完美——只需回答问题,剩下的交给我们! ### 2️⃣ 知道自己想要什么? ``` # 扫描你的计算机(最容易测试) python main.py --target 127.0.0.1 --ports 1-1000 # 扫描你的家庭网络(请先征求许可!) python main.py --target 192.168.1.1 --ports 1-1000 # 同时扫描多台计算机 python main.py --target 192.168.1.1,192.168.1.2 --ports 1-1000 ``` 就是这样!它会显示哪些端口是“开放的”(有服务响应),并告诉你可能正在运行哪些服务。 ## 📚 新手指南 ### 什么是“端口”? 假设你的电脑是一栋公寓楼: - 电脑就是这栋楼 - 端口就像是门(编号为 1-65535) - 有些门后有服务(SSH, HTTP 等) - 有些门是锁着的(关闭的端口) - 有些被保安挡住了(防火墙/被过滤的) **常见端口示例:** - 端口 22: SSH(安全的远程登录) - 端口 80: HTTP(网站) - 端口 443: HTTPS(安全网站) - 端口 3306: MySQL(数据库) ### 当你运行扫描时会发生什么? ``` 1. You tell us which computer to scan (IP address) 2. We send small "hello" messages to each port 3. If a port says "hello back!" → It's OPEN ✓ 4. If it says "go away!" → It's CLOSED ✗ 5. If it doesn't answer → It's FILTERED (firewall blocking) 6. We create a nice report showing what we found ``` ### 运行你的第一次扫描 **步骤 1:找到一个要扫描的 IP** 最安全的扫描 IP 是你自己的电脑: ``` # Windows:打开 Command Prompt ipconfig # Mac/Linux:打开 Terminal ifconfig ``` 寻找类似于 `192.168.x.x` 或 `10.0.0.x` 的 IP **步骤 2:运行扫描** ``` python main.py --target YOUR_IP_HERE --ports 1-1000 ``` 将 `YOUR_IP_HERE` 替换为你找到的 IP。 **步骤 3:等待结果** 你会看到一个进度条。完成后,它会为你显示开放的端口! **步骤 4:查看报告** 在 `reports/` 文件夹中查看: - `scan_*.html` - 精美报告(可在浏览器中打开!) - `scan_*.txt` - 简单的文本版本 - `scan_*.json` - 用于分析的数据 ## 🤔 常见问题 (FAQ) ### “我会用这个弄坏什么东西吗?” 不会!这个工具只会: - 发送连接尝试(就像敲门一样) - 不会利用任何漏洞 - 不会发送恶意数据 - 不会修改任何东西 它是完全安全且只读的。 ### “如果我不知道 IP 地址怎么办?” **选项 1:** 查找你自己的 IP: ``` # Windows ipconfig # Mac/Linux ifconfig ``` **选项 2:** 扫描你的本地网络: ``` python main.py --target 192.168.1.1 --ports 1-1000 ``` ### “为什么有些扫描需要更长的时间?” 端口扫描需要时间,因为我们正在: - 并行连接到许多端口(多线程) - 等待响应(默认超时 = 2 秒) - 检查的端口越多 = 耗时越长 **让它更快:** ``` python main.py --target 192.168.1.1 --ports 1-1000 --threads 100 --timeout 1.0 ``` ### “我应该扫描什么?” **合适的目标(你拥有它们):** - ✅ 你自己的电脑 (127.0.0.1) - ✅ 你的家庭网络(需获得允许) - ✅ 实验室设备(在学校/培训中) - ✅ 你搭建的测试服务器 **不合适的目标(需先获得许可):** - ❌ 朋友的电脑 - ❌ 学校的网络 - ❌ 公司的网络 - ❌ 互联网上的随机 IP 地址 ### “这些颜色代表什么?” ``` 🟢 Green = Good/Success 🔴 Red = Problem/Error 🟡 Yellow = Warning 🔵 Blue = Information ``` ### “为什么它显示 OPEN, CLOSED, FILTERED?** - **OPEN** 🟢: 服务正在监听,我们成功连接了! - **CLOSED** 🔴: 端口存在,但没有程序在监听 - **FILTERED** 🟡: 防火墙阻止了我们的尝试(无响应) ### “我可以扫描一个网站吗?” **技术上是可以的,但是:** - 你需要该网站的 IP 地址 - 网站所有者可能设置了防火墙 - 你可能会触发安全警报 - **务必先获得许可!** ``` # 查找网站的 IP nslookup google.com # Windows dig google.com # Mac/Linux # 但未经许可请勿扫描! ``` ### “我遇到了错误。该怎么办?” 常见错误及解决方法: **“Invalid IP address”** ``` ❌ python main.py --target "hello.world" ✅ python main.py --target 192.168.1.1 ``` **“Port range invalid”** ``` ❌ python main.py --ports 500-200 (start > end) ✅ python main.py --ports 200-500 ``` **“Need admin/root for ports 1-1023”** ``` # Windows:以 Administrator 身份运行 # Mac/Linux: sudo python3 main.py --target 192.168.1.1 --ports 1-1023 ``` ### “如何从文件中读取进行扫描?” 创建一个名为 `targets.txt` 的文件: ``` 192.168.1.1 192.168.1.2 192.168.1.3 # 你可以使用 # 添加注释 192.168.1.4 ``` 然后: ``` python main.py --file targets.txt --ports 1-1000 ``` ### “如果我想扫描很多端口怎么办?” ``` # 扫描所有 65535 个端口(每台计算机大约需要 30 秒) python main.py --target 192.168.1.1 --ports all # 或者指定一个大范围 python main.py --target 192.168.1.1 --ports 1-65535 ``` ## 📖 学习路径 ### 级别 1:初学者 - [ ] 运行交互模式:`python main.py --interactive` - [ ] 扫描你自己的电脑:`python main.py --target 127.0.0.1` - [ ] 查看 `reports/` 文件夹中的 HTML 报告 - [ ] 阅读代码和注释 ### 级别 2:中级 - [ ] 扫描你的家庭网络 - [ ] 了解不同端口上运行的服务 - [ ] 查看 JSON 报告以了解数据格式 - [ ] 修改代码以添加自定义消息 ### 级别 3:高级 - [ ] 研究 `host_scanner.py` 中的线程架构 - [ ] 理解 `port_scanner.py` 中 socket 的工作原理 - [ ] 添加新功能(Banner 抓取、UDP 扫描等) - [ ] 将数据用于分析/自动化 ## 🏗️ 工作原理(简版) ### 全局概览 ``` 1. You run: python main.py --target 192.168.1.1 2. We ask: "What IP? What ports? How many threads?" 3. We check: "Are these valid? Do these files exist?" 4. We scan: "Hello port 22? Port 80? Port 443?" (We do this 50 at a time to be fast) 5. We identify: "Port 22 is open → SSH service" 6. We report: "Found 3 open ports! Here's an HTML report" 7. Done! You can view the report in your browser ``` ### 线程 - 为什么它这么快 **没有线程(慢):** ``` Port 1: Check, wait 2 seconds Port 2: Check, wait 2 seconds Port 3: Check, wait 2 seconds ... Total: 2000 seconds for 1000 ports 😴 ``` **使用线程(快 - 我们的方式):** ``` Ports 1-50: Check all at once, wait 2 seconds Ports 51-100: Check all at once, wait 2 seconds ... Total: 40 seconds for 1000 ports ⚡ ``` 我们使用了一种叫做 **ThreadPoolExecutor** 的机制,就像有 50 个工人同时在检查端口一样! ## 📖 命令行选项 ### 必填项(其中之一): ``` --target, -t IP Single IP or comma-separated (192.168.1.1,192.168.1.2) --file, -f PATH File containing IPs (one per line) --interactive Ask me friendly questions! (recommended for beginners) ``` ### 可选项: ``` --ports, -p RANGE Port range: "1-1000" or "all" (default: 1-1000) Examples: "22", "22-443", "1-65535", "all" --threads INT Threads per host (default: 50, max: 256) --timeout FLOAT Socket timeout in seconds (default: 2.0) --export FORMATS Export: json, txt, html, all (default: txt) --output, -o DIR Output directory (default: reports) --verbose, -v Enable verbose output --quiet, -q Minimal output (only results) ``` ## 📊 输出示例 ### 控制台输出 ``` ╔════════════════════════════════════════════════════════════════════╗ ║ PortScanner - Starting Multi-Host Scan ║ ║ 5 targets ║ ╚════════════════════════════════════════════════════════════════════╝ ═════════════════════════════════════════════════════════════════════ === Scanning Host: 192.168.1.1 === ═════════════════════════════════════════════════════════════════════ [250/1000] 25% ████████░░░░░░░░░░░░░░░░ 192.168.1.1 [+] 22/tcp OPEN → SSH (Secure Shell) [+] 80/tcp OPEN → HTTP (HyperText Transfer Protocol) [+] 443/tcp OPEN → HTTPS (HTTP Secure) ✓ Host 192.168.1.1 scan complete: 3 open, 997 closed, 0 filtered (2.45s) ``` ### JSON 报告 ``` { "metadata": { "scan_time": "2024-06-23T14:30:45", "tool": "PortScanner", "version": "1.0.0" }, "scan_summary": { "total_hosts": 1, "total_ports_scanned": 1000, "total_open_ports": 3, "total_closed_ports": 997, "total_filtered_ports": 0, "total_scan_time": 2.45, "avg_time_per_host": 2.45 }, "hosts": { "192.168.1.1": { "open_ports": [22, 80, 443], "services": [ { "port": 22, "protocol": "tcp", "service": "ssh", "description": "Secure Shell (SSH)" } ] } } } ``` ### HTML 报告 美观且具有交互性的 HTML 报告,包含: - 统计摘要 - 可视化图表和进度条 - 按主机分组的端口详情 - 移动端响应式设计 - 适合打印的布局 ## 📖 命令行选项 ### 必填项(其中之一): ``` --target, -t IP Single IP or comma-separated (192.168.1.1,192.168.1.2) --file, -f PATH File containing IPs (one per line) ``` ### 可选项: ``` --ports, -p RANGE Port range: "1-1000" or "all" (default: 1-1000) Examples: "22", "22-443", "1-65535", "all" --threads INT Threads per host (default: 50, max: 256) --timeout FLOAT Socket timeout in seconds (default: 2.0) --export FORMATS Export: json, txt, html, all (default: txt) --output, -o DIR Output directory (default: reports) --verbose, -v Enable verbose output --quiet, -q Minimal output (only results) ``` ## 🏗️ 项目结构 ``` PortScanner/ ├── main.py # CLI entry point ├── requirements.txt # Dependencies (empty - no external deps!) ├── README.md # This file │ ├── portscanner/ │ ├── __init__.py │ │ │ ├── utils/ │ │ ├── __init__.py │ │ ├── validator.py # Input validation │ │ └── logger.py # Logging & colored output │ │ │ ├── scanner/ │ │ ├── __init__.py │ │ ├── port_scanner.py # Core TCP socket scanning │ │ ├── service_detector.py # Port-to-service mapping │ │ └── host_scanner.py # Multi-host orchestrator │ │ │ └── exporters/ │ ├── __init__.py │ ├── json_exporter.py # JSON export │ ├── txt_exporter.py # Plain text export │ └── html_exporter.py # HTML report export │ ├── reports/ # Output directory (auto-created) │ ├── scanner.log # Scan log │ ├── scan_20240623_143045.json │ ├── scan_20240623_143045.txt │ └── scan_20240623_143045.html │ └── targets.txt # Example: IPs to scan (one per line) ``` ## 🔬 架构 ### 两级线程 **级别 1:主机并行** - 同时扫描 5 个主机 - 每个主机获取独立的资源 **级别 2:端口并行** - 每个主机同时扫描 50 个端口 - 使用 ThreadPoolExecutor 进行线程池管理 **结果:** 5 个主机 × 50 个端口 = 同时扫描 250 个端口! ### 模块依赖 ``` main.py ├─ validator.py (Input validation) ├─ logger.py (Logging) ├─ host_scanner.py (Multi-host orchestrator) │ ├─ port_scanner.py (Single-host TCP scanning) │ ├─ service_detector.py (Service mapping) │ └─ logger.py └─ exporters/ ├─ json_exporter.py ├─ txt_exporter.py └─ html_exporter.py ``` ## 📚 关键概念解释 ### 端口状态 - **OPEN** - 端口正在监听,连接被接受(有服务运行) - **CLOSED** - 端口未监听,连接被主机拒绝 - **FILTERED** - 防火墙阻止了连接,未收到响应 ### Socket 连接 1. 创建 TCP socket 2. 尝试连接到 `host:port` 3. 如果成功 → 端口为 OPEN 4. 如果被拒绝 → 端口为 CLOSED 5. 如果超时 → 端口为 FILTERED(防火墙) ### 线程架构 ``` Sequential (SLOW): Port 1→3s, Port 2→3s, Port 3→3s = 9 seconds Parallel (FAST): Ports 1,2,3 at once = 3 seconds ``` 我们使用带有 50 个工作线程的 `ThreadPoolExecutor` 来实现这一点。 ### IANA 端口分类 - **0-1023**(Well-known):系统服务(SSH, HTTP, DNS 等) - **1024-49151**(Registered):特定应用程序(MySQL, PostgreSQL 等) - **49152-65535**(Dynamic):由 OS 进行的临时/短暂使用 ## 🔐 安全与道德 ### 本工具的功能 ✅ 尝试连接到端口的 TCP 连接 ✅ 检测哪些端口有响应 ✅ 根据端口号识别可能的服务 ✅ 仅供教育用途 - 不进行漏洞利用 ### 本工具不会做的事 ❌ 利用漏洞 ❌ 发送恶意 payload ❌ 暴力破解或破解密码 ❌ 执行提权操作 ❌ 访问或窃取数据 ### 合法使用 本工具**仅**适用于: - 你自己的网络 - 你拥有明确书面许可进行扫描的系统 - 教育学习环境 - 你自己的实验室设备 ## 📈 性能提示 ### 为了实现快速扫描 ``` # 增加 threads,降低 timeout(适用于快速网络) python main.py --target 192.168.1.1 --ports 1-65535 --threads 100 --timeout 1.0 ``` ### 为了实现稳定扫描 ``` # 减少 threads,增加 timeout(适用于缓慢/远程网络) python main.py --target example.com --ports 1-65535 --threads 20 --timeout 5.0 ``` ### 针对大量主机 ``` # 并行扫描多个 hosts python main.py --file many_targets.txt --ports 1-1000 ``` ## 🐛 故障排除 ### 端口需要管理员/root 权限? 某些系统限制扫描特权端口(1-1023)。请使用以下命令运行: ``` # Windows(Admin Command Prompt) python main.py --target 192.168.1.1 --ports 1-1023 # Linux/Mac(使用 sudo) sudo python3 main.py --target 192.168.1.1 --ports 1-1023 ``` ### 扫描速度慢? 增加线程并减少超时时间: ``` python main.py --target 192.168.1.1 --threads 150 --timeout 1.0 --ports 1-1000 ``` ### 没有结果? 检查目标是否可达: ``` ping 192.168.1.1 # Test connectivity first ``` ## 📝 示例工作流 ### 快速本地网络扫描 ``` python main.py --target 192.168.1.0/24 --ports 1-1000 --export all ``` ### 从文件扫描多个主机 ``` # 创建 targets.txt,每行一个 IP python main.py --file targets.txt --ports 1-1000 --export all --output ./my_reports ``` ### 带有日志的全面扫描 ``` python main.py --target 192.168.1.1 --ports all --threads 100 --verbose # 检查 reports/ 目录获取结果 ``` ## 🤝 贡献 这是一个教育项目。欢迎贡献: - 更好的文档 - 额外的服务映射 - 性能改进 - Bug 修复 ## 📜 许可证 MIT License - 详情请查看 LICENSE 文件 ## 📚 学习资源 包含的概念将教你关于: 1. **网络** - TCP/IP 协议栈 - Socket 与端口通信 - 网络服务 2. **Python 编程** - 线程与并发 - 类型提示与注解 - 使用 argparse 进行 CLI 开发 - 文件 I/O 与序列化 3. **网络安全** - 侦察技术 - 服务枚举 - 防御概念 ## ⚠️ 免责声明 用户有责任确保他们拥有扫描任何网络或系统的明确许可。未经授权的网络扫描可能是违法的。本工具仅供教育目的提供。 **记住:能力越大,责任越大。** 🦸 ## 🎯 未来增强功能 潜在的添加功能(教育性质): - UDP 端口扫描 - 用于主机发现的 Ping 扫描 - Traceroute 功能 - Banner 抓取(安全版本) - SSL/TLS 检测 - Web 服务指纹识别 - DNS 枚举 ## 📞 有疑问? 此工具旨在帮助你安全、负责任地学习网络安全概念。 扫描愉快! 🎯
标签:Python, URL短链接分析, 插件系统, 数据统计, 无后门, 服务探测, 端口扫描, 网络工具, 网络教育, 逆向工具