跳到主要内容

synscan

synscan 是 SYN 半开放端口扫描模块:自行构造并发送 TCP 三次握手的第一个 SYN 包,只要收到对端的 SYN-ACK 即判定端口开放,随后发 RST 中断握手,不建立完整 TCP 连接。它绕开了操作系统对连接状态与文件描述符的维护,原理类似 masscan——短时间内把 SYN 包批量发出,再统一等待一段时间收集回包,因此速度极快、资源消耗极低,适合大范围端口快速探活。

核心接口是 synscan.Scan(targets, ports, opts...),targets 支持 IP、CIDR、域名,ports 支持 22,80,443、1-65535、1-100,200-300 等写法;返回结果 channel 流式产出 *SynScanResult,每个结果含 Host 与 Port,可调用 Show() 打印。由于是批量发包后等待,提供 wait(秒) 控制收包等待时长,并有 rateLimit/concurrent 控速、excludeHosts/excludePorts 排除、outputFile/outputPrefix 落盘、context 取消等可选项。

注意:SYN 扫描使用原始套接字,需要 root/管理员权限,可先用 synscan.FixPermission() 修复权限;高速发包可能造成短暂网络拥塞或被防火墙拦截,且丢包会带来误差,需谨慎使用。synscan 常作为扫描链路的第一步,配合 servicescan.ScanFromSynResult 做"先探活、再识别指纹"的高效组合。

共 18 个函数

函数索引

函数参数返回值说明
synscan.FixPermission-error尝试修复 pcap 权限问题(SYN 扫描依赖原始套接字,需要相应权限)

可变参数函数索引

函数参数返回值说明
synscan.Scantargets string, ports string, opts ...synscanx.SynxConfigOptionchan *synscan.SynScanResult, error使用 SYN 扫描技术进行端口扫描,它不必打开一个完整的TCP连接,只发送一个SYN包,就能做到打开连接的效果,然后等待对端的反应
synscan.ScanFromPingres chan *pingutil.PingResult, ports string, opts ...synscanx.SynxConfigOptionchan *synscan.SynScanResult, error对使用 ping.Scan 探测出的存活结果进行端口扫描,需要配合 ping.Scan 使用

函数详情

FixPermission

FixPermission() error

尝试修复 pcap 权限问题(SYN 扫描依赖原始套接字,需要相应权限)

返回值

序号类型说明
r1error修复失败时返回错误,为 nil 表示可正常使用 syn 扫描

示例:扫描前修复 pcap 权限

// SYN 扫描需要原始套接字权限,扫描前先修复一次
err = synscan.FixPermission()
if err != nil {
log.error("fix pcap permission failed: %v", err)
return
}
log.info("pcap permission is ready for syn scan")

可变参数函数详情

Scan

Scan(targets string, ports string, opts ...synscanx.SynxConfigOption) (chan *synscan.SynScanResult, error)

使用 SYN 扫描技术进行端口扫描,它不必打开一个完整的TCP连接,只发送一个SYN包,就能做到打开连接的效果,然后等待对端的反应

必填参数

参数名类型说明
targetsstring目标地址,支持 CIDR 格式
portsstring端口,支持 1-65535、1,2,3、1-100,200-300 格式

可选参数

可作为可变参数 opts ...synscanx.SynxConfigOption 传入选项;共 15 个可用选项,详见 SynxConfigOption 选项列表

返回值

序号类型说明
r1chan *synscan.SynScanResultchan *synscan.SynScanResult: SYN 扫描结果管道,逐个产出开放端口
r2error启动失败时返回错误

示例:synscan.Scan 的基础 SYN 扫描

// 对本机常见端口做 SYN 扫描,遍历结果管道逐个打印开放端口
res, err = synscan.Scan("127.0.0.1", "22,80,443,3306,8080-8090")
die(err) // 启动失败(如缺少权限)时停止脚本
for result := range res {
result.Show() // 打印 OPEN: host:port from synscan
}

示例:自定义发包后的等待时间

// SYN 扫描是批量发包后统一等待回包,wait 设置等待秒数(网络差可调大以减少漏报)
res, err = synscan.Scan("192.168.1.1/24", "1-65535", synscan.wait(5))
die(err)
for result := range res {
println(f"open: ${result.Host}:${result.Port}")
}

