Go端口扫描工具核心是net.DialTimeout并发探测,通过goroutine+channel控制并发数,支持端口列表、范围、常用端口及CIDR批量扫描,并需设置合理超时、错误处理和命令行参数。
用 Go 语言写一个轻量、高效的端口扫描工具并不难,核心在于利用 net.DialTimeout 快速探测 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 协同工作,限制并发数防止系统资源耗尽或触发防火墙限流。
可根据需求灵活切换扫描范围和行为:
nmap-services)192.168.1.0/24,用 net.ParseCIDR 解析并遍历 IP生产级使用需注意几个细节:
too many open files),可调高 ulimit 或降低并发-host 127.0.0.1 -p 22,80,443 -range 1-1000 -t 2