Skip to content

Dave-he/ip-scan

Repository files navigation

🔍 IP-Scan

高性能 IPv4/IPv6 端口扫描工具 | 配备 Web 管理界面

CI/CD Security Rust License Docker

一个使用 Rust 编写的企业级端口扫描工具,配备现代化 Web 管理界面,支持大规模网络扫描、智能去重、实时监控和数据持久化。

特性快速开始Web 界面性能优化架构设计


📢 最新更新

v0.1.0 (2024-01)

  • Web 管理界面:全新的现代化 Web UI,支持实时监控和配置管理
  • 🚀 SYN 扫描支持:高性能 SYN 半连接扫描,速度提升 10 倍
  • 🌍 地理位置功能:自动识别 IP 地理位置(国家/城市)
  • 📊 实时统计:扫描进度、速率、成功率实时展示
  • 📥 数据导出:支持 CSV/JSON 格式导出

✨ 特性

🎨 Web 管理界面

  • 现代化 UI:简洁直观的 Web 管理界面
  • 实时监控:扫描进度、速率、成功率实时展示
  • 灵活配置:支持在线配置扫描参数
  • 数据可视化:扫描结果表格展示,支持搜索过滤
  • 数据导出:一键导出为 CSV 或 JSON 格式

核心功能

  • 🌐 双栈支持:完整支持 IPv4 和 IPv6 地址扫描,自动识别 IP 类型
  • 高性能:基于 Tokio 异步运行时,支持高并发扫描(可配置并发数)
  • 🎯 智能去重:Bitmap 存储方案,自动跳过已扫描的 IP+端口组合
  • 💾 数据持久化:扫描结果存储到 SQLite 数据库,支持增量扫描

高级特性

  • 🔄 循环扫描:支持无限循环模式,持续监控网络状态
  • 📊 性能监控:实时统计扫描速率、成功率、开放端口率等指标
  • 🚦 速率控制:内置速率限制器,防止触发防火墙告警
  • 🔁 自动重试:智能错误处理和自动重试机制(最多3次)
  • 📝 结构化日志:详细的日志记录,支持多级别日志输出

部署特性

  • 🐳 Docker 支持:提供完整的 Docker 和 Docker Compose 配置
  • 🎛️ 灵活配置:支持命令行参数、配置文件和环境变量
  • 💪 资源控制:Docker 资源限制,防止系统资源耗尽
  • 🏥 健康检查:内置健康检查机制,确保服务稳定运行

🚀 快速开始

方式一:Docker 部署(推荐)

Docker 部署是最简单的方式,无需配置 Rust 环境。

# 1. 克隆项目
git clone https://github.com/Dave-he/ip-scan.git
cd ip-scan

# 2. 启动服务(自动构建镜像)
docker-compose up -d

# 3. 访问 Web 界面
# 浏览器打开: http://localhost:8080

# 4. 查看日志
docker logs -f ip-scanner

# 5. 停止服务
docker-compose down

自定义配置:编辑 config.toml 配置文件。

方式二:本地编译运行

适合开发和调试场景。

# 1. 安装 Rust(如果未安装)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

# 2. 克隆项目
git clone https://github.com/Dave-he/ip-scan.git
cd ip-scan

# 3. 编译(Release 模式)
cargo build --release

# 4. 运行(默认启动 API 服务)
./target/release/ip-scan

# 5. 访问 Web 界面
# 浏览器打开: http://localhost:8080

快速测试

扫描本地网段,验证工具是否正常工作:

# 扫描本地 C 段的常用端口
./target/release/ip-scan \
  --start-ip 192.168.1.1 \
  --end-ip 192.168.1.254 \
  --ports 22,80,443,3389 \
  --timeout 500 \
  --concurrency 10 \
  --loop-mode false \
  --verbose

🪟 Windows 构建(Npcap SDK)

  • 安装 Npcap,并在安装时勾选“Install Npcap in WinPcap API-compatible Mode”
  • 下载并解压 Npcap SDK(例如放到 D:\npcap-sdk-1.15)
  • 在 PowerShell 中设置库路径并编译:
$env:LIB = if ($env:LIB) { "$env:LIB;D:\npcap-sdk-1.15\Lib\x64" } else { "D:\npcap-sdk-1.15\Lib\x64" }
cargo build
  • 如果使用 32 位工具链,请改为 D:\npcap-sdk-1.15\Lib 路径
  • 以上步骤用于在 Windows 上启用数据链路层支持,以编译包含 SYN 扫描能力的二进制;运行时通过 --syn 开启。

