Golang API 文档

学习如何在你的 Go 项目中集成和使用 Port Rocket 的核心功能

开始使用

要在你的 Go 项目中使用 Port Rocket,首先需要安装依赖:

go get github.com/cyberspacesec/go-port-rocket

然后,你可以导入必要的包:

import (
    "github.com/cyberspacesec/go-port-rocket/pkg/scanner"
    "github.com/cyberspacesec/go-port-rocket/pkg/fingerprint"
    "github.com/cyberspacesec/go-port-rocket/pkg/output"
)

快速开始示例

下面是一个基础的端口扫描示例,可以帮助你快速开始使用:

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/cyberspacesec/go-port-rocket/pkg/scanner"
)

func main() {
    // 创建简单的扫描配置
    scanOpts := &scanner.ScanOptions{
        Target:   "scanme.nmap.org",    // 扫描目标
        Ports:    "22,80,443",          // 要扫描的端口
        ScanType: scanner.ScanTypeTCP,  // 使用TCP扫描
        Timeout:  5 * time.Second,      // 连接超时时间
        Workers:  10,                   // 并发工作线程数
    }

    // 执行扫描
    fmt.Println("开始扫描目标:", scanOpts.Target)
    results, err := scanner.ExecuteScan(scanOpts)
    if err != nil {
        log.Fatalf("扫描失败: %v", err)
    }

    // 输出结果
    fmt.Println("扫描结果:")
    for _, result := range results {
        state := "关闭"
        if result.State == scanner.PortStateOpen {
            state = "开放"
        }
        fmt.Printf("端口 %d: %s\n", result.Port, state)
    }
}

基本的项目结构如下:

  • pkg/scanner - 端口扫描实现
  • pkg/fingerprint - 指纹识别 (服务和操作系统)
  • pkg/output - 输出处理 (格式化和保存)
  • pkg/api - HTTP API 实现
  • pkg/config - 配置管理
  • pkg/utils - 工具函数
  • pkg/logger - 日志处理

扫描器

扫描器是 Port Rocket 的核心组件,用于执行端口扫描操作。

扫描类型常量

Port Rocket 支持多种扫描类型,可以通过以下常量指定:

常量 描述 适用场景
ScanTypeTCP 常规TCP连接扫描 最基本的扫描方式,建立完整TCP连接
ScanTypeSYN SYN半开放扫描 更隐蔽的扫描方式,不完成完整的TCP握手
ScanTypeFIN FIN扫描 发送带有FIN标志的包,用于穿透某些防火墙
ScanTypeNULL NULL扫描 发送不带任何标志的TCP包
ScanTypeXMAS XMAS扫描 发送带有FIN, PSH, URG标志的TCP包
ScanTypeACK ACK扫描 用于检测防火墙规则
ScanTypeUDP UDP扫描 检测开放的UDP服务
ScanTypeMAIMON Maimon扫描 发送FIN/ACK标志,较为特殊的扫描技术

端口状态常量

常量 描述
PortStateOpen 端口开放
PortStateClosed 端口关闭
PortStateFiltered 端口被过滤(防火墙或其他网络设备拦截)
PortStateUnknown 端口状态未知

创建扫描器

import "github.com/cyberspacesec/go-port-rocket/pkg/scanner"

// 创建扫描器实例
s, err := scanner.NewScanner(&scanner.Options{
    Target:           "scanme.nmap.org",
    Ports:            "21-25,80,443",
    ScanType:         scanner.ScanTypeTCP,
    Timeout:          "5s",
    Workers:          100,
    ServiceDetection: true,
    OSDetection:      true,
    VersionIntensity: 7,
})
if err != nil {
    log.Fatalf("Failed to create scanner: %v", err)
}

扫描选项

选项 类型 描述 默认值
Target string 扫描目标 (IP, 域名, CIDR格式网段,如192.168.1.0/24) -
Ports string 端口范围 (例如: "80,443" 或 "1-1024" 或 "22,80-90,443") -
ScanType ScanType 扫描类型 (ScanTypeTCP, ScanTypeUDP, ScanTypeSYN等) ScanTypeTCP
Timeout time.Duration 连接超时时间,可以是时间字符串(如 "5s")或 time.Duration 值 5 * time.Second
Workers int 并发工作线程数,影响扫描速度 100
EnableService bool 启用服务检测,识别端口上运行的服务 false
EnableOS bool 启用操作系统检测 false
ServiceProbe bool 启用服务探测,发送特定数据包识别服务 false
BannerProbe bool 获取服务banner信息 false
VersionIntensity int 版本检测强度 (0-9),值越大越详细但速度越慢 7
RateLimit int 每秒请求数限制,用于控制扫描速度 0 (无限制)
Retries int 重试次数 2
GuessOS bool 推测操作系统,即使信息不足也尝试猜测 false
LimitOSScan bool 限制操作系统扫描范围,减少探测数据包 false
Verbose bool 启用详细输出模式 false
Service *ServiceDetectionOptions 服务检测的详细配置选项 nil
OutputFile string 输出文件路径 ""

