通八洲科技

如何使用Golang实现端口扫描工具_检测目标主机端口状态

日期:2025-12-25 00:00 / 作者:P粉602998670
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 协同工作,限制并发数防止系统资源耗尽或触发防火墙限流。

支持常见扫描模式

可根据需求灵活切换扫描范围和行为:

简单健壮性增强建议

生产级使用需注意几个细节:

不复杂但容易忽略