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 的服务检测功能,通过发送特定探测数据包并分析响应来确定服务类型和版本。
服务检测工作原理
服务检测通过以下步骤实现:
- 对开放端口发送特定的探测数据包
- 收集响应数据(如banner信息)
- 根据响应内容匹配服务指纹数据库
- 识别服务类型、名称和版本信息
使用服务检测
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值、选项等)来确定可能的操作系统。
操作系统检测工作原理
操作系统检测基于以下技术:
- 发送特殊构造的TCP数据包探测目标系统
- 分析响应包中的TCP/IP栈参数和行为特征
- 与数据库中的指纹进行匹配计算相似度
- 返回最匹配的操作系统及置信度
使用操作系统检测
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 // 工具函数