扫描结果结构体 (ScanResult)

字段 类型 描述
Port int 端口号
State PortState 端口状态 (open, closed, filtered, unknown)
Service *fingerprint.Service 服务信息,包含检测到的服务详情
OS *fingerprint.OSInfo 操作系统信息
Banner string 服务banner
Version string 版本信息
ServiceName string 服务名称
Open bool 端口是否开放
Type ScanType 扫描类型
TTL int 数据包TTL值,用于OS指纹识别
Metadata map[string]interface{} 元数据,存储额外信息

执行扫描

// 开始扫描
result, err := s.Scan()
if err != nil {
    log.Fatalf("Scan failed: %v", err)
}

// 处理扫描结果
for _, port := range result {
    fmt.Printf("Port %d/%s: %s\n", port.Port, port.Type, port.State)
    if port.ServiceName != "" {
        fmt.Printf("  Service: %s\n", port.ServiceName)
    }
    if port.Version != "" {
        fmt.Printf("  Version: %s\n", port.Version)
    }
    if port.Banner != "" {
        fmt.Printf("  Banner: %s\n", port.Banner)
    }
}

// 处理操作系统检测结果
if port.OS != nil {
    fmt.Printf("OS: %s %s (Confidence: %.2f%%)\n", 
        port.OS.Name, port.OS.Version, port.OS.Confidence*100)
}

扫描器方法

  • NewScanner(opts *ScanOptions) (*Scanner, error)

    创建新的扫描器实例

    参数:

    • opts - 扫描配置选项结构体

    返回:

    • 扫描器实例
    • 错误信息(如有)
  • Scan() ([]*ScanResult, error)

    执行端口扫描并返回结果

    返回:

    • 扫描结果切片,每个端口的详细信息
    • 错误信息(如有)
  • ScanAsync() (chan *ScanResult, chan *ScanResult, chan error)

    异步执行扫描并通过通道返回结果

    返回:

    • 端口结果通道 - 实时返回每个扫描的端口
    • 扫描结果通道 - 返回最终汇总结果
    • 错误通道 - 返回扫描过程中的错误
  • Stop()

    停止正在进行的扫描

  • ExecuteScan(opts *ScanOptions) ([]*ScanResult, error)

    便捷函数,一步创建扫描器并执行扫描

    参数:

    • opts - 扫描配置选项结构体

    返回:

    • 扫描结果切片
    • 错误信息(如有)

服务检测

服务检测模块用于识别开放端口上运行的服务和版本。Port Rocket 实现了类似 nmap 的服务检测功能,通过发送特定探测数据包并分析响应来确定服务类型和版本。

服务检测工作原理

服务检测通过以下步骤实现:

  1. 对开放端口发送特定的探测数据包
  2. 收集响应数据(如banner信息)
  3. 根据响应内容匹配服务指纹数据库
  4. 识别服务类型、名称和版本信息

使用服务检测

import "github.com/cyberspacesec/go-port-rocket/pkg/fingerprint"

// 创建服务检测器
detector := fingerprint.NewServiceDetector(&fingerprint.ServiceOptions{
    Intensity: 7,
    Timeout:   time.Second * 2,
})

// 对特定端口执行服务检测
serviceInfo, err := detector.Detect("192.168.1.1", 80, "tcp")
if err != nil {
    log.Printf("Service detection failed: %v", err)
} else {
    fmt.Printf("检测到的服务: %s\n", serviceInfo.Name)
    fmt.Printf("版本: %s\n", serviceInfo.Version)
    fmt.Printf("产品: %s\n", serviceInfo.Product)
    if serviceInfo.Banner != "" {
        fmt.Printf("Banner: %s\n", serviceInfo.Banner)
    }
}

服务检测选项 (ServiceOptions)

