0

0

如何在Golang中编写一个端口扫描器 Go语言TCP连接并发测试

P粉602998670

P粉602998670

发布时间:2026-03-13 12:24:01

|

171人浏览过

|

来源于php中文网

原创

net.DialTimeout 更适合端口扫描,因其可精确控制连接超时(如500ms),避免默认30秒卡顿;Go 1.19+推荐复用net.Dialer并设Timeout字段;并发需限流,建议用带缓冲channel控制(如sem := make(chan struct{}, 100))。

如何在golang中编写一个端口扫描器 go语言tcp连接并发测试

为什么 net.DialTimeoutnet.Dial 更适合端口扫描

直接用 net.Dial 扫描会卡住:TCP 握手失败时默认等待约 30 秒才超时,扫 65535 个端口可能要几天。而 net.DialTimeout 允许你精确控制连接尝试时长(比如 500ms),这是并发扫描能落地的前提。

注意:net.DialTimeout 底层仍走 net.Dial,只是封装了 deadline;Go 1.19+ 推荐改用 net.Dialer + Timeout 字段,更灵活且可复用。

  • 超时设太短(如 50ms):内网可能漏报开放端口;设太长(如 2s):并发数稍高就拖慢整体速度
  • 别在循环里反复 new net.Dialer,复用一个实例能减少内存分配
  • Windows 上对已关闭端口的 RST 响应较慢,建议超时不低于 300ms

如何安全控制并发数避免被系统 kill 或丢包

开 10000 个 goroutine 同时拨号?大概率触发 Linux 的 net.ipv4.ip_local_port_range 耗尽、或被目标防火墙限速/拉黑。真实可用的并发数取决于你的网络栈和目标响应能力,不是越多越好。

推荐用带缓冲的 channel 做计数器,比 sync.WaitGroup + 全局变量更稳妥:

立即学习go语言免费学习笔记(深入)”;

sem := make(chan struct{}, 100) // 并发上限 100
for port := 1; port <= 65535; port++ {
    sem <- struct{}{} // 阻塞直到有空位
    go func(p int) {
        defer func() { <-sem }() // 释放
        conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", target, p), 500*time.Millisecond)
        if err == nil {
            conn.Close()
            fmt.Printf("open: %d\n", p)
        }
    }(port)
}
  • 缓冲大小建议从 50 起调,观察 ss -s 输出的“TCP: inuse”是否稳定
  • 别用 runtime.GOMAXPROCS 调整来“加速”——I/O 并发不靠 CPU 核心数
  • 某些云厂商(如 AWS SG)会对短连接风暴主动限流,测试前先扫单个 C 段验证策略

怎么判断端口“真开放”而不是中间设备干扰

收到 connection refused(ECONNREFUSED)说明端口明确关闭;但没回包 ≠ 开放——可能是防火墙 DROP、NAT 设备静默丢弃、或 ICMP 不可达被屏蔽。

PathFinder
PathFinder

AI驱动的销售漏斗分析工具

下载

仅靠 TCP connect 结果容易误判。稳妥做法是结合三次握手状态:

  • 成功建立连接(err == nil)→ 基本可认定开放(仍需后续协议交互确认服务)
  • 返回 dial tcp X:Y: i/o timeout → 大概率被过滤,不是“关闭”,需配合其他探测(如 SYN 扫描,但 Go 标准库不支持 raw socket)
  • 返回 connection refused → 真实关闭,内核明确拒绝
  • 遇到 too many open files 错误?立刻检查 ulimit -n,并加 runtime.LockOSThread() 防止 goroutine 跨线程导致 fd 泄漏

为什么不用 golang.org/x/net/proxy 做代理扫描

标准库 net 包不支持 SOCKS/HTTP 代理透传 TCP connect 请求。golang.org/x/net/proxy 只能包装 dialer,但多数代理(尤其 HTTP CONNECT)本身会拦截或重写 TCP 握手,导致端口状态失真——比如代理返回 200 OK 并不表示后端端口开放。

真要走代理,必须用支持原始 TCP 透传的 SOCKS5 服务器,并确认其未做端口白名单限制:

auth := proxy.Auth{User: "u", Password: "p"}
dialer, _ := proxy.SOCKS5("tcp", "127.0.0.1:1080", auth, proxy.Direct)
conn, err := dialer.Dial("tcp", "target:22") // 此处才真正发起目标连接
  • 绝大多数企业代理禁用 CONNECT 方法,或只允许可信端口(80/443),扫其他端口直接被拒绝
  • 代理链路增加 RTT,超时值需同步放大,否则大量误报“超时”
  • 别试图用 http.Transport 模拟 CONNECT——它会发 HTTP 请求头,和纯 TCP 扫描语义不符

端口扫描的本质是网络层连通性探测,加代理等于隔了一层不可控的状态转换,复杂度和误报率都会上升。除非明确需要绕过本地出口 IP 限制,否则优先直连。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

211

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

247

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

356

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

409

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

201

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1479

2025.06.17

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 6.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号