radivan15/tcp-port-scanner
GitHub: radivan15/tcp-port-scanner
一个纯 Go 编写的轻量级 TCP 端口扫描 CLI 工具,通过并发 goroutine 池实现对目标主机端口开放状态的快速探测。
Stars: 0 | Forks: 0
# TCP 端口扫描器
一个用于扫描主机 TCP 端口的简单 CLI 工具。使用纯 Go 构建 —— 无外部依赖。
## 安装说明
请确保已安装 [Go](https://go.dev/dl/) 1.23 或更高版本。
```
git clone https://github.com/radivan15/tcp-port-scanner.git
cd tcp-port-scanner
go build -o port-scanner .
```
## 用法
### 扫描单个端口
```
./port-scanner -host scanme.nmap.org -port 80
```
### 扫描端口范围(并发,默认 100 个 worker)
```
./port-scanner -host scanme.nmap.org -start 1 -end 1024
```
### 使用自定义 worker 数量进行扫描
```
# 更快的扫描
./port-scanner -host scanme.nmap.org -start 1 -end 1024 -workers 200
# 更节省资源
./port-scanner -host scanme.nmap.org -start 1 -end 1024 -workers 50
```
### 使用自定义超时时间(毫秒)进行扫描
```
# 300ms timeout — 适用于本地或快速网络
./port-scanner -host 192.168.1.1 -start 1 -end 1024 -timeout 300
# 2000ms timeout — 适用于慢速或远程网络
./port-scanner -host scanme.nmap.org -start 1 -end 1024 -timeout 2000
```
## 示例输出
```
Scanning scanme.nmap.org port 1-1024 (workers: 100)...
Port 22 OPEN
Port 80 OPEN
Total: 2 open out of 1024 ports
Scan time: 1.043s
```
## 为什么开发这个工具
作为一名 SRE,我经常使用 `nmap` 等工具进行网络调试和事件响应。我想了解其底层的工作原理 —— 并发扫描究竟是如何运行的,以及 Go 如何使用 goroutine 和 channel 高效处理成千上万的 TCP 连接。
## 我的收获
- 使用 `net.DialTimeout` 在代码层面了解 TCP 连接的工作原理
- 朴素 goroutine(每个任务一个)与 goroutine 池(固定数量的 worker + channel 队列)之间的区别
- Go channel 如何充当任务队列 —— 类似于分布式系统中的任务队列
- 使用 `sync.WaitGroup` 等待所有 worker 完成
- 超时和并发设置如何影响扫描速度与资源消耗
## 路线图
- [x] 第一阶段 —— 通过 CLI flag 扫描单个端口
- [ ] 第二阶段 —— 顺序端口范围扫描
- [ ] 第三阶段 —— 使用 goroutine 进行并发扫描(每个端口一个 goroutine)
- [ ] 第四阶段 —— 带有 channel 队列 + `-workers` flag 的 goroutine 池
- [ ] 第五阶段 —— 通过 `-timeout` flag 配置单个端口超时时间
- [ ] 第六阶段 —— 带有摘要(开放数量 + 扫描持续时间)的精美表格输出
### 计划功能
- 扫描主机上的单个端口
- 扫描端口范围(例如 1–1024)
- 使用 goroutine 进行并发扫描(速度更快)
- 通过 `-workers` flag 控制 worker 数量(goroutine)
- 通过 `-timeout` flag 配置单个端口的超时时间(毫秒)
- 输出包含开放端口数量和扫描持续时间的精美表格
## 许可证
MIT 许可证 —— 详见 [LICENSE](LICENSE)
标签:EVTX分析, Go, Ruby工具, TCP, 云存储安全, 并发编程, 插件系统, 数据泄露防护, 日志审计, 网络扫描, 网络探测