选项 类型 描述 默认值
Intensity int 检测强度 (0-9),值越大检测越详细但速度越慢 7
Timeout time.Duration 每次探测的超时时间 2 * time.Second
BannerOnly bool 仅获取banner信息,不进行完整服务检测 false
EnableAllProbes bool 对每个端口使用所有探测,而不仅是与端口相关的探测 false
MaxProbes int 每个端口的最大探测次数 10
ProbeDB string 服务探测数据库路径,不指定则使用内置数据库 ""

服务信息结构体 (Service)

字段 类型 描述
Name string 服务名称 (如 "http", "ssh", "ftp")
Version string 服务版本号
Product string 产品名称 (如 "Apache", "OpenSSH")
Protocol string 使用的协议 (tcp/udp)
DeviceType string 设备类型 (如 "firewall", "router", "webcam")
CPE []string 通用平台枚举标识符,用于漏洞匹配
Banner string 服务返回的原始banner信息
Confidence float64 检测结果的置信度 (0.0-1.0)
Metadata map[string]string 其他元数据,如额外信息

服务检测器方法

  • NewServiceDetector(opts *ServiceOptions) *ServiceDetector

    创建新的服务检测器实例

    参数:

    • opts - 服务检测配置选项

    返回:

    • 服务检测器实例
  • Detect(host string, port int, protocol string) (*Service, error)

    检测指定主机端口上运行的服务

    参数:

    • host - 目标主机地址(IP或域名)
    • port - 端口号
    • protocol - 协议("tcp"或"udp")

    返回:

    • 服务信息对象
    • 错误信息(如有)
  • GetBanner(host string, port int, protocol string) (string, error)

    仅获取服务的banner信息

    参数:

    • host - 目标主机地址
    • port - 端口号
    • protocol - 协议

    返回:

    • banner字符串
    • 错误信息(如有)

操作系统检测

操作系统检测模块用于识别目标主机的操作系统类型和版本。该功能通过分析TCP/IP协议栈实现的行为特性(如TCP窗口大小、TTL值、选项等)来确定可能的操作系统。

操作系统检测工作原理

操作系统检测基于以下技术:

  1. 发送特殊构造的TCP数据包探测目标系统
  2. 分析响应包中的TCP/IP栈参数和行为特征
  3. 与数据库中的指纹进行匹配计算相似度
  4. 返回最匹配的操作系统及置信度

使用操作系统检测

import "github.com/cyberspacesec/go-port-rocket/pkg/fingerprint"

// 创建操作系统检测器
osDetector := fingerprint.NewOSDetector(&fingerprint.OSOptions{
    GuessOS:    true,  // 即使信息不充分也尝试猜测
    LimitOSScan: false, // 不限制操作系统扫描范围
    Timeout:    time.Second * 3,
})

// 需要提供一些开放端口以获得更准确的结果
openPorts := []int{22, 80, 443} 

// 执行操作系统检测
osInfo, err := osDetector.Detect("192.168.1.1", openPorts)
if err != nil {
    log.Printf("OS detection failed: %v", err)
} else {
    fmt.Printf("检测到的操作系统: %s\n", osInfo.Name)
    if osInfo.Version != "" {
        fmt.Printf("版本: %s\n", osInfo.Version)
    }
    if osInfo.Family != "" {
        fmt.Printf("系统家族: %s\n", osInfo.Family)
    }
    fmt.Printf("置信度: %.2f%%\n", osInfo.Confidence * 100)
}

操作系统检测选项 (OSOptions)

选项 类型 描述 默认值
GuessOS bool 启用操作系统推测,即使有限的信息也尝试猜测 false
LimitOSScan bool 限制操作系统扫描范围,减少探测数据包 false
Timeout time.Duration 探测超时时间 3 * time.Second
MaxTries int 最大尝试次数 3
OSDB string 操作系统指纹数据库路径,不指定则使用内置数据库 ""

操作系统信息结构体 (OSInfo)

字段 类型 描述
Name string 操作系统名称 (如 "Windows", "Linux", "macOS")
Family string 操作系统家族 (如 "Windows NT", "Unix-like")
Generation string 操作系统代 (如 "10", "11")
Version string 详细版本 (如 "10.0", "22.04 LTS")
Kernel string 内核版本
Architecture string 系统架构 (如 "x86_64", "arm64")
CPE []string 通用平台枚举标识符,用于漏洞匹配
Confidence float64 检测结果的置信度 (0.0-1.0)
Metadata map[string]string 其他元数据