📖 使用文档

Web 界面

启动服务后,访问 http://localhost:8080 打开 Web 管理界面:

  • 🎯 扫描配置:支持配置 IP 范围、端口、超时、并发数等参数
  • 📊 实时监控:查看扫描进度、速率、成功率等统计信息
  • 📋 结果查询:分页查看扫描结果,支持搜索和过滤
  • 📥 数据导出:导出扫描结果为 CSV 或 JSON 格式

配置文件

默认配置文件为 config.toml,可以修改以下配置:

# API 配置
[api]
enabled = true          # 启用 API 服务
host = "0.0.0.0"       # 绑定地址
port = 8080            # 服务端口

# 扫描配置
[scan]
ports = "21,22,23,80,443,3306,3389,8080"  # 扫描端口
timeout = 50           # 超时时间(毫秒)
concurrency = 1000     # 并发数
loop_mode = true       # 循环扫描模式
ipv4 = true           # 扫描 IPv4
ipv6 = false          # 扫描 IPv6
syn = true            # SYN 扫描模式
skip_private = true   # 跳过私有 IP

# 速率限制
[rate_limit]
max_rate = 100000      # 最大速率(请求/秒)

命令行参数

虽然现在主要通过 Web 界面操作,但仍支持命令行参数:

ip-scan [OPTIONS]

选项:
  -s, --start-ip <IP>              起始 IP 地址(默认:0.0.0.0)
  -e, --end-ip <IP>                结束 IP 地址(默认:255.255.255.255)
  -p, --ports <PORTS>              端口范围,支持多种格式 [默认: 1-65535]
                                   示例: "80" "1-1000" "22,80,443" "1-100,8000-9000"
  -t, --timeout <MS>               连接超时时间(毫秒) [默认: 1000]
  -c, --concurrency <NUM>          并发连接数 [默认: 4]
  -d, --database <PATH>            数据库文件路径 [默认: scan_results.db]
  -l, --loop-mode <BOOL>           启用循环扫描模式 [默认: true]
      --ipv4 <BOOL>                扫描 IPv4 地址 [默认: true]
      --ipv6 <BOOL>                扫描 IPv6 地址 [默认: false]	      --rate-limit <NUM>           速率限制(请求/秒) [默认: 1000]
      --syn                        启用 SYN 扫描模式(需要 root/admin 权限)
  -v, --verbose                    详细输出(显示调试信息)
  -h, --help                       显示帮助信息
  -V, --version                    显示版本信息

使用场景示例

1. Web 界面快速扫描(推荐)

  1. 访问 http://localhost:8080
  2. 在配置面板中设置扫描参数
  3. 点击"开始扫描"按钮
  4. 实时查看扫描进度和结果
  5. 导出扫描结果

2. 局域网扫描(命令行)

扫描内网常用端口,快速发现服务:

ip-scan \
  --start-ip 192.168.1.1 \
  --end-ip 192.168.1.254 \
  --ports 22,80,443,3306,3389,5432,6379,8080 \
  --timeout 500 \
  --concurrency 20 \
  --loop-mode false

3. 单个主机深度扫描(命令行)

扫描目标主机的所有端口:

ip-scan \
  --start-ip 192.168.1.100 \
  --end-ip 192.168.1.100 \
  --ports 1-65535 \
  --timeout 2000 \
  --concurrency 100

4. IPv6 网络扫描(命令行)

扫描 IPv6 地址段:

ip-scan \
  --ipv4 false \
  --ipv6 true \
  --start-ip 2001:db8::1 \
  --end-ip 2001:db8::ffff \
  --ports 80,443,8080

5. 持续监控模式(命令行)

循环扫描,持续监控网络状态:

ip-scan \
  --start-ip 10.0.0.0 \
  --end-ip 10.255.255.255 \
  --ports 22,80,443 \
  --loop-mode true \
  --concurrency 50 \
  --rate-limit 5000

6. 高性能公网扫描(命令行)

扫描公网 IP 段(需谨慎使用):

