Go端口扫描工具核心是net.DialTimeout并发探测,通过goroutine+channel控制并发数,支持端口列表、范围、常用端口及CIDR批量扫描,并需设置合理超时、错误处理和命令行参数。

用 Go 语言写一个轻量、高效的端口扫描工具并不难,核心在于利用 net.DialTimeout 快速探测 TCP 连接是否可达,同时通过并发控制避免阻塞和过度消耗资源。
基础 TCP 端口探测逻辑
最直接的方式是尝试与目标 IP:Port 建立 TCP 连接。如果连接成功(返回 nil error),说明端口开放;超时或拒绝连接则通常表示关闭或被过滤。
示例关键代码:
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", ip, port), 2*time.Second)
if err == nil {
conn.Close()
fmt.Printf("Port %d is open\n", port)
} else if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
fmt.Printf("Port %d timeout\n", port)
} else {
fmt.Printf("Port %d closed or filtered\n", port)
}
支持并发扫描提升效率
单个端口逐个扫描太慢,应使用 goroutine + channel 协同工作,限制并发数防止系统资源耗尽或触发防火墙限流。
立即学习“go语言免费学习笔记(深入)”;
- 用带缓冲的 channel 控制最大并发数(如 100 个 goroutine 同时运行)
- 将待扫描端口放入任务 channel,每个 goroutine 从其中取任务执行
- 结果通过另一个 channel 收集,主 goroutine 统一输出
支持常见扫描模式
可根据需求灵活切换扫描范围和行为:
- 指定端口列表:如 [22, 80, 443, 8080]
- 端口范围扫描:如 1–1000 或 1–65535
-
常用端口快速扫描:内置 top 100 或 top 1000 端口(参考 nmap 的
nmap-services) -
支持 CIDR 批量主机:如
192.168.1.0/24,用net.ParseCIDR解析并遍历 IP
简单健壮性增强建议
生产级使用需注意几个细节:
- 设置合理的超时时间(1–3 秒较平衡,过短漏报,过长拖慢整体)
- 捕获并忽略常见临时错误(如
too many open files),可调高 ulimit 或降低并发 - 对 ICMP 不可达等网络层错误做区分,避免误判为端口关闭
- 加简单命令行参数支持(flag 包),例如:
-host 127.0.0.1 -p 22,80,443 -range 1-1000 -t 2