操作系统检测器方法

  • NewOSDetector(opts *OSOptions) *OSDetector

    创建新的操作系统检测器实例

    参数:

    • opts - 操作系统检测配置选项

    返回:

    • 操作系统检测器实例
  • Detect(host string, openPorts []int) (*OSInfo, error)

    检测目标主机的操作系统

    参数:

    • host - 目标主机地址
    • openPorts - 目标主机上的开放端口列表,提供更多端口可提高准确性

    返回:

    • 操作系统信息对象
    • 错误信息(如有)
  • DetectFromTTL(ttl int) (string, float64)

    根据TTL值推测操作系统

    参数:

    • ttl - 接收到的数据包TTL值

    返回:

    • 推测的操作系统名称
    • 置信度

输出处理

输出处理模块用于格式化和保存扫描结果。Port Rocket 支持多种输出格式,能够将扫描结果以不同方式保存或展示,便于集成到其他系统或生成报告。

使用输出处理

import "github.com/cyberspacesec/go-port-rocket/pkg/output"

// 创建输出处理器
outputter, err := output.NewOutputter(&output.Options{
    Format:     "json",  // 输出格式:json, text, xml, html, csv
    OutputFile: "result.json",  // 输出文件路径
    Pretty:     true,  // 美化输出
})
if err != nil {
    log.Fatalf("Failed to create outputter: %v", err)
}

// 处理并保存扫描结果
err = outputter.Process(scanResult)
if err != nil {
    log.Fatalf("Failed to process output: %v", err)
}

// 获取格式化后的输出字符串
formattedOutput, err := outputter.Format(scanResult)
if err != nil {
    log.Fatalf("Failed to format output: %v", err)
}
fmt.Println(formattedOutput)

输出处理选项

选项 类型 描述 默认值
Format string 输出格式 (text, json, xml, html, csv) "text"
OutputFile string 输出文件路径,为空则仅返回格式化字符串 ""
Pretty bool 美化输出,适用于JSON、XML和HTML格式 false
IncludeStats bool 包含统计信息 true
IncludeBanner bool 包含服务banner信息 true
Colorize bool 为文本输出添加颜色(CLI友好) false
Template string 自定义输出模板路径 ""

支持的输出格式

格式 描述 适用场景
text 纯文本格式 命令行显示,人类可读
json JSON 格式 程序处理,API集成
xml XML 格式 与其他系统集成
html HTML 格式 生成网页报告
csv CSV 格式 导入电子表格软件

输出结果示例

JSON 格式输出示例:

{
  "target": "scanme.nmap.org",
  "scan_time": "2023-04-20T15:30:45Z",
  "scan_duration": "5.2s",
  "ports": [
    {
      "port": 22,
      "protocol": "tcp",
      "state": "open",
      "service": {
        "name": "ssh",
        "product": "OpenSSH",
        "version": "8.2p1 Ubuntu 4ubuntu0.5",
        "confidence": 0.95
      }
    },
    {
      "port": 80,
      "protocol": "tcp",
      "state": "open",
      "service": {
        "name": "http",
        "product": "Apache httpd",
        "version": "2.4.41",
        "confidence": 0.98
      }
    }
  ],
  "os": {
    "name": "Linux",
    "family": "Ubuntu",
    "version": "20.04 LTS",
    "confidence": 0.92
  },
  "stats": {
    "open_ports": 2,
    "closed_ports": 45,
    "filtered_ports": 3,
    "total_ports": 50
  }
}

输出处理器方法

  • NewOutputter(opts *Options) (*Outputter, error)

    创建新的输出处理器实例

    参数:

    • opts - 输出处理选项结构体

    返回:

    • 输出处理器实例
    • 错误信息(如有)
  • Process(results []*scanner.ScanResult) error

    处理并保存扫描结果

    参数:

    • results - 扫描结果切片

    返回:

    • 错误信息(如有)
  • Format(results []*scanner.ScanResult) (string, error)

    将扫描结果格式化为指定格式的字符串

    参数:

    • results - 扫描结果切片

    返回:

    • 格式化后的字符串
    • 错误信息(如有)
  • SaveToFile(content string, filename string) error

    保存内容到文件

    参数:

    • content - 要保存的内容
    • filename - 文件路径

    返回:

    • 错误信息(如有)

示例

基本扫描示例

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/cyberspacesec/go-port-rocket/pkg/scanner"
    "github.com/cyberspacesec/go-port-rocket/pkg/output"
)

