Go端口扫描工具核心是用net.DialTimeout并发探测TCP连接,通过goroutine控制并发量,配合channel收集结果,并以表格、JSON或CSV格式结构化输出,同时需注意超时、错误处理与输入校验。

开发一个Golang端口扫描工具并不复杂,关键在于理解网络连接的基本原理和如何高效地探测目标主机的开放端口。通过Go语言的并发特性,可以轻松实现快速、稳定的端口探测功能,并将结果清晰展示。
使用 net 包进行端口连接探测
Go标准库中的 net 包提供了基础的网络通信能力,适合用来实现TCP端口扫描。核心思路是尝试与目标IP和指定端口建立TCP连接,若连接成功则说明端口开放。
示例代码片段:
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", targetIP, port), 3*time.Second)
if err == nil {
fmt.Printf("Port %d is open\n", port)
conn.Close()
}
这里使用 DialTimeout 避免长时间阻塞,设置超时时间提升扫描效率。对于大量端口扫描任务,单线程逐个检测会很慢,因此需要引入并发机制。
立即学习“go语言免费学习笔记(深入)”;
利用 Goroutine 实现并发扫描
Go的Goroutine轻量高效,非常适合用于并行执行多个端口探测任务。通过启动多个协程同时检测不同端口,可显著缩短整体扫描时间。
建议使用带缓冲的channel控制并发数量,防止系统资源被耗尽:
- 创建固定数量的工作协程,从任务channel读取待扫描端口
- 主程序将目标端口依次发送到任务channel
- 每个协程执行实际的Dial操作并将结果写入结果channel
- 主程序收集结果并输出或保存
这种方式既能充分利用多核CPU,又能避免因并发过高导致操作系统限制或网络拥堵。
结构化展示扫描结果
为了便于查看和后续处理,扫描结果应以清晰的方式呈现。可以选择以下几种格式之一:
-
控制台表格输出:使用如
github.com/olekukonko/tablewriter库在终端绘制表格,显示IP、端口、状态和服务名 - JSON格式导出:将结果序列化为JSON,方便其他程序调用或存储到文件
- CSV文件生成:适合导入Excel或其他分析工具
例如,识别常见端口对应的服务(如22→SSH,80→HTTP),能增强结果可读性:
if port == 80 {
service = "HTTP"
}
基本上就这些。结合超时控制、并发调度和结果美化,就能构建出一个实用的Golang端口扫描工具。不复杂但容易忽略细节,比如错误分类、重复扫描防护和用户输入校验,这些在实际使用中都很重要。