示例:限速扫描并将开放端口写入文件

// 控制发包速率,并把开放端口写入文件,每行带 tcp:// 前缀便于后续处理
res, err = synscan.Scan("10.0.0.0/24", "80,443",
synscan.rateLimit(1, 1000), // 每 1 毫秒最多发送 1000 个包
synscan.outputFile("open_ports.txt"),
synscan.outputPrefix("tcp://"),
)
die(err)
for result := range res {
result.Show()
}

ScanFromPing

ScanFromPing(res chan *pingutil.PingResult, ports string, opts ...synscanx.SynxConfigOption) (chan *synscan.SynScanResult, error)

对使用 ping.Scan 探测出的存活结果进行端口扫描,需要配合 ping.Scan 使用

必填参数

参数名类型说明
reschan *pingutil.PingResultping.Scan 的扫描结果管道
portsstring端口,支持 1-65535、1,2,3、1-100,200-300 格式

可选参数

可作为可变参数 opts ...synscanx.SynxConfigOption 传入选项;共 15 个可用选项,详见 SynxConfigOption 选项列表

返回值

序号类型说明
r1chan *synscan.SynScanResultchan *synscan.SynScanResult: SYN 扫描结果管道,逐个产出开放端口
r2error启动失败时返回错误

示例:先 ping 探活再做 SYN 端口扫描

// 先用 ping 探活,再只对存活主机做 SYN 端口扫描,避免对死主机无谓发包
pingResult, err = ping.Scan("192.168.1.1/24")
die(err)
res, err = synscan.ScanFromPing(pingResult, "22,80,443,3389")
die(err)
for result := range res {
result.Show()
}

可变参数选项列表

以下按选项类型汇总全部可变参数选项(原先重复在各主函数下的选项表已收拢到此处):

1. 类型:SynxConfigOption

涉及到的函数有:synscan.Scansynscan.ScanFromPing

选项函数参数返回值说明
synscan.callbackcallback func(result *synscan.SynScanResult)SynxConfigOptionsyn scan 的配置选项,设置一个回调函数,每发现一个端口就会调用一次
synscan.concurrentcount intSynxConfigOptionsyn scan 的配置选项,设置 syn 扫描的发包速率,和 rateLimit 基本相同
synscan.contextctx context.ContextSynxConfigOption设置 SYN 扫描使用的 context,用于取消或超时控制
synscan.excludeHostshosts stringSynxConfigOptionsyn scan 的配置选项,设置本次扫描排除的主机
synscan.excludePortsports stringSynxConfigOptionsyn scan 的配置选项,设置本次扫描排除的端口
synscan.ifaceiface stringSynxConfigOptionsyn scan 的配置选项,设置 syn 扫描的网卡
synscan.initHostFilterhosts stringSynxConfigOptionsyn scan 的配置选项,设置本次扫描的主机过滤器,只展示这些主机的扫描结果
synscan.initPortFilterports stringSynxConfigOptionsyn scan 的配置选项,设置本次扫描的端口过滤器,只展示这些端口的扫描结果
synscan.maxPortsmax intSynxConfigOptionmaxOpenPorts syn scan 的配置选项,设置单个 IP 允许的最大开放端口数
synscan.outputFilefile stringSynxConfigOptionsyn scan 的配置选项,设置本次扫描结果保存到指定的文件
synscan.outputPrefixprefix stringSynxConfigOptionsyn scan 的配置选项,设置本次扫描结果保存到文件时添加自定义前缀,比如 tcp:// https:// http:// 等,需要配合 outputFile 使用
synscan.rateLimitms int, count intSynxConfigOptionsyn scan 的配置选项,设置 syn 扫描的速率
synscan.shuffles boolSynxConfigOptionsyn scan 的配置选项,设置是否打乱扫描顺序
synscan.submitTaskCallbackcallback func(i string)SynxConfigOptionsyn scan 的配置选项,设置一个回调函数,每提交一个探测数据包的时候,这个回调会执行一次
synscan.waitsec float64SynxConfigOptionsyn scan 的配置选项,设置等待扫描目标回包的最大时间