func main() {
    // 创建扫描器
    s, err := scanner.NewScanner(&scanner.ScanOptions{
        Target:   "example.com",
        Ports:    "80,443",
        ScanType: scanner.ScanTypeTCP,
        Timeout:  5 * time.Second,
        Workers:  100,
    })
    if err != nil {
        log.Fatalf("Failed to create scanner: %v", err)
    }

    // 执行扫描
    result, err := s.Scan()
    if err != nil {
        log.Fatalf("Scan failed: %v", err)
    }

    // 创建输出处理器
    outputter, err := output.NewOutputter(&output.Options{
        Format: "text",
    })
    if err != nil {
        log.Fatalf("Failed to create outputter: %v", err)
    }

    // 处理输出
    err = outputter.Process(result)
    if err != nil {
        log.Fatalf("Failed to process output: %v", err)
    }
}

带服务检测的扫描示例

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/cyberspacesec/go-port-rocket/pkg/scanner"
    "github.com/cyberspacesec/go-port-rocket/pkg/output"
)

func main() {
    // 创建扫描器
    s, err := scanner.NewScanner(&scanner.ScanOptions{
        Target:           "scanme.nmap.org",
        Ports:            "21-25,80,443",
        ScanType:         scanner.ScanTypeTCP,
        Timeout:          "5s",
        Workers:          100,
        ServiceDetection: true,
        VersionIntensity: 7,
    })
    if err != nil {
        log.Fatalf("Failed to create scanner: %v", err)
    }

    // 执行扫描
    result, err := s.Scan()
    if err != nil {
        log.Fatalf("Scan failed: %v", err)
    }

    // 创建输出处理器
    outputter, err := output.NewOutputter(&output.Options{
        Format:     "json",
        OutputFile: "result.json",
        Pretty:     true,
    })
    if err != nil {
        log.Fatalf("Failed to create outputter: %v", err)
    }

    // 处理输出
    err = outputter.Process(result)
    if err != nil {
        log.Fatalf("Failed to process output: %v", err)
    }

    fmt.Println("扫描完成,结果已保存到 result.json")
}

异步扫描示例

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/cyberspacesec/go-port-rocket/pkg/scanner"
)

func main() {
    // 创建扫描器
    s, err := scanner.NewScanner(&scanner.ScanOptions{
        Target:           "example.com",
        Ports:            "1-1000",
        ScanType:         scanner.ScanTypeTCP,
        Workers:          200,
        EnableService:    true,
    })
    if err != nil {
        log.Fatalf("Failed to create scanner: %v", err)
    }

    // 启动异步扫描
    portChan, resultChan, errChan := s.ScanAsync()

    // 显示进度条
    fmt.Println("正在扫描,请稍候...")
    fmt.Println("[                    ]")
    fmt.Print("\033[1A") // 光标上移一行
    fmt.Print("\033[2C") // 光标右移两列

    // 处理端口结果
    var openPorts int
    go func() {
        for port := range portChan {
            if port.State == scanner.PortStateOpen {
                openPorts++
                fmt.Printf("发现开放端口 %d/%s", port.Port, port.Type)
                if port.ServiceName != "" {
                    fmt.Printf(" (%s %s)", port.ServiceName, port.Version)
                }
                fmt.Println()
                // 更新进度条
                fmt.Print("=")
            }
        }
    }()

    // 处理错误
    go func() {
        for err := range errChan {
            log.Printf("错误: %v", err)
        }
    }()

    // 获取最终结果
    result := <-resultChan
    fmt.Printf("\n\n扫描完成,耗时 %s\n", result.ScanTime)
    fmt.Printf("共找到 %d 个开放端口\n\n", openPorts)
    
    // 等待所有处理完成
    time.Sleep(time.Second)
}

SYN隐蔽扫描示例

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/cyberspacesec/go-port-rocket/pkg/scanner"
    "github.com/cyberspacesec/go-port-rocket/pkg/output"
)

func main() {
    // 注意:SYN扫描需要root/管理员权限
    s, err := scanner.NewScanner(&scanner.ScanOptions{
        Target:   "192.168.1.1",
        Ports:    "1-1024",
        ScanType: scanner.ScanTypeSYN,  // 使用SYN半开放扫描
        Timeout:  2 * time.Second,
        Workers:  50,
    })
    if err != nil {
        log.Fatalf("创建扫描器失败: %v", err)
    }

    fmt.Println("开始SYN隐蔽扫描...")
    results, err := s.Scan()
    if err != nil {
        log.Fatalf("扫描失败: %v", err)
    }

    // 创建输出处理器
    outputter, err := output.NewOutputter(&output.Options{
        Format:     "text",
        Colorize:   true,  // 在终端中使用彩色输出
    })
    if err != nil {
        log.Fatalf("创建输出处理器失败: %v", err)
    }

    // 处理并输出结果
    fmt.Println("\n扫描结果:")
    formatted, err := outputter.Format(results)
    if err != nil {
        log.Fatalf("格式化结果失败: %v", err)
    }
    fmt.Println(formatted)
}