ip-scan \
  --start-ip 1.0.0.0 \
  --end-ip 1.255.255.255 \
  --ports 80,443,8080,8443 \
  --timeout 3000 \
  --concurrency 500 \	  --rate-limit 10000 \
	  --database /data/public_scan.db

#### 7. 高性能 SYN 扫描(命令行)
使用 SYN 扫描模式,速度更快且更隐蔽(需要 root/admin 权限):
```bash
sudo ip-scan \
  --start-ip 1.0.0.0 \
  --end-ip 1.255.255.255 \
  --ports 80,443,8080 \
  --syn \
  --timeout 2000 \
  --concurrency 500 \
  --rate-limit 10000

### 配置文件(已废弃)

> **注意**:命令行配置方式已基本被 Web 界面取代。建议通过 Web 界面进行配置。

## 💾 数据管理

### Web 界面数据查询

通过 Web 界面可以:
- 📊 查看扫描统计信息(总扫描数、开放端口数、热门端口等)
- 🔍 搜索和过滤扫描结果
- 📥 导出数据为 CSV 或 JSON 格式
- 📈 查看扫描历史记录

### 数据库结构

扫描结果存储在 SQLite 数据库中,采用 Bitmap 优化方案:

#### port_bitmap_segments 表
```sql
CREATE TABLE port_bitmap_segments (
    port INTEGER NOT NULL,
    ip_type TEXT NOT NULL,           -- 'IPv4' 或 'IPv6'
    segment_id INTEGER NOT NULL,      -- 段ID (0-255)
    bitmap BLOB NOT NULL,             -- Bitmap 数据(2MB/段)
    scan_round INTEGER NOT NULL,      -- 扫描轮次
    open_count INTEGER DEFAULT 0,     -- 该段开放IP数
    last_updated TEXT NOT NULL,       -- 最后更新时间
    PRIMARY KEY (port, ip_type, segment_id, scan_round)
);

scan_metadata 表

CREATE TABLE scan_metadata (
    id INTEGER PRIMARY KEY,
    key TEXT UNIQUE NOT NULL,
    value TEXT NOT NULL
);
-- 存储扫描轮次、最后扫描IP等元数据

查询示例

# 连接数据库
sqlite3 scan_results.db

# 1. 查看扫描进度
SELECT key, value FROM scan_metadata;

# 2. 统计开放端口数(按端口)
SELECT port, SUM(open_count) as total_open
FROM port_bitmap_segments
WHERE scan_round = (SELECT value FROM scan_metadata WHERE key = 'current_round')
GROUP BY port
ORDER BY total_open DESC;

# 3. 查看最活跃的网段
SELECT port, segment_id, open_count
FROM port_bitmap_segments
WHERE scan_round = (SELECT value FROM scan_metadata WHERE key = 'current_round')
  AND open_count > 0
ORDER BY open_count DESC
LIMIT 20;

# 4. 统计扫描覆盖率
SELECT 
    COUNT(DISTINCT segment_id) as scanned_segments,
    SUM(open_count) as total_open_ports
FROM port_bitmap_segments
WHERE scan_round = (SELECT value FROM scan_metadata WHERE key = 'current_round');

数据导出

导出开放端口列表:

# 导出为 CSV
sqlite3 -header -csv scan_results.db \
  "SELECT port, segment_id, open_count, last_updated 
   FROM port_bitmap_segments 
   WHERE open_count > 0" > open_ports.csv

# 导出为 JSON
sqlite3 scan_results.db \
  "SELECT json_object(
     'port', port,
     'segment', segment_id,
     'count', open_count
   ) FROM port_bitmap_segments 
   WHERE open_count > 0" > open_ports.json

数据备份

# 备份数据库
cp scan_results.db scan_results_backup_$(date +%Y%m%d).db

# 或使用 SQLite 备份命令
sqlite3 scan_results.db ".backup scan_results_backup.db"

⚡ 性能优化

性能监控

Web 界面提供实时性能监控:

  • 扫描速率(IPs/sec)
  • 成功率 / 开放端口率
  • 扫描进度百分比
  • 扫描状态(运行中/已停止)

已实现的优化

1. 内存管理优化

  • 流式IP处理:分批处理IP(每批1000个),避免一次性加载全部IP到内存
  • 内存占用:从 100MB(100万IP)降低到 2MB(固定批次大小)
  • 提升:50倍内存效率提升

