zuedev/NodeJS-PortScanner
GitHub: zuedev/NodeJS-PortScanner
一款轻量级的 Node.js 端口扫描器,支持 TCP/UDP 扫描、服务指纹识别及多种格式的报告导出,用于网络审计与安全学习。
Stars: 0 | Forks: 0
# 🔍 NodeJS-PortScanner
一个快速、轻量级的端口扫描器,带有服务指纹识别功能,使用 Node.js 构建。专为网络管理员和安全学习者设计,用于审计自己的系统。
## ⚠️ 法律免责声明
**仅扫描您拥有或获得明确书面授权的系统。** 未经授权的端口扫描可能会违反《计算机欺诈和滥用法》(美国)、《滥用法案》(英国)以及您所在司法管辖区的同等法律。对于任何滥用行为,作者不承担任何责任。
## ✨ 功能
- ⚡ **并发扫描**,带有可配置的连接限制
- 🌐 **TCP 和 UDP** 扫描 (`--protocol tcp|udp`)
- 🎯 **支持端口范围** (例如 `1-1024`, `80,443,8080`)
- 🔎 **服务指纹识别** — 通过 banner grabbing 识别常见服务
- ⏱️ **可配置的超时时间**,适用于响应缓慢或被过滤的主机
- 🛡️ **速率限制** 以减少网络噪音 (`--rate`)
- 📊 **清晰的表格输出**,可选择导出为 JSON 或 HTML
- 🪶 **零重型依赖** — 使用 Node 内置的 `net` 和 `dgram` 模块
## 🐳 使用 Docker 运行(推荐)
运行 NodeJS-PortScanner 最快的方法是使用 GitHub Container Registry 上的预构建镜像 —— 无需安装 Node.js 或克隆仓库。镜像名称后面的任何参数都会直接传递给扫描器:
```
docker run --rm ghcr.io/zuedev/nodejs-portscanner --host example.com --ports 1-1024
docker run --rm ghcr.io/zuedev/nodejs-portscanner --help
```
### 扫描宿主机自身的网络
默认情况下,容器从其自身隔离的网络命名空间进行扫描。在 **Linux** 上,共享宿主机网络可以访问宿主机自身的接口或 `localhost`:
```
docker run --rm --network host ghcr.io/zuedev/nodejs-portscanner --host 127.0.0.1 --ports 1-1024
```
### 保存 JSON 报告
挂载一个可写目录并将报告写入其中:
```
docker run --rm -v "${PWD}:/data" ghcr.io/zuedev/nodejs-portscanner -h example.com -p 1-1024 -o /data/results.json
# 在 Linux 上,添加 --user "$(id -u):$(id -g)" 以便该文件归您所有。
```
### 自行构建镜像
在仓库的克隆副本中:
```
docker build -t nodejs-portscanner .
docker run --rm nodejs-portscanner --host example.com --ports 1-1024
```
## 📦 从源码安装
```
git clone https://github.com/zuedev/nodejs-portscanner.git
cd nodejs-portscanner
npm install
```
或者全局安装:
```
npm install -g .
```
## 🚀 用法
### 基础扫描
```
node scanner.js --host 192.168.1.1 --ports 1-1024
```
### 扫描特定端口
```
node scanner.js --host example.com --ports 22,80,443,8080
```
### 扫描 UDP 端口
```
node scanner.js --host 192.168.1.1 --protocol udp --ports 53,123,161
```
UDP 是无连接的,因此对于从不回复的端口,将被报告为 `open|filtered`
(开放或被防火墙过滤),而不是 `open`。对于常见服务(DNS、NTP)会发送特定的探测包
以促使它们做出响应。
### 调整并发和超时
```
node scanner.js --host 10.0.0.5 --ports 1-65535 --concurrency 200 --timeout 1500
```
### 限制扫描速率
```
node scanner.js --host 192.168.1.1 --ports 1-1024 --rate 50
```
限制所有工作线程每秒启动的新探测数量,从而减少网络噪音和对目标的负载。默认无限制。
### 将结果导出为 JSON
```
node scanner.js --host 192.168.1.1 --ports 1-1024 --output results.json
```
### 将结果导出为 HTML 报告
```
node scanner.js --host 192.168.1.1 --ports 1-1024 --output report.html
```
格式将根据文件扩展名进行选择:`.html`(或 `.htm`)会写入一个独立且带有样式的 HTML 报告,您可以在任何浏览器中打开;任何其他扩展名则写入 JSON。Banner 文本经过了 HTML 转义,因此即使扫描了不受信任的主机,打开报告也是安全的。
## ⚙️ 选项
| 标志 | 别名 | 描述 | 默认值 |
| --------------- | ----- | ---------------------------------------------------------------- | --------- |
| `--host` | `-h` | 目标主机名或 IP 地址(必填) | — |
| `--ports` | `-p` | 端口范围或逗号分隔的列表 | `1-1024` |
| `--protocol` | `-P` | 传输协议 (`tcp` 或 `udp`) | `tcp` |
| `--concurrency` | `-c` | 最大并发连接数 | `100` |
| `--timeout` | `-t` | 连接超时时间(毫秒) | `2000` |
| `--rate` | `-r` | 每秒启动的最大新探测数 | unlimited |
| `--output` | `-o` | 将结果导出到文件(`.html` → HTML 报告,否则为 JSON) | none |
| `--help` | — | 显示帮助菜单 | — |
## 📋 示例输出
```
Scanning 192.168.1.1 (ports 1-1024)...
PORT STATE SERVICE
22/tcp open SSH (OpenSSH 8.9)
80/tcp open HTTP (nginx 1.18.0)
443/tcp open HTTPS
3306/tcp open MySQL
Scan complete: 4 open ports found in 3.2s
```
## 🛠️ 工作原理
NodeJS-PortScanner 使用 Node 内置的 `net.Socket` 尝试与目标端口建立 TCP 连接。对于每个开放的端口,它会:
1. 在配置的超时时间内建立连接。
2. 通过读取初始服务器响应数据来尝试 **banner grabbing**。
3. 将 banner 与指纹数据库进行匹配以识别服务。
并发通过连接池进行管理,以避免使目标或宿主机的文件描述符限制过载。
UDP 扫描 (`--protocol udp`) 使用 Node 的 `dgram` 模块。由于 UDP 没有握手过程,每个端口会根据目标的响应进行分类:
- 一个 **数据报回复** → `open`
- 一个 **ICMP 端口不可达** 错误 → `closed`
- 直到超时都 **保持静默** → `open|filtered`(开放或被防火墙过滤)
## 🗺️ 路线图
- [x] 带有连接池的并发 TCP 扫描
- [x] 通过 banner grabbing 进行服务指纹识别
- [x] 端口范围和列表 (`1-1024`, `80,443,8080`)
- [x] JSON 导出
- [x] 由本地 mock 服务器支持的测试套件
- [x] UDP 扫描支持
- [ ] 可配置的指纹数据库(基于 JSON)
- [ ] CIDR 范围扫描(例如 `192.168.1.0/24`)
- [x] 速率限制以减少网络噪音
- [x] HTML 报告生成
## 🧪 测试
```
npm test
```
测试使用本地 mock 服务器来验证扫描逻辑,无需进行外部网络调用。
## 📄 许可证
该项目基于 Unlicense 授权 —— 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 🙋 作者
由 [zuedev](https://github.com/zuedev) 构建,作为其实践安全学习作品集的一部分。
标签:GNU通用公共许可证, MITM代理, Node.js, Scrypt密钥派生, 插件系统, 数据可视化, 数据统计, 暗色界面, 服务指纹识别, 端口扫描, 网络工具, 自定义脚本, 请求拦截