moveeeax/portping
GitHub: moveeeax/portping
一个用 Go 编写的并发 TCP 端口可达性扫描器,支持 CIDR 展开与多种输出格式,用于快速批量检测网络连通性。
Stars: 0 | Forks: 0
# portping
`portping` 是一个小巧且并发的 TCP 可达性扫描器。它通过一个有限大小的 worker pool 来探测 `host:port` 目标,测量连接延迟,并将结果以对齐的表格或 JSON 数组的形式输出。
它非常适合用于快速的网络检查:确认防火墙更改、验证服务是否在整个子网中监听,或者扫描主机上的某个端口范围。
## 安装
```
go install github.com/moveeeax/portping@latest
```
或者从检出的代码中构建:
```
go build -o portping .
```
要求 Go 1.17 或更高版本。无第三方依赖。
## 用法
```
usage: portping [flags] target [target ...]
A target is HOST:PORTS, where HOST may be a hostname, IP, or IPv4 CIDR
and PORTS may be a list and/or range, e.g. 10.0.0.0/28:22,80,8000-8010
```
### 目标
目标被书写为 `HOST:PORTS` 的形式:
- **HOST** — 主机名(`example.com`)、IP 字面量(`10.0.0.5`、`[::1]`)或 IPv4 CIDR 块(`10.0.0.0/28`)。
- **PORTS** — 逗号分隔的端口和/或范围列表,例如 `22`、`22,80,443` 或 `8000-8010`。
CIDR 展开会针对 `/30` 及更短的前缀排除网络地址和广播地址。`/31` 会生成两个地址(RFC 3021 点对点),而 `/32` 会生成单个主机地址。
目标可以通过参数传递、使用 `--file` 从文件读取,或者通过管道输入到 stdin(`--file -`,或者直接不提供参数)。在文件和 stdin 中,空行和以 `#` 开头的行会被忽略,并且一行中以空格分隔的多个目标都会被读取。
### Flags
| Flag | 默认值 | 描述 |
| --- | --- | --- |
| `--timeout` | `2s` | 每次连接的超时时间。 |
| `--concurrency` | `64` | 并发 worker 的数量。 |
| `--count` | `1` | 在宣布目标不可达之前的连接尝试次数。 |
| `--json` | `false` | 以 JSON 数组形式输出结果。 |
| `--open-only` | `false` | 仅报告可达的目标。 |
| `--file` | | 从文件中读取目标(`-` 表示从 stdin 读取)。 |
| `--fail-on-unreachable` | `true` | 如果有任何目标不可达,则以非零状态码退出。 |
### 退出码
- `0` — 所有探测的目标均可达(或者设置了 `--fail-on-unreachable=false`)。
- `1` — 一个或多个目标不可达。
- `2` — 无效的参数或目标。
## 示例
扫描 localhost 上的几个端口:
```
$ portping 127.0.0.1:22,80,443
TARGET STATE LATENCY ATTEMPTS DETAIL
127.0.0.1:22 open 0.3ms 1
127.0.0.1:80 closed - 1 dial tcp 127.0.0.1:80: connect: connection refused
127.0.0.1:443 closed - 1 dial tcp 127.0.0.1:443: connect: connection refused
```
以极短的超时时间扫描 /28 网段中的 SSH 端口,仅显示有响应的结果:
```
$ portping --timeout 300ms --open-only 10.0.0.0/28:22
```
输出 JSON 以便进一步处理:
```
$ portping --json 10.0.0.0/30:22,80
```
从 stdin 读取目标:
```
$ printf '10.0.0.1:22\n10.0.0.2:80\n' | portping --file -
```
## 目录结构
- `internal/scan` — 纯粹的目标解析、CIDR/端口展开、结果聚合以及 worker pool。
- `internal/probe` — 通过可注入的 `Dialer` 接口进行 TCP 连接,以提高可测试性。
- `main.go` — 命令行界面。
## 许可证
MIT。详见 [LICENSE](LICENSE)。
标签:EVTX分析, Go, Ruby工具, TCP, 并发探测, 数据统计, 日志审计, 端口扫描, 网络工具