2. 数据库I/O优化

  • 批量提交:每100个IP保存一次进度,而非每个IP一次
  • I/O减少:从 100万次/100万IP 降低到 1万次/100万IP
  • 提升:100倍I/O操作减少

3. 智能错误处理

  • 自动重试:失败任务自动重试(最多3次)
  • 错误分类:区分端口扫描失败、数据库错误、任务panic等
  • 结构化日志:详细记录错误上下文,便于问题追踪

4. 速率控制

  • 令牌桶算法:基于时间窗口的速率限制器
  • 默认限制:1000 请求/秒(可配置)
  • 防护作用:避免触发防火墙告警或被封禁

5. 性能监控

实时跟踪以下指标:

  • 总扫描数 / 开放端口数 / 错误数
  • 扫描速率(IPs/sec)
  • 成功率 / 开放端口率
  • 重试次数

性能基准测试

测试环境

  • CPU: 4核心
  • 内存: 8GB
  • 网络: 千兆局域网

测试结果

场景 并发数 速率限制 扫描速度 内存占用
局域网C段 10 5000/s ~250 IPs/s 50MB
局域网B段 50 10000/s ~800 IPs/s 80MB
公网扫描 100 5000/s ~400 IPs/s 120MB
全网扫描 500 10000/s ~1000 IPs/s 200MB

性能调优建议

局域网扫描

ip-scan \
  --concurrency 20 \
  --timeout 500 \
  --rate-limit 10000
  • 并发数:10-50
  • 超时:200-500ms
  • 速率:5000-10000/s

公网扫描

ip-scan \
  --concurrency 100 \
  --timeout 2000 \
  --rate-limit 5000
  • 并发数:50-200
  • 超时:1000-3000ms
  • 速率:1000-5000/s

全网扫描

ip-scan \
  --concurrency 500 \
  --timeout 3000 \
  --rate-limit 10000 \
  --ports 80,443,22,3389
  • 并发数:200-1000
  • 超时:2000-5000ms
  • 速率:5000-20000/s
  • 建议:只扫描常用端口

存储空间优化

Bitmap 方案优势

传统方案(存储所有记录):
- 43亿IP × 1000端口 × 76字节 = 326TB

Bitmap方案(只存开放端口):
- 1000端口 × 512MB = 512GB(最坏情况)
- 1000端口 × 512MB × 1% = 5GB(稀疏存储,实际场景)

空间效率提升: 60倍+

实际存储占用

  • 小规模(<100万IP):< 100MB
  • 中规模(100万-1000万IP):100MB - 1GB
  • 大规模(>1000万IP):1GB - 10GB

🏗️ 技术架构

系统架构

graph TB
    A[Web 浏览器] --> B[Nginx]
    B --> C[静态文件]
    B --> D[API 服务]
    D --> E[扫描引擎]
    E --> F[SQLite 数据库]
    E --> G[Bitmap 存储]
    D --> F
    D --> H[地理位置服务]
Loading

项目结构

ip-scan/
├── src/
│   ├── main.rs              # 主程序入口
│   ├── cli.rs               # 命令行参数和配置解析
│   ├── error.rs             # 错误类型定义
│   ├── api/                 # REST API 模块
│   │   ├── mod.rs
│   │   ├── handlers.rs      # API 处理器
│   │   ├── models.rs        # API 数据模型
│   │   └── routes.rs        # 路由配置
│   ├── dao/                 # 数据访问对象
│   │   ├── mod.rs
│   │   └── sqlite_db.rs     # SQLite 数据库操作
│   ├── model/               # 数据模型
│   │   ├── mod.rs
│   │   ├── bitmap.rs        # Bitmap 存储模型
│   │   ├── ip_range.rs      # IP 范围处理
│   │   ├── metrics.rs       # 性能指标
│   │   └── geo.rs           # 地理位置信息
│   └── service/             # 核心业务逻辑
│       ├── mod.rs
│       ├── con_scanner.rs   # TCP Connect 扫描器
│       ├── syn_scanner.rs   # SYN 扫描器
│       ├── rate_limiter.rs  # 速率限制器
│       └── geo_service.rs   # 地理位置服务
├── web/                     # Web 前端界面
│   ├── index.html           # 主页面
│   ├── app.js               # 前端逻辑
│   └── style.css            # 样式
├── Cargo.toml               # Rust 依赖配置
├── Dockerfile               # Docker 镜像构建
├── docker-compose.yml       # Docker Compose 配置
├── nginx.conf               # Nginx 配置
├── config.toml              # 默认配置文件
└── README.md                # 项目文档

