rjeff-sudo/port-scanner
GitHub: rjeff-sudo/port-scanner
一个基于 Go 的并发 TCP 端口扫描与网络监控工具,解决批量发现开放端口、服务与操作系统识别的问题。
Stars: 0 | Forks: 0
# 端口扫描器与网络监控器
使用 Go 编写的并发 TCP 端口扫描器和持续网络监控工具。扫描一系列 IP 和端口,使用 TCP 连接扫描检测开放端口,获取服务横幅,执行操作系统识别,并以彩色表格清晰报告结果。作为学习 Go 的系统编程和网络工具而构建。
## 工具
本项目包含两个独立的可执行文件:
- **port-scanner** — 扫描一次网络后退出
- **network-monitor** — 持续监控网络并在发现变化时发出警报
## 功能
- 使用并发 worker 池的 TCP 连接扫描
- 横幅抓取 — 识别每个开放端口上运行的服务
- 从横幅中识别操作系统 — 将设备标记为 Ubuntu、Debian、MikroTik、Windows、iOS、嵌入式/IoT 等
- 反向 DNS 查找 — 解析发现设备的主机名
- 扫描时的实时进度条
- 带颜色的排序汇总表输出
- 端口配置文件 — 按名称而非数字进行扫描
- 详细模式 — 显示关闭和过滤的端口
- 速率限制 — 控制每秒探测数
- 结果保存为 `.json`、`.csv` 或 `.txt`
- 网络状态持久化 — 监控程序在重启后仍记住网络状态
- 按网络自动命名的状态文件 — 切换网络时避免冲突
## 项目结构
```
port-scanner/
├── cmd/
│ ├── scanner/
│ │ └── main.go → port scanner entry point
│ └── monitor/
│ └── main.go → network monitor entry point
├── scanner/
│ ├── scanner.go → TCP scanning, banner grabbing, worker pool
│ ├── ip.go → IP parsing, range generation, reverse DNS
│ ├── result.go → result struct, table output, file saving
│ └── os.go → OS detection from banners
├── monitor/
│ ├── monitor.go → change detection, monitoring loop
│ └── state.go → network snapshots, state persistence
├── go.mod
├── go.sum
└── README.md
```
## 需求
- Go 1.21 或更高版本
- Linux / macOS
- 对目标范围的网络访问权限
## 安装
### 在任意机器上
```
# 克隆仓库
git clone https://github.com/rjeff-sudo/port-scanner.git
cd port-scanner
# 如果需要,修复 GOPATH(特别是在共享/实验室机器上)
export GOPATH=$HOME/go
export GOMODCACHE=$HOME/go/pkg/mod
# 使其永久生效
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export GOMODCACHE=$HOME/go/pkg/mod' >> ~/.bashrc
source ~/.bashrc
# 构建两个工具
go build ./...
go build -o port-scanner ./cmd/scanner
go build -o network-monitor ./cmd/monitor
```
Go 将在首次构建时自动下载所有依赖项。
## 用法
### 端口扫描器
```
# 扫描单个机器
./port-scanner -target 192.168.1.1 -ports 22,80,443 -workers 100
# 扫描网络范围
./port-scanner -target 192.168.1.1-192.168.1.254 -ports 22,80,443 -workers 200
# 使用端口配置文件
./port-scanner -target 192.168.1.1-192.168.1.254 -ports common
./port-scanner -target 192.168.1.1-192.168.1.254 -ports web
./port-scanner -target 192.168.1.1-192.168.1.254 -ports db
./port-scanner -target 192.168.1.1-192.168.1.254 -ports ssh
# 扫描单个机器上的所有端口
./port-scanner -target 192.168.1.1 -ports 1-65535 -workers 500
# 限速扫描
./port-scanner -target 192.168.1.1-192.168.1.254 -ports common -rate 100
# 将结果保存到文件
./port-scanner -target 192.168.1.1-192.168.1.254 -ports common -output results.json
./port-scanner -target 192.168.1.1-192.168.1.254 -ports common -output results.csv
# 详细模式(显示关闭的端口)
./port-scanner -target 192.168.1.1 -ports common -v
```
#### 端口扫描器标志
| 标志 | 默认值 | 描述 |
|---|---|---|
| `-target` | 必需 | IP 或范围(例如 `192.168.1.1` 或 `192.168.1.1-192.168.1.254`) |
| `-ports` | `common` | 端口范围、列表或配置文件(`common/web/db/ssh`) |
| `-workers` | `100` | 并发工作数 |
| `-timeout` | `1` | 连接超时(秒) |
| `-rate` | `0` | 每秒最大探测数(0 = 无限制) |
| `-output` | `` | 保存结果到文件(`.json`、`.csv`、`.txt`) |
| `-v` | `false` | 详细模式 — 显示关闭端口 |
### 端口配置文件
| 配置文件 | 端口 |
|---|---|
| `common` | 21, 22, 23, 25, 53, 80, 110, 111, 135, 139, 143, 443, 445, 993, 995, 1723, 3306, 3389, 5900, 8080 |
| `web` | 80, 443, 8080, 8443, 8000, 8888 |
| `db` | 3306, 5432, 6379, 27017, 1433, 5984 |
| `ssh` | 22, 2222, 521 |
### 网络监控器
```
# 每 60 秒监控网络
./network-monitor -target 192.168.1.1-192.168.1.254 -ports 22,80,443 -workers 200 -interval 60
# 每 20 秒监控一次
./network-monitor -target 192.168.1.1-192.168.1.254 -ports 22,80,443 -workers 200 -interval 20
# 使用自定义状态文件
./network-monitor -target 192.168.1.1-192.168.1.254 -ports 22,80,443 -state office.json
# 监控不同的网络(状态文件按网络自动命名)
./network-monitor -target 10.0.0.1-10.0.0.254 -ports 22,80,443 -workers 200 -interval 60
```
#### 网络监控器标志
| 标志 | 默认值 | 描述 |
|---|---|---|
| `-target` | 必需 | 要监控的 IP 或范围 |
| `-ports` | `22,80,443` | 要监控的端口 |
| `-workers` | `100` | 并发工作数 |
| `-timeout` | `1` | 连接超时(秒) |
| `-interval` | `60` | 扫描间隔(秒) |
| `-state` | auto | 状态文件路径(默认:按目标自动命名的状态文件) |
## 示例输出
```
Scanning 254 IP(s) across 3 port(s) with 200 workers...
HOST IP PORT STATUS SERVICE OS
──────────────────────────────────────────────────────────────────────────────────────────
- 192.168.89.2 22 open SSH-2.0-ROSSSH MikroTik RouterOS
80 open - -
- 192.168.89.12 80 open Server: Caddy Linux (Caddy)
443 open - -
- 192.168.89.13 22 open SSH-2.0-OpenSSH_9.2p1 Debian Debian
- 192.168.89.165 22 open SSH-2.0-dropbear_2015.67 Embedded/IoT
80 open Server: GoAhead-Webs Embedded/IoT
LAP-092 192.168.89.190 22 open SSH-2.0-OpenSSH_9.6p1 Ubuntu Ubuntu
80 open Server: Apache/2.4.58 (Ubuntu) Ubuntu
──────────────────────────────────────────────────────────────────────────────────────────
Found 121 open port(s) across 62 host(s)
```
### 监控输出
```
--- Network Monitor Started ---
Target: 192.168.89.1-192.168.89.254 | Interval: 20s | State: state_192_168_89_1_192_168_89_254.json
[*] No previous state found. Establishing baseline...
[+] Baseline established — 63 device(s) found
[15:22:30] Scanning...
[15:22:33] 2 change(s) detected:
[NEW DEVICE] 192.168.89.88:22 -> SSH-2.0-OpenSSH_9.6p1 Ubuntu
[LOST DEVICE] 192.168.89.34:80 -> Server: Apache/2.4.58 (Ubuntu)
[15:22:50] Scanning...
[15:22:53] No changes detected
```
## 操作系统识别
扫描器根据 SSH 和 HTTP 横幅识别操作系统:
| 横幅 | 识别的操作系统 |
|---|---|
| `SSH-2.0-OpenSSH_x.x Ubuntu` | Ubuntu |
| `SSH-2.0-OpenSSH_x.x Debian` | Debian |
| `SSH-2.0-ROSSSH` | MikroTik RouterOS |
| `SSH-2.0-dropbear` | 嵌入式/IoT |
| `Server: Microsoft-IIS` | Windows Server |
| `Server: GCDWebServer` | iOS |
| `Server: GoAhead-Webs` | 嵌入式/IoT |
| `Server: Caddy` | Linux (Caddy) |
| `Server: Apache` | Linux (Apache) |
| `Server: nginx` | Linux (Nginx) |
## 重要提示
仅扫描您拥有或明确获得许可的网络和设备。未经授权的端口扫描可能违反您所在国家的计算机滥用法律。
## 构建依赖
- [Go](https://golang.org) — 系统编程语言
- [fatih/color](https://github.com/fatih/color) — 终端颜色
- [schollz/progressbar](https://github.com/schollz/progressbar) — 实时进度条
## 作者
Jeff — Zone01 Kisumu
标签:Banner抓取, CSV, DNS查询工具, EVTX分析, Go, Goroutine, IP范围扫描, JSON, OS指纹识别, Ruby工具, TCP Connect扫描, TCP端口扫描, 反向DNS, 实时进度条, 工作池, 并发, 彩色表格输出, 扫描工具, 数据泄露防护, 文本报告, 日志审计, 端口扫描器, 端口范围, 端口配置文件, 系统编程, 结果持久化, 网络安全, 网络工具, 网络探测, 网络状态持久化, 自动命名状态文件, 详细模式, 隐私保护, 项目学习