UDP服务扫描示例

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/cyberspacesec/go-port-rocket/pkg/scanner"
    "github.com/cyberspacesec/go-port-rocket/pkg/output"
)

func main() {
    // UDP扫描常用端口
    commonUdpPorts := "53,67,68,69,123,137,138,161,162,1900,5353"
    
    // 创建UDP扫描器
    s, err := scanner.NewScanner(&scanner.ScanOptions{
        Target:        "example.com",
        Ports:         commonUdpPorts,
        ScanType:      scanner.ScanTypeUDP,
        Timeout:       5 * time.Second,
        Workers:       10,            // UDP扫描通常使用较少的并发
        EnableService: true,          // 启用服务检测
        ServiceProbe:  true,          // 启用UDP服务探测
        Retries:       2,             // UDP扫描重试次数
    })
    if err != nil {
        log.Fatalf("创建扫描器失败: %v", err)
    }

    fmt.Printf("开始UDP扫描 %s 的常用端口...\n", s.Options().Target)
    startTime := time.Now()

    results, err := s.Scan()
    if err != nil {
        log.Fatalf("扫描失败: %v", err)
    }

    // 扫描耗时
    duration := time.Since(startTime)
    
    // 统计开放端口
    var openPorts int
    for _, port := range results {
        if port.State == scanner.PortStateOpen {
            openPorts++
        }
    }
    
    // 输出结果
    fmt.Printf("\n扫描完成,耗时: %.2f秒\n", duration.Seconds())
    fmt.Printf("发现 %d 个开放的UDP端口\n\n", openPorts)
    
    // 格式化输出
    outputter, _ := output.NewOutputter(&output.Options{
        Format: "text",
        Pretty: true,
    })
    
    formattedOutput, _ := outputter.Format(results)
    fmt.Println(formattedOutput)
}

最佳实践

错误处理

在使用Port Rocket API时,正确的错误处理非常重要:

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/cyberspacesec/go-port-rocket/pkg/scanner"
    "github.com/cyberspacesec/go-port-rocket/pkg/utils"
)

func main() {
    target := "example.com"

    // 1. 验证目标地址
    if err := utils.ValidateTarget(target); err != nil {
        log.Fatalf("无效的目标地址: %v", err)
    }

    // 2. 验证端口范围
    ports := "1-65535"
    if err := utils.ValidatePortRange(ports); err != nil {
        log.Fatalf("无效的端口范围: %v", err)
    }

    // 3. 验证超时时间
    timeout := 5 * time.Second
    if err := utils.ValidateTimeout(timeout); err != nil {
        log.Fatalf("无效的超时时间: %v", err)
    }

    // 4. 创建扫描器时处理错误
    scanner, err := scanner.NewScanner(&scanner.ScanOptions{
        Target:   target,
        Ports:    ports,
        ScanType: scanner.ScanTypeTCP,
        Timeout:  timeout,
        Workers:  100,
    })
    if err != nil {
        log.Fatalf("创建扫描器失败: %v", err)
    }

    // 5. 执行扫描时处理错误
    results, err := scanner.Scan()
    if err != nil {
        log.Fatalf("扫描失败: %v", err)
    }

    fmt.Printf("扫描完成,发现 %d 个端口\n", len(results))
}

性能优化

以下是一些性能优化建议:

  • 合理设置并发数:根据目标网络和本地资源调整Workers数量
  • 选择合适的扫描类型:SYN扫描比TCP扫描更快但需要特权
  • 设置合理的超时时间:过短会漏检,过长会影响速度
  • 使用端口范围:避免扫描不必要的端口

安全考虑

  • 获得授权:确保有权限扫描目标网络
  • 控制扫描强度:避免对目标造成过大负载
  • 保护扫描结果:妥善处理敏感的扫描数据
  • 遵守法律法规:确保扫描活动符合当地法律

集成建议

// 推荐的项目结构
project/
├── main.go                 // 主程序入口
├── config/
│   └── config.go          // 配置管理
├── scanner/
│   ├── scanner.go         // 扫描器封装
│   └── result.go          // 结果处理
├── output/
│   └── formatter.go       // 输出格式化
└── utils/
    └── helpers.go         // 工具函数