技术栈


### 技术栈

| 组件 | 技术 | 用途 |
|------|------|------|
| 语言 | Rust 1.75+ | 系统编程,保证性能和安全 |
| 异步运行时 | Tokio | 高性能异步I/O |
| Web 框架 | Actix-web | REST API 服务 |
| 前端 | 原生 HTML/CSS/JS | Web 管理界面 |
| 反向代理 | Nginx | 静态文件服务和 API 代理 |
| 命令行 | Clap 4.x | 参数解析和验证 |
| 数据库 | Rusqlite | SQLite 绑定 |
| 日志 | Tracing | 结构化日志记录 |
| 容器化 | Docker | 简化部署 |
| API 文档 | Utoipa | OpenAPI 文档生成 |
| 地理位置 | MaxMindDB | IP 地理位置查询 |

### 核心工作流程

```mermaid
graph TB
    A[启动程序] --> B[加载配置]
    B --> C[初始化数据库]
    C --> D[启动 API 服务]
    D --> E[启动扫描引擎]
    E --> F{循环模式?}
    F -->|是| G[开始扫描轮次]
    F -->|否| G
    G --> H[生成IP范围]
    H --> I[分批处理IP]
    I --> J[并发扫描端口]
    J --> K{速率限制}
    K --> L[TCP/SYN 连接测试]
    L --> M{端口开放?}
    M -->|是| N[更新 Bitmap]
    M -->|否| O[跳过]
    N --> P[批量提交数据库]
    O --> P
    P --> Q{还有IP?}
    Q -->|是| I
    Q -->|否| R[输出统计信息]
    R --> S{循环模式?}
    S -->|是| T[等待5秒]
    S -->|否| U[结束]
    T --> G

Bitmap 存储方案

设计思路

传统方案存储每条扫描记录,导致海量数据。Bitmap方案使用位图存储扫描状态,大幅减少存储空间。

分段存储策略

  • IPv4地址空间:2^32 = 4,294,967,296 个IP
  • 分段数量:256段(每段2^24个IP)
  • 每段大小:2MB(16,777,216 bits)
  • 总大小:512MB/端口(最坏情况)

IP到Bit位置映射

// IPv4地址转换为索引
fn ipv4_to_index(ip: &str) -> u32 {
    let addr: Ipv4Addr = ip.parse().unwrap();
    u32::from(addr)
}

// 计算段ID和位偏移
fn get_segment_and_offset(ip_index: u32) -> (u32, u32) {
    let segment_id = ip_index >> 24;      // 高8位
    let bit_offset = ip_index & 0xFFFFFF; // 低24位
    (segment_id, bit_offset)
}

// 设置位(标记端口开放)
fn set_bit(bitmap: &mut [u8], bit_offset: u32) {
    let byte_index = (bit_offset / 8) as usize;
    let bit_index = (bit_offset % 8) as u8;
    bitmap[byte_index] |= 1 << bit_index;
}

并发模型

graph LR
    A[主线程] --> B[Tokio运行时]
    B --> C[任务队列]
    C --> D[工作线程1]
    C --> E[工作线程2]
    C --> F[工作线程N]
    D --> G[速率限制器]
    E --> G
    F --> G
    G --> H[TCP扫描]
    H --> I[结果收集]
    I --> J[批量写入DB]
Loading
  • 异步任务:使用 Tokio 的 spawn 创建异步任务
  • 并发控制:Semaphore 信号量限制并发数
  • 速率限制:令牌桶算法控制请求速率
  • 批量处理:减少数据库I/O次数

🐳 部署指南

Docker Compose 部署(推荐)

默认配置(docker-compose.yml)已包含完整的服务栈:

version: '3.8'

services:
  ip-scanner:
    build: .
    container_name: ip-scanner
    volumes:
      - ./data:/data
    network_mode: host
    environment:
      - RUST_LOG=info
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 2G
        reservations:
          cpus: '1'
          memory: 512M
    healthcheck:
      test: ["CMD", "test", "-f", "/data/scan_results.db"]
      interval: 30s
      timeout: 10s
      retries: 3
    command: >
      --ports 1-1000
      --timeout 1000
      --concurrency 4
      --database /data/scan_results.db
      --loop-mode true
      --ipv4 true
      --ipv6 false
      --rate-limit 1000
      --verbose

资源限制说明

资源 限制值 保留值 说明
CPU 2核 1核 防止占满系统CPU
内存 2GB 512MB 防止OOM

配置管理

所有配置都通过 config.toml 文件管理,无需修改 docker-compose.yml。

数据持久化

扫描数据通过 Docker Volume 持久化:

# 查看数据目录
ls -lh ./data/

# 数据库文件
./data/scan_results.db

# 备份数据
tar -czf scan_backup_$(date +%Y%m%d).tar.gz ./data/

日志管理

# 实时查看日志
docker logs -f ip-scanner

# 查看最近100行
docker logs --tail 100 ip-scanner

# 导出日志
docker logs ip-scanner > scan_logs_$(date +%Y%m%d).log

# 清理日志(重启容器)
docker-compose restart

健康检查

Docker 会定期检查容器健康状态:

# 查看健康状态
docker inspect --format='{{.State.Health.Status}}' ip-scanner

# 查看健康检查日志
docker inspect --format='{{json .State.Health}}' ip-scanner | jq

⚠️ 注意事项

法律合规

重要提示:端口扫描可能违反某些地区的法律法规,使用前请确保:

  1. 仅扫描授权网络:只在您拥有或获得明确授权的网络上使用
  2. 遵守当地法律:了解并遵守所在地区的网络安全法律
  3. 企业内部使用:建议仅用于企业内部安全审计
  4. 禁止恶意使用:不得用于未授权的渗透测试或攻击

使用限制

扫描范围

  • 全网扫描:扫描全部 IPv4(43亿个)需要极长时间,建议指定范围
  • IPv6扫描:IPv6 地址空间巨大(2^128),必须指定具体范围
  • 私有网段:建议优先扫描私有IP段(10.x, 172.16-31.x, 192.168.x)

网络影响

  • 带宽占用:高并发扫描会占用大量带宽
  • 防火墙告警:可能触发IDS/IPS告警
  • IP封禁:过快扫描可能导致IP被封禁
  • 建议:从低并发开始,逐步调整参数

系统资源

  • 磁盘空间:长时间运行会产生大量数据,注意磁盘空间
  • 内存占用:高并发模式下内存占用会增加
  • CPU使用:建议设置CPU限制,避免影响其他服务

最佳实践

1. 首次使用

  • 访问 Web 界面进行配置
  • 从小范围开始测试(如一个 C 段)
  • 观察扫描速度和系统资源占用
  • 逐步调整参数

2. 生产部署

  • 通过 config.toml 配置默认参数
  • 启用循环扫描模式持续监控
  • 定期备份扫描数据
  • 监控磁盘空间使用

3. 监控和告警

  • 定期检查扫描日志
  • 监控系统资源使用
  • 设置磁盘空间告警
  • 备份重要扫描数据

故障排查

问题1:Web 界面无法访问

# 检查服务状态
docker-compose ps

# 查看日志
docker logs ip-scanner
docker logs nginx

# 检查端口占用
netstat -tlnp | grep 8080

问题2:扫描速度慢

通过 Web 界面调整以下参数:

  • 增加并发数(Concurrency)
  • 减少超时时间(Timeout)
  • 提高速率限制(Rate Limit)
  • 减少扫描端口数量

问题3:内存占用高

通过 config.toml 调整:

[scan]
concurrency = 500  # 降低并发数

问题4:数据库文件过大

# 解决方案:
# 1. 定期清理旧数据
sqlite3 scan_results.db "DELETE FROM port_bitmap_segments WHERE scan_round < X"

# 2. 压缩数据库
sqlite3 scan_results.db "VACUUM"

# 3. 只扫描必要端口
--ports 22,80,443

问题5:被防火墙封禁

通过 Web 界面或 config.toml 调整:

  • 降低扫描速率(Rate Limit)
  • 减少并发数(Concurrency)
  • 增加超时时间(Timeout)
  • 分段扫描(调整 IP 范围)

安全建议

  1. 网络隔离:在隔离的网络环境中运行扫描
  2. 日志审计:保留完整的扫描日志用于审计
  3. 访问控制:限制对扫描工具和数据的访问权限
  4. 定期更新:及时更新工具到最新版本
  5. 数据加密:敏感扫描结果应加密存储

📊 性能分析与估算

扫描时间估算

场景1:局域网C段扫描

IP数量: 254
端口数: 100
并发数: 20
超时: 500ms
预计时间: 254 × 100 / 20 × 10ms ≈ 2分钟

场景2:局域网B段扫描

IP数量: 65,536
端口数: 100
并发数: 100
超时: 500ms
预计时间: 65,536 × 100 / 100 × 10ms ≈ 1.8小时

场景3:公网A段扫描

IP数量: 16,777,216
端口数: 20(常用端口)
并发数: 500
超时: 2000ms
预计时间: 16,777,216 × 20 / 500 × 50ms ≈ 9.3天

场景4:全网扫描(理论)

IP数量: 4,294,967,296
端口数: 100
并发数: 1000
超时: 1000ms
预计时间: 4,294,967,296 × 100 / 1000 × 100ms ≈ 13.6年

结论:全网扫描不现实,建议分段扫描或只扫描活跃网段。

存储空间估算

Bitmap方案(当前实现)

每个端口的存储:
- IPv4: 2^32 bits = 512MB(完整bitmap)
- 分段存储: 256段 × 2MB = 512MB
- 稀疏存储: 只存储有开放端口的段

实际占用(假设1%活跃段):
- 100端口 × 512MB × 1% = 512MB
- 1000端口 × 512MB × 1% = 5GB

传统方案对比

存储所有记录:
- 每条记录: 76字节
- 100万IP × 100端口 = 1亿条
- 存储空间: 7.6GB

只存储开放端口(0.1%开放率):
- 1亿条 × 0.1% = 10万条
- 存储空间: 7.6MB

网络带宽占用

上行带宽

每个TCP连接:
- SYN包: 60字节
- 速率: 1000请求/秒
- 带宽: 60 × 1000 × 8 = 480 Kbps ≈ 0.5 Mbps

下行带宽

成功连接:
- SYN-ACK包: 60字节
- 假设1%成功率
- 带宽: 60 × 1000 × 0.01 × 8 = 4.8 Kbps

总带宽占用: < 1 Mbps(1000请求/秒)

优化建议总结

优化项 优化前 优化后 提升
内存占用 100MB/100万IP 2MB固定 50倍
数据库I/O 100万次/100万IP 1万次/100万IP 100倍
存储空间 326GB(传统) 5GB(Bitmap稀疏) 65倍
错误恢复 自动重试3次
可观测性 无指标 完整指标

🔮 未来规划

已完成功能 ✅

  • ✅ Web 管理界面
  • ✅ REST API 接口
  • ✅ 实时扫描监控
  • ✅ 数据导出功能
  • ✅ 地理位置查询
  • ✅ SYN 扫描支持
  • ✅ 双栈扫描(IPv4/IPv6)

短期目标(1-2周)

1. 服务识别功能

  • Banner 抓取
  • 服务版本检测
  • 常见服务指纹识别

2. 监控集成

  • Prometheus metrics 导出
  • Grafana 仪表板模板
  • 告警规则配置

3. Web 界面增强

  • 扫描任务管理
  • 更丰富的数据可视化
  • 自定义扫描计划

中期目标(1-2月)

1. 分布式扫描

  • 主从架构设计
  • 任务分发机制
  • 结果汇总和去重

2. 智能扫描

  • 自适应超时调整
  • 网络拓扑感知
  • 异常检测告警

3. 协议扩展

  • UDP 端口扫描
  • ICMP 主机发现
  • 应用层协议探测

🤝 贡献指南

我们欢迎所有形式的贡献!

如何贡献

  1. Fork 项目

    git clone https://github.com/Dave-he/ip-scan.git
    cd ip-scan
  2. 创建分支

    git checkout -b feature/your-feature-name
  3. 提交更改

    git add .
    git commit -m "Add: your feature description"
  4. 推送分支

    git push origin feature/your-feature-name
  5. 创建 Pull Request

    • 在 GitHub 上创建 PR
    • 详细描述你的更改
    • 等待代码审查

代码规范

  • 遵循 Rust 官方代码风格
  • 使用 cargo fmt 格式化代码
  • 使用 cargo clippy 检查代码质量
  • 添加必要的单元测试
  • 更新相关文档

Install additional tools for development

cargo install cargo-watch # Auto-rebuild on file changes cargo install cargo-audit # Security vulnerability scanning cargo install cargo-deny # License and dependency checking

提交信息规范

类型: 简短描述

详细描述(可选)

关联 Issue(可选)

类型包括:

  • Add: 新功能
  • Fix: 修复 Bug
  • Refactor: 代码重构
  • Docs: 文档更新
  • Test: 测试相关
  • Chore: 构建/工具相关

报告问题

发现 Bug 或有新想法?请创建 Issue

包含以下信息:

  • 问题描述
  • 复现步骤
  • 预期行为
  • 实际行为
  • 环境信息(OS、Rust版本等)

📄 许可证

本项目采用 MIT 许可证。详见 LICENSE 文件。

MIT License

Copyright (c) 2024 Dave-he

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

👨‍💻 作者

Dave-he

🙏 致谢

感谢以下开源项目:

📡 REST API 接口

IP-Scan 提供了完整的 REST API 接口,Web 界面就是基于这些 API 构建的。

API 访问

默认情况下,API 服务运行在 http://localhost:8080/api/v1/

主要 API 端点

1. 扫描结果查询

方法 端点 描述
GET /api/v1/results 获取分页的扫描结果
GET /api/v1/results/{ip} 获取特定IP的扫描结果
GET /api/v1/results/port/{port} 获取特定端口的扫描结果

2. 统计信息

方法 端点 描述
GET /api/v1/stats 获取总体统计信息
GET /api/v1/stats/top-ports 获取热门端口统计

3. 扫描控制

方法 端点 描述
POST /api/v1/scan/start 启动扫描任务
POST /api/v1/scan/stop 停止扫描任务
GET /api/v1/scan/status 获取扫描状态
GET /api/v1/scan/history 获取扫描历史

4. 数据导出

方法 端点 描述
GET /api/v1/export/csv 导出为 CSV
GET /api/v1/export/json 导出为 JSON

API 使用示例

查询扫描结果

# 获取第一页结果 (每页50条)
curl "http://localhost:8080/api/v1/results?page=1&page_size=50"

# 搜索特定IP
curl "http://localhost:8080/api/v1/results?ip=192.168.1"

# 获取端口80的扫描结果
curl "http://localhost:8080/api/v1/results/port/80"

# 获取统计信息
curl "http://localhost:8080/api/v1/stats"

启动扫描任务

curl -X POST "http://localhost:8080/api/v1/scan/start" \
  -H "Content-Type: application/json" \
  -d '{
    "start_ip": "192.168.1.1",
    "end_ip": "192.168.1.254",
    "ports": "22,80,443",
    "timeout": 500,
    "concurrency": 50,
    "syn": false,
    "skip_private": false
  }'

导出数据

# 导出为 CSV
curl "http://localhost:8080/api/v1/export/csv" -o scan_results.csv

# 导出为 JSON
curl "http://localhost:8080/api/v1/export/json" -o scan_results.json

响应格式示例

{
  "results": [
    {
      "ip_address": "192.168.1.1",
      "ip_type": "IPv4",
      "port": 80,
      "scan_round": 1,
      "first_seen": "2024-01-06T08:00:00Z",
      "last_seen": "2024-01-06T08:00:00Z"
    }
  ],
  "total": 100,
  "page": 1,
  "page_size": 50,
  "total_pages": 2
}

错误响应示例

{
  "error": "Invalid page number",
  "code": "INVALID_PAGINATION"
}

数据模型

ScanResult

{
  "ip_address": "192.168.1.1",
  "ip_type": "IPv4",
  "port": 80,
  "country": "United States",
  "city": "New York",
  "scan_round": 1,
  "first_seen": "2024-01-06T08:00:00Z",
  "last_seen": "2024-01-06T08:00:00Z"
}

完整的 API 文档可以通过代码中的注释查看,或者使用工具(如 Postman)测试。

📚 相关资源

文档

工具

  • Nmap - 网络扫描工具
  • Masscan - 快速端口扫描器
  • ZMap - 互联网扫描器

学习资源


⭐ 如果这个项目对你有帮助,请给它一个 Star!⭐

Made with ❤️ by Dave-he

About

No description, website, or topics